[augeas-devel] Determine which files to load dynamically (ticket #42)
David Lutterkort
lutter at redhat.com
Wed Mar 18 23:04:49 UTC 2009
This series of patches addresses a oft-requested feature: determining what
files to load into the tree at runtime, instead of hardcoding it in the
.aug modules.
The implementation now exposes the transforms that were marked for autoload
in modules in the tree underneath /augeas/load. When Augeas starts up, it
creates entries that look like
/augeas/load
Hosts
lens = Hosts.lns
incl = /etc/hosts
Pam
lens = Pam.lns
incl = /etc/pam.d/*
excl = *~
...
IOW, each transform is represented as a subtree with exactly one 'lens'
child, whose value is the fully qualified name of a lens[1], and any number
of incl and excl nodes, whose values are globs. A file is processed by that
lens if it matches one of the incl globs and none of the excl globs[2]. The
name of the transform node (Hosts, Pam above) carries no meaning at all;
aug_init uses the name of the module in which the transform is contained.
Two additional chanegs make this all nice to work with: (1) a new API call
aug_load which loads files according to what's in /augeas/load right now
and (2) a new flag for aug_init to keep it from loading any files by
default. So, if you only want to load /etc/hosts, you can do something like
aug = aug_init(root, loadpath, AUG_NO_LOAD);
aug_rm(aug, "/augeas/load/*[label() != 'Hosts']")
aug_load(aug)
and you'll never suck in all 10k lines of /etc/services ;)
One thing I am not entirely sold on is what aug_load should consider as a
failure. For now, it only returns -1 if something truly catastrophic
happened, e.g. allocation failure. Most other errors are reported by
putting an 'error' node somewhere underneath /augeas, and aug_load returns
0. That means that to check whether your load succeeded completely, you'll
need to do
r = aug_load(aug);
if (r < 0 || aug_match(aug, "/augeas//error", NULL) != 0) {
report_error ....
}
feedback and opinions on the usability of all this would be much appreciated,
David
[1] Or the special notation @Module to say 'take the lens of the transform
marked for autoload in Module', but that's mostly only there because
the lens for a transform does not need to have a name, as in 'transform
(l1|l2) filter'
[2] Augeas should really check all these globs and make sure that at most
one lens matches any given file name.
More information about the augeas-devel
mailing list