Are you tired of ugly
sed and awk one liners?
or of using tons of
different parsing libraries
or common::line tricks?
You have heard that files
are made from trees...
/etc/hosts -> /files/etc/hosts
$ augtool print /files/etc/hosts
/files/etc/hosts
/files/etc/hosts/1
/files/etc/hosts/1/ipaddr = "127.0.0.1"
/files/etc/hosts/1/canonical = "localhost"
Access Cron Host_Conf
Aliases Crypttab Hostname
Anacron debctrl Hosts_Access
Approx Desktop IniFile
AptConf Dhcpd Inputrc
Automaster Dpkg Iptables
Automounter Exports Kdump
BackupPCHosts FAI_DiskConfig Keepalived
cgconfig Fonts Keepalived
cgrules Fuse Login_defs
Channels Grub Mke2fs
...
Build Sep Simplelines
IniFile Shellvars Simplevars
Rx Shellvars_list Util
$ augtool
augtool> ls /
augeas/ = (none)
files/ = (none)
augtool> print /files/etc/passwd/root/
/files/etc/passwd/root
/files/etc/passwd/root/password = "x"
/files/etc/passwd/root/uid = "0"
/files/etc/passwd/root/gid = "0"
/files/etc/passwd/root/name = "root"
/files/etc/passwd/root/home = "/root"
/files/etc/passwd/root/shell = "/bin/bash"
augtool> print /files/etc/passwd/*[uid='0'][1]
/files/etc/passwd/root
/files/etc/passwd/root/password = "x"
/files/etc/passwd/root/uid = "0"
/files/etc/passwd/root/gid = "0"
/files/etc/passwd/root/name = "root"
/files/etc/passwd/root/home = "/root"
/files/etc/passwd/root/shell = "/bin/bash"
$ getent passwd root
root:x:0:0:root:/root:/bin/bash
$ augtool
augtool> set /files/etc/passwd/*[uid='0']/shell /bin/sh
augtool> match /files/etc/passwd/*[uid='0']/shell
/files/etc/passwd/root/shell = "/bin/sh"
augtool> save
Saved 1 file(s)
augtool> exit
$ getent passwd root
root:x:0:0:root:/root:/bin/sh
augeas{ "export foo" :
context => "/files/etc/exports",
changes => [
"set dir[. = '/foo'] /foo",
"set dir[. = '/foo']/client weeble",
"set dir[. = '/foo']/client/option[1] ro",
"set dir[. = '/foo']/client/option[2] all_squash",
],
}
define kmod::generic(
$type, $module, $ensure=present,
$command='', $file='/etc/modprobe.d/modprobe.conf'
) {
augeas {"${type} module ${module}":
context => "/files${file}",
changes => [
"set ${type}[. = '${module}'] ${module}",
"set ${type}[. = '${module}']/command '${command}'",
],
}
}
$ mco augeas match /files/etc/passwd/rpinson/shell
* [ ======================================> ] 196 / 196
...
wrk1
saja-map-dev
/files/etc/passwd/rpinson/shell = /bin/bash
wrk3
wrk4
/files/etc/passwd/rpinson/shell = /bin/bash
...
require 'augeas'
aug = Augeas.open
if aug.match('/augeas/load/'+lens).length > 0
aug.set('/augeas/load/'+lens+'/incl[last()+1]', path)
else
aug.set('/augeas/load/'+lens+'/lens', lens+'.lns')
end
Facter.add(:augeasversion) do setcode do
begin
require 'augeas'
aug = Augeas::open('/', nil, Augeas::NO_MODL_AUTOLOAD)
ver = aug.get('/augeas/version')
aug.close
ver
rescue Exception
Facter.debug('ruby-augeas not available')
end
end
end
augeasversion fact
def ip
aug = nil
path = "/files#{self.class.file(resource)}"
begin
aug = self.class.augopen(resource)
aug.get("#{path}/*[canonical =
'#{resource[:name]}']/ipaddr")
ensure
aug.close if aug
end
end
augtool> print /augeas//error
/augeas/files/etc/mke2fs.conf/error = "parse_failed"
/augeas/files/etc/mke2fs.conf/error/pos = "82"
/augeas/files/etc/mke2fs.conf/error/line = "3"
/augeas/files/etc/mke2fs.conf/error/char = "0"
/augeas/files/etc/mke2fs.conf/error/lens = \
"/usr/share/augeas/lenses/dist/mke2fs.aug:132.10-.49:"
/augeas/files/etc/mke2fs.conf/error/message = \
"Get did not match entire input"
Use a spacebar or arrow keys to navigate