Hello Augeas experts,

 

this issue was mentioned in a previous mail thread on this list (see attached 
final mail) and I've run into it again: Augeas seems to be quite strict about 
empty files (as opposed to non-existing files).

 

I have a lens defined like this 'let lns = properties? . ( filler | domain )*'. 
The actual meaning of the sub-lenses is not important right now, since per 
regular expression this should successfully match the void. It indeed does 
create new files, but it fails to update empty files and this is the error 
message I get:

 

"""

[root ~]# >/etc/dcache/layouts/f01-151-109-e.conf

[root ~]# augtool

augtool> print /files/etc/dcache/layouts/f01-151-109-e.conf

/files/etc/dcache/layouts/f01-151-109-e.conf

augtool> set 
/files/etc/dcache/layouts/f01-151-109-e.conf/properties/dcache.java.memory.heap 
2g

augtool> print /files/etc/dcache/layouts/f01-151-109-e.conf

/files/etc/dcache/layouts/f01-151-109-e.conf

/files/etc/dcache/layouts/f01-151-109-e.conf/properties

/files/etc/dcache/layouts/f01-151-109-e.conf/properties/dcache.java.memory.heap 
= "2g"

augtool> save

error: Failed to execute command

saving failed (run 'errors' for details)

augtool> errors

Error in /etc/dcache/layouts/f01-151-109-e.conf (put_failed)

  Failed to match

        { /properties/ }?

(    { /#comment/ = /[^\001-\004\t\n\r ][^\001-\004\n]*[^\001-\004\t\n\r 
]|[^\001-\004\t\n\r ]/ }

      | { }

      | { /domain/ = /[$.0-9A-Z_a-{}-]+/ })*

  with tree

    {  } { "properties" }

  Lens: /var/lib/puppet/lib/augeas/lenses/dcachelayout.aug:29.12-.46:

"""

 

For some reason, there is an empty node before the properties node, which 
failes the put direction. For that the lens needs to be written like…

 

let lns = ( properties? . ( filler | domain )* )?

 

As far as regular expressions go, there is no effective change here, right? Yet 
for Augeas this clearly seems to make a difference. Can someone maybe explain 
this to me?

 

Thank you for your time,

Xavier.

 

 

****

Karlsruher Institute of Technology (KIT)

Steinbuch Centre for Computing (SCC)

 

B. Sc. Xavier Mol

GridKa Storage Administrator and Support Manager

 

Hermann-von-Helmholtz-Platz 1

Geb. 449

76344 Eggenstein-Leopoldshafen

Phone: +49 721 608 23041

Email:  <mailto:xavier....@kit.edu> xavier....@kit.edu

 <http://www.kit.edu/> www.kit.edu

KIT - University of the State of Baden-Württemberg and National Large-scale 
Research Center of the Helmholtz Association

"Since 2010, the KIT has been certified as a family-friendly university."

****

 

 

--- Begin Message ---
Hi Raphael.



> Your file isn't empty, it contains a single newline, so your lens should be:

> module Word = let lns = [ seq "words" . store Rx.word . Util.eol ] | 
> Util.empty

I still found a way to create an error with that lens! J



1) No file to begin with – now fixed.



[root ~]# \rm /tmp/word

[root ~]# augtool -t "Word.lns incl /tmp/word"

augtool> set /files/tmp/word/1 eggs

augtool> save

Saved 1 file(s)





2) Valid file with content exists – worked before already.



[root ~]# echo spam >/tmp/word

[root@f01-151-116 ~]# augtool -t "Word.lns incl /tmp/word"

augtool> print /files/tmp/word

/files/tmp/word

/files/tmp/word/1 = "spam"

augtool> set /files/tmp/word/1 eggs

augtool> save

Saved 1 file(s)





3) Starting with an empty file – fails differently now and wasn't tested 
before, since it should not be allowed at all.



[root ~]# \rm /tmp/word

[root ~]# touch /tmp/word

