summaryrefslogtreecommitdiffstats
path: root/perl
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2009-04-09 13:19:38 +0100
committerRichard Jones <rjones@redhat.com>2009-04-09 13:19:38 +0100
commite7eca50046e9a69dac27c0bee832af0a3014e02c (patch)
tree0d3adfb16768d7068e180dba7cc49c706ece38f3 /perl
parenta2e1d51acda406fd4193f121ac9f879e60cf4302 (diff)
downloadlibguestfs-e7eca50046e9a69dac27c0bee832af0a3014e02c.tar.gz
libguestfs-e7eca50046e9a69dac27c0bee832af0a3014e02c.tar.xz
libguestfs-e7eca50046e9a69dac27c0bee832af0a3014e02c.zip
Added Augeas support.
Diffstat (limited to 'perl')
-rw-r--r--perl/Guestfs.xs138
-rw-r--r--perl/lib/Sys/Guestfs.pm128
2 files changed, 266 insertions, 0 deletions
diff --git a/perl/Guestfs.xs b/perl/Guestfs.xs
index 3cc47750..99eb3190 100644
--- a/perl/Guestfs.xs
+++ b/perl/Guestfs.xs
@@ -485,3 +485,141 @@ PREINIT:
}
free (lines);
+void
+aug_init (g, root, flags)
+ guestfs_h *g;
+ char *root;
+ int flags;
+ PPCODE:
+ if (guestfs_aug_init (g, root, flags) == -1)
+ croak ("aug_init: %s", last_error);
+
+void
+aug_close (g)
+ guestfs_h *g;
+ PPCODE:
+ if (guestfs_aug_close (g) == -1)
+ croak ("aug_close: %s", last_error);
+
+SV *
+aug_defvar (g, name, expr)
+ guestfs_h *g;
+ char *name;
+ char *expr;
+PREINIT:
+ int nrnodes;
+ CODE:
+ nrnodes = guestfs_aug_defvar (g, name, expr);
+ if (nrnodes == -1)
+ croak ("aug_defvar: %s", last_error);
+ RETVAL = newSViv (nrnodes);
+ OUTPUT:
+ RETVAL
+
+void
+aug_defnode (g, name, expr, val)
+ guestfs_h *g;
+ char *name;
+ char *expr;
+ char *val;
+PREINIT:
+ struct guestfs_int_bool *r;
+ PPCODE:
+ r = guestfs_aug_defnode (g, name, expr, val);
+ if (r == NULL)
+ croak ("aug_defnode: %s", last_error);
+ EXTEND (SP, 2);
+ PUSHs (sv_2mortal (newSViv (r->i)));
+ PUSHs (sv_2mortal (newSViv (r->b)));
+ guestfs_free_int_bool (r);
+
+SV *
+aug_get (g, path)
+ guestfs_h *g;
+ char *path;
+PREINIT:
+ char *val;
+ CODE:
+ val = guestfs_aug_get (g, path);
+ if (val == NULL)
+ croak ("aug_get: %s", last_error);
+ RETVAL = newSVpv (val, 0);
+ free (val);
+ OUTPUT:
+ RETVAL
+
+void
+aug_set (g, path, val)
+ guestfs_h *g;
+ char *path;
+ char *val;
+ PPCODE:
+ if (guestfs_aug_set (g, path, val) == -1)
+ croak ("aug_set: %s", last_error);
+
+void
+aug_insert (g, path, label, before)
+ guestfs_h *g;
+ char *path;
+ char *label;
+ int before;
+ PPCODE:
+ if (guestfs_aug_insert (g, path, label, before) == -1)
+ croak ("aug_insert: %s", last_error);
+
+SV *
+aug_rm (g, path)
+ guestfs_h *g;
+ char *path;
+PREINIT:
+ int nrnodes;
+ CODE:
+ nrnodes = guestfs_aug_rm (g, path);
+ if (nrnodes == -1)
+ croak ("aug_rm: %s", last_error);
+ RETVAL = newSViv (nrnodes);
+ OUTPUT:
+ RETVAL
+
+void
+aug_mv (g, src, dest)
+ guestfs_h *g;
+ char *src;
+ char *dest;
+ PPCODE:
+ if (guestfs_aug_mv (g, src, dest) == -1)
+ croak ("aug_mv: %s", last_error);
+
+void
+aug_match (g, path)
+ guestfs_h *g;
+ char *path;
+PREINIT:
+ char **matches;
+ int i, n;
+ PPCODE:
+ matches = guestfs_aug_match (g, path);
+ if (matches == NULL)
+ croak ("aug_match: %s", last_error);
+ for (n = 0; matches[n] != NULL; ++n) /**/;
+ EXTEND (SP, n);
+ for (i = 0; i < n; ++i) {
+ PUSHs (sv_2mortal (newSVpv (matches[i], 0)));
+ free (matches[i]);
+ }
+ free (matches);
+
+void
+aug_save (g)
+ guestfs_h *g;
+ PPCODE:
+ if (guestfs_aug_save (g) == -1)
+ croak ("aug_save: %s", last_error);
+
+void
+aug_load (g)
+ guestfs_h *g;
+ PPCODE:
+ if (guestfs_aug_load (g) == -1)
+ croak ("aug_load: %s", last_error);
+
diff --git a/perl/lib/Sys/Guestfs.pm b/perl/lib/Sys/Guestfs.pm
index 7706ae40..29414662 100644
--- a/perl/lib/Sys/Guestfs.pm
+++ b/perl/lib/Sys/Guestfs.pm
@@ -112,6 +112,134 @@ image).
This is equivalent to the qemu parameter C<-drive file=filename>.
+=item $h->aug_close ();
+
+Close the current Augeas handle and free up any resources
+used by it. After calling this, you have to call
+C<$h-E<gt>aug_init> again before you can use any other
+Augeas functions.
+
+=item ($nrnodes, $created) = $h->aug_defnode (name, expr, val);
+
+Defines a variable C<name> whose value is the result of
+evaluating C<expr>.
+
+If C<expr> evaluates to an empty nodeset, a node is created,
+equivalent to calling C<$h-E<gt>aug_set> C<expr>, C<value>.
+C<name> will be the nodeset containing that single node.
+
+On success this returns a pair containing the
+number of nodes in the nodeset, and a boolean flag
+if a node was created.
+
+=item $nrnodes = $h->aug_defvar (name, expr);
+
+Defines an Augeas variable C<name> whose value is the result
+of evaluating C<expr>. If C<expr> is NULL, then C<name> is
+undefined.
+
+On success this returns the number of nodes in C<expr>, or
+C<0> if C<expr> evaluates to something which is not a nodeset.
+
+=item $val = $h->aug_get (path);
+
+Look up the value associated with C<path>. If C<path>
+matches exactly one node, the C<value> is returned.
+
+=item $h->aug_init (root, flags);
+
+Create a new Augeas handle for editing configuration files.
+If there was any previous Augeas handle associated with this
+guestfs session, then it is closed.
+
+You must call this before using any other C<$h-E<gt>aug_*>
+commands.
+
+C<root> is the filesystem root. C<root> must not be NULL,
+use C</> instead.
+
+The flags are the same as the flags defined in
+E<lt>augeas.hE<gt>, the logical I<or> of the following
+integers:
+
+=over 4
+
+=item 1 C<AUG_SAVE_BACKUP>
+
+Keep the original file with a C<.augsave> extension.
+
+=item 2 C<AUG_SAVE_NEWFILE>
+
+Save changes into a file with extension C<.augnew>, and
+do not overwrite original. Overrides C<AUG_SAVE_BACKUP>.
+
+=item 4 C<AUG_TYPE_CHECK>
+
+Typecheck lenses (can be expensive).
+
+=item 8 C<AUG_NO_STDINC>
+
+Do not use standard load path for modules.
+
+=item 16 C<AUG_SAVE_NOOP>
+
+Make save a no-op, just record what would have been changed.
+
+=item 32 C<AUG_NO_LOAD>
+
+Do not load the tree in C<$h-E<gt>aug_init>.
+
+=back
+
+To close the handle, you can call C<$h-E<gt>aug_close>.
+
+To find out more about Augeas, see L<http://augeas.net/>.
+
+=item $h->aug_insert (path, label, before);
+
+Create a new sibling C<label> for C<path>, inserting it into
+the tree before or after C<path> (depending on the boolean
+flag C<before>).
+
+C<path> must match exactly one existing node in the tree, and
+C<label> must be a label, ie. not contain C</>, C<*> or end
+with a bracketed index C<[N]>.
+
+=item $h->aug_load ();
+
+Load files into the tree.
+
+See C<aug_load> in the Augeas documentation for the full gory
+details.
+
+=item @matches = $h->aug_match (path);
+
+Returns a list of paths which match the path expression C<path>.
+The returned paths are sufficiently qualified so that they match
+exactly one node in the current tree.
+
+=item $h->aug_mv (src, dest);
+
+Move the node C<src> to C<dest>. C<src> must match exactly
+one node. C<dest> is overwritten if it exists.
+
+=item $nrnodes = $h->aug_rm (path);
+
+Remove C<path> and all of its children.
+
+On success this returns the number of entries which were removed.
+
+=item $h->aug_save ();
+
+This writes all pending changes to disk.
+
+The flags which were passed to C<$h-E<gt>aug_init> affect exactly
+how files are saved.
+
+=item $h->aug_set (path, val);
+
+Set the value associated with C<path> to C<value>.
+
=item $content = $h->cat (path);
Return the contents of the file named C<path>.