2

I am using augeas to manipulate XML on some machines. Whereas creating new nodes and also setting a bunch of attributes worked like a charm I'm biting my nails of adding a simple attribute to an XML file. XML looks like the following:

<?xml version="1.0"?>
<Context>
   <WatchedResource></WatchedResource>
</Context>

I'm no just trying to add allowLinking="true" to the Context root node via

set /files/path/to/my/file.xml/Context/#attribute/allowLinking "true"

Which is unfortunately always failing with

/error = "put_failed"
/error/path = "/files/path/to/my/file.xml/Context"
/error/lens = "/usr/share/augeas/lenses/dist/xml.aug:134.10-.73:"
/error/message = "Failed to match \n    { /#attribute/ }?({ /#text/ …

I'm using puppet opensource 3.4.2 with augeas 1.0.0.

Any suggestion what I'm doing wrong?

Deduplicator
  • 44,692
  • 7
  • 66
  • 118
daniel.eichten
  • 2,535
  • 19
  • 26

1 Answers1

3

Order matters in the Augeas tree. In that case, XML node attributes need to be set before the #text node and the child nodes.

So what you need is:

ins #attribute before /files/test.xml/Context/#text
set /files/test.xml/Context/#attribute/allowLinking true

Note that this change is not idempotent, since insert is not an idempotent operation.

On Puppet, you could use onlyif to make this idempotent.

raphink
  • 3,625
  • 1
  • 28
  • 39
  • Thanks! Works like a charm. Now I only have to take care of the cases where there is no #text node or an already existent #attribute. ;-) – daniel.eichten Jan 23 '14 at 10:49
  • Indeed. For complex cases, you might want to write a type and an Augeas-based provider using AugeasProviders (see augeasproviders.com). – raphink Jan 23 '14 at 11:08