[root ~]# augtool -t "Word.lns incl /tmp/word"

augtool> errors

  (no errors)

augtool> print /files/tmp/word

/files/tmp/word

augtool> set /files/tmp/word/1 eggs

augtool> save

error: Failed to execute command

saving failed (run 'errors' for details)

augtool> errors

Error in /tmp/word (put_failed)

  None of the alternatives in the union match

  Lens: /usr/share/augeas/lenses/word.aug:4.12-.67:





According to your statement, "Augeas needs to be able to parse the existing 
content before modifiying it". Since there were no errors 
after augtool had started, I assume that is true (zero content parsed 
successfully thanks to Util.empty). But still, I cannot alter 
the empty file?! Fun fact about this, Augeas can now create empty files, which 
it is unable to alter in the next session. It still can 
set new content within the current section.



[root ~]# echo spam >/tmp/word

[root ~]# augtool -t "Word.lns incl /tmp/word"

augtool> print /files/tmp/word

/files/tmp/word

/files/tmp/word/1 = "spam"

augtool> rm /files/tmp/word/1

rm : /files/tmp/word/1 1

augtool> save

Saved 1 file(s)

augtool> set /files/tmp/word/1 eggs

augtool> save

Saved 1 file(s)

augtool> print /files/tmp/word

/files/tmp/word

/files/tmp/word/1 = "eggs"





Ciao,

Xavier.



From: Raphaël Pinson [mailto:raphael.pin...@camptocamp.com]
Sent: Tuesday, December 22, 2015 4:19 PM
To: Mol, Xavier (SCC)
Cc: augeas-devel@redhat.com
Subject: Re: [augeas-devel] Why does Augeas fail to create new files?







On Tue, Dec 22, 2015 at 4:08 PM, Mol, Xavier (SCC) <xavier....@kit.edu> wrote:

Hi all,

I have boiled this problem down as much as possible, ie. down to a module that 
manages a file with a single word in it (I've learned 
some more notable things about that, which are listed in PS):

module Word = let lns = [ seq "words" . store Rx.word . Util.eol]


When using this module to create new files, then we get an error:

[root ~]# ls /tmp/word
ls: cannot access /tmp/word: No such file or directory
[root ~]# augtool -t "Word.lns incl /tmp/word"
augtool> set /files/tmp/word/1 spam
augtool> save
error: Failed to execute command
saving failed (run 'errors' for details)
augtool> errors
Error in /tmp/word:1.0 (parse_skel_failed)
  Input string does not match at all
  Lens: /usr/share/augeas/lenses/word.aug:4.12-.54:





Yes, that is correct. Augeas needs to be able to parse the existing content 
before modifying it.







When there already is a valid file, the module works fine:

[root ~]# echo spam >/tmp/word
[root ~]# augtool -t "Word.lns incl /tmp/word"
augtool> print /files/tmp/word
/files/tmp/word
/files/tmp/word/1 = "spam"
augtool> set /files/tmp/word/1 eggs
augtool> save
Saved 1 file(s)
[root ~]# cat /tmp/word
eggs


Honestly, to me this looks like a bug. Even making this sole lens optional, to 
make an empty file acceptable, doesn't make the module 
functional (albeit with different error message).

module Word = let lns = [ seq "words" . store Rx.word . Util.eol ]?

[root ~]# augtool -t "Word.lns incl /tmp/word"
augtool> print /files/tmp/word
augtool> set /files/tmp/word/1 spam
augtool> save
error: Failed to execute command
saving failed (run 'errors' for details)
augtool> errors
Error in /tmp/word:1.0 (parse_skel_failed)
  parse can not process entire input
  Lens: /usr/share/augeas/lenses/word.aug:4.12-.55:











PS)
* There must be a label for this node (either seq, key or label), or the Augeas 
tree doesn't keep the value and it cannot be altered, 
too.





You can technically have label-less nodes, but I wouldn't recommend it indeed.





Raphaël





* The lens must match eol, even though the file might not have one - in that 
situation, end-of-file is matched instead. 'let lns = [ 
seq "words" . store Rx.word ]' always results in parsing errors ("Get did not 
match entire input"), even if files are created like 
'echo -n word >file'. Though if there is a proper line break before the end of 
file (echo word >file), the outcome is identical.


> -----Original Message-----
> From: Mol, Xavier (SCC)
> Sent: Thursday, December 17, 2015 1:36 PM
> To: Mol, Xavier (SCC); augeas-devel@redhat.com
> Subject: RE: Why does Augeas fail to create new files?
>
> > ---> Creating an empty node works fine, though this should actually fail in 
> > my opinion (an empty file is invalid according to the 
> > lens).
> Sorry, I have to correct this. The attached lens definition does allow for an 
> empty file. However, setting lns like this:
>
> let lns = ( empty | comment )* . version . ( empty | comment | rule )*
>
> Hence, requiring at least a line with "version" in it, doesn't change the 
> reported behaviour at all for me.
>
> Ciao,
> Xavier.
>
> > -----Original Message-----
> > From: augeas-devel-boun...@redhat.com 
> > [mailto:augeas-devel-boun...@redhat.com] On Behalf Of Mol, Xavier (SCC)
> > Sent: Thursday, December 17, 2015 1:33 PM
> > To: augeas-devel@redhat.com
> > Subject: [augeas-devel] Why does Augeas fail to create new files?
> >
> > Hello Augeas experts,
> >
> > attached you can find the source of a custom lens for Augeas and a file 
> > with get and put unit tests; either file is evaluated with 
> > augparse
> > successfully. My question is, why can I not create a new file from scratch 
> > with that lens, while editing existing files works just 
> > fine?
> >
> > In order to test the steps in between, I used augeas-1.4 and augtool:
> >
> > [root ~]# augtool --version
> > augtool 1.4.0 <http://augeas.net/>
> > Copyright (C) 2007-2011 David Lutterkort
> > License LGPLv2+: GNU LGPL version 2.1 or later
> >                  <http://www.gnu.org/licenses/lgpl-2.1.html>
> > This is free software: you are free to change and redistribute it.
> > There is NO WARRANTY, to the extent permitted by law.
> >
> > Written by David Lutterkort
> >
> > [root ~]# augtool
> > augtool> print /augeas/load/StorageAuthzdb/*[label() != "excl"]
> > /augeas/load/StorageAuthzdb/lens = "@StorageAuthzdb"
> > /augeas/load/StorageAuthzdb/incl = "/etc/grid-security/storage-authzdb"
> >
> > ---> Currently, the node included with that lens doesn't exist.
> > augtool> ls /files/etc/grid-security/storage-authzdb
> > augtool> dump-xml /files/etc/grid-security/storage-authzdb
> > <augeas match="/files/etc/grid-security/storage-authzdb"/>
> >
> > ---> Creating an empty node works fine, though this should actually fail in 
> > my opinion (an empty file is invalid according to the 
> > lens).
> > augtool> touch /files/etc/grid-security/storage-authzdb
> > augtool> save
> > Saved 1 file(s)
> > augtool> ls /files/etc/grid-security
> > storage-authzdb = (none)
> > augtool> dump-xml /files/etc/grid-security/storage-authzdb
> > <augeas match="/files/etc/grid-security/storage-authzdb">
> >   <node label="storage-authzdb" 
> > path="/files/etc/grid-security/storage-authzdb"/>
> > </augeas>
> >
> > ---> Saving the minimal change required for a valid storage-authzdb file 
> > fails.
> > augtool> set /files/etc/grid-security/storage-authzdb/version "2.1"
> > augtool> dump-xml /files/etc/grid-security/storage-authzdb
> > <augeas match="/files/etc/grid-security/storage-authzdb">
> >   <node label="storage-authzdb" 
> > path="/files/etc/grid-security/storage-authzdb">
> >     <node label="version">
> >       <value>2.1</value>
> >     </node>
> >   </node>
> > </augeas>
> > augtool> save
> > error: Failed to execute command
> > saving failed (run 'errors' for details)
> > augtool> errors
> > Error in /etc/grid-security/storage-authzdb:1.0 (parse_skel_failed)
> >   parse can not process entire input
> >   Lens: /usr/share/augeas/lenses/storageauthzdb.aug:34.12-.75:
> >
> >
> > ---> Starting over...
> > [root ~]# rm /etc/grid-security/storage-authzdb
> > rm: remove regular empty file `/etc/grid-security/storage-authzdb'? y
> > [root ~]# augtool
> >
> > ---> Create the desired tree
> > augtool> set /files/etc/grid-security/storage-authzdb/version "2.1"
> >
> > ---> Review what the lens would put as a string, which matches what I 
> > expect.
> > augtool> set /in ""
> > augtool> retrieve StorageAuthzdb.lns /in 
> > /files/etc/grid-security/storage-authzdb /out
> > augtool> print /out
> > /out = "version 2.1\n"
> >
> > ---> Still saving that output fails
> > augtool> save
> > error: Failed to execute command
> > saving failed (run 'errors' for details)
> > augtool> errors
> > Error in /etc/grid-security/storage-authzdb:1.0 (parse_skel_failed)
> >   parse can not process entire input
> >   Lens: /usr/share/augeas/lenses/storageauthzdb.aug:34.12-.75:
> >
> > ---> Though when the file exists before augtool is used, everything seems 
> > to work.
> > [root ~]# echo version 2.1 >/etc/grid-security/storage-authzdb
> > [root ~]# augtool
> > augtool> ls /files/etc/grid-security/storage-authzdb
> > version = 2.1
> > augtool> dump-xml /files/etc/grid-security/storage-authzdb
> > <augeas match="/files/etc/grid-security/storage-authzdb">
> >   <node label="storage-authzdb" 
> > path="/files/etc/grid-security/storage-authzdb">
> >     <node label="version">
> >       <value>2.1</value>
> >     </node>
> >   </node>
> > </augeas>
> > augtool> set /files/etc/grid-security/storage-authzdb/version "2.2"
> > augtool> save
> > Saved 1 file(s)
> > [root ~]# cat /etc/grid-security/storage-authzdb
> > version 2.2
> >
> >
> >
> > What am I doing wrong here?
> >
> > Thank you for your time,
> > Xavier.
> >
> >
> > ****
> > Karlsruher Institute of Technology (KIT)
> > Steinbuch Centre for Computing (SCC)
> >
> > B. Sc. Xavier Mol
> > GridKa Storage Administrator and Support Manager
> >
> > Hermann-von-Helmholtz-Platz 1
> > Geb. 449
> > 76344 Eggenstein-Leopoldshafen
> > Phone: +49 721 608 23041
> > Email: xavier....@kit.edu
> > www.kit.edu
> > KIT - University of the State of Baden-Württemberg and National Large-scale 
> > Research Center of the Helmholtz Association
> > "Since 2010, the KIT has been certified as a family-friendly university."
> > ****


_______________________________________________
augeas-devel mailing list
augeas-devel@redhat.com
https://www.redhat.com/mailman/listinfo/augeas-devel







-- 

Raphaël Pinson

Infrastructure Developer & Training Leader

+33 458 482 013



Camptocamp France
Savoie Technolac
BP 352
48, avenue du Lac du Bourget
73372 Le Bourget du Lac, Cedex
www.camptocamp.com

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
augeas-devel mailing list
augeas-devel@redhat.com
https://www.redhat.com/mailman/listinfo/augeas-devel

--- End Message ---

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
augeas-devel mailing list
augeas-devel@redhat.com
https://www.redhat.com/mailman/listinfo/augeas-devel

Reply via email to