Pino Toscano
2017-Feb-15 13:27 UTC
[Libguestfs] [PATCH v2] copy-out: new optional arguments
Add new optional argument to copy-out: 'numericowner', 'excludes', 'xattrs', 'selinux', and 'acls'. Pass them straight to tar-out, so it is possible to tweak how the files are extracted from the guest, and locally saved. --- generator/actions.ml | 37 +++++++++++++++++++++++++++++++++++-- gobject/Makefile.inc | 2 ++ lib/copy-in-out.c | 29 ++++++++++++++++++++++++++--- 3 files changed, 63 insertions(+), 5 deletions(-) diff --git a/generator/actions.ml b/generator/actions.ml index 990eacb..9015a1a 100644 --- a/generator/actions.ml +++ b/generator/actions.ml @@ -3437,8 +3437,9 @@ Wildcards cannot be used." }; { defaults with name = "copy_out"; added = (1, 29, 24); - style = RErr, [Pathname "remotepath"; String "localdir"], []; + style = RErr, [Pathname "remotepath"; String "localdir"], [OBool "numericowner"; OStringList "excludes"; OBool "xattrs"; OBool "selinux"; OBool "acls"]; visibility = VPublicNoFish; + once_had_no_optargs = true; shortdesc = "copy remote files or directories out of an image"; longdesc = "\ C<guestfs_copy_out> copies remote files or directories recursively @@ -3449,7 +3450,39 @@ To download to the current directory, use C<.> as in: C<guestfs_copy_out> /home . -Wildcards cannot be used." }; +Wildcards cannot be used. + +The other optional arguments are: + +=over 4 + +=item C<numericowner> + +If set to true, the destination file will contain UID/GID numbers +matching these in the sources, instead of using user/group names. +Note this applies only if C<remotepath> is a directory. + +=item C<excludes> + +A list of wildcards. Files are excluded if they match any of the +wildcards. Note they are used only if C<remotepath> is a directory. + +=item C<xattrs> + +If set to true, extended attributes are restored. +Note this applies only if C<remotepath> is a directory. + +=item C<selinux> + +If set to true, SELinux contexts are restored. +Note this applies only if C<remotepath> is a directory. + +=item C<acls> + +If set to true, POSIX ACLs are restored. +Note this applies only if C<remotepath> is a directory. + +=back" }; { defaults with name = "set_identifier"; added = (1, 31, 14); diff --git a/gobject/Makefile.inc b/gobject/Makefile.inc index 55a137e..76482f7 100644 --- a/gobject/Makefile.inc +++ b/gobject/Makefile.inc @@ -67,6 +67,7 @@ guestfs_gobject_headers= \ include/guestfs-gobject/optargs-copy_device_to_file.h \ include/guestfs-gobject/optargs-copy_file_to_device.h \ include/guestfs-gobject/optargs-copy_file_to_file.h \ + include/guestfs-gobject/optargs-copy_out.h \ include/guestfs-gobject/optargs-cpio_out.h \ include/guestfs-gobject/optargs-disk_create.h \ include/guestfs-gobject/optargs-download_blocks.h \ @@ -158,6 +159,7 @@ guestfs_gobject_sources= \ src/optargs-copy_device_to_file.c \ src/optargs-copy_file_to_device.c \ src/optargs-copy_file_to_file.c \ + src/optargs-copy_out.c \ src/optargs-cpio_out.c \ src/optargs-disk_create.c \ src/optargs-download_blocks.c \ diff --git a/lib/copy-in-out.c b/lib/copy-in-out.c index a4e39f8..cf2a9d6 100644 --- a/lib/copy-in-out.c +++ b/lib/copy-in-out.c @@ -131,8 +131,9 @@ child_setup (guestfs_h *g, void *data) } int -guestfs_impl_copy_out (guestfs_h *g, - const char *remotepath, const char *localdir) +guestfs_impl_copy_out_opts (guestfs_h *g, + const char *remotepath, const char *localdir, + const struct guestfs_copy_out_opts_argv *optargs) { struct stat statbuf; int r; @@ -170,6 +171,7 @@ guestfs_impl_copy_out (guestfs_h *g, struct copy_out_child_data data; char fdbuf[64]; int fd; + struct guestfs_tar_out_opts_argv tar_optargs = { .bitmask = 0 }; r = guestfs_is_dir (g, remotepath); if (r == -1) @@ -210,7 +212,28 @@ guestfs_impl_copy_out (guestfs_h *g, snprintf (fdbuf, sizeof fdbuf, "/dev/fd/%d", fd); - r = guestfs_tar_out (g, remotepath, fdbuf); + if (optargs->bitmask & GUESTFS_COPY_OUT_OPTS_NUMERICOWNER_BITMASK) { + tar_optargs.numericowner = optargs->numericowner; + tar_optargs.bitmask |= GUESTFS_TAR_OUT_OPTS_NUMERICOWNER_BITMASK; + } + if (optargs->bitmask & GUESTFS_COPY_OUT_OPTS_EXCLUDES_BITMASK) { + tar_optargs.excludes = optargs->excludes; + tar_optargs.bitmask |= GUESTFS_TAR_OUT_OPTS_EXCLUDES_BITMASK; + } + if (optargs->bitmask & GUESTFS_COPY_OUT_OPTS_XATTRS_BITMASK) { + tar_optargs.xattrs = optargs->xattrs; + tar_optargs.bitmask |= GUESTFS_TAR_OUT_OPTS_XATTRS_BITMASK; + } + if (optargs->bitmask & GUESTFS_COPY_OUT_OPTS_SELINUX_BITMASK) { + tar_optargs.selinux = optargs->selinux; + tar_optargs.bitmask |= GUESTFS_TAR_OUT_OPTS_SELINUX_BITMASK; + } + if (optargs->bitmask & GUESTFS_COPY_OUT_OPTS_ACLS_BITMASK) { + tar_optargs.acls = optargs->acls; + tar_optargs.bitmask |= GUESTFS_TAR_OUT_OPTS_ACLS_BITMASK; + } + + r = guestfs_tar_out_opts_argv (g, remotepath, fdbuf, &tar_optargs); if (close (fd) == -1) { perrorf (g, "close (tar-output subprocess)"); -- 2.9.3
Richard W.M. Jones
2017-Feb-15 15:54 UTC
Re: [Libguestfs] [PATCH v2] copy-out: new optional arguments
On Wed, Feb 15, 2017 at 02:27:03PM +0100, Pino Toscano wrote:> Add new optional argument to copy-out: 'numericowner', 'excludes', > 'xattrs', 'selinux', and 'acls'. Pass them straight to tar-out, so > it is possible to tweak how the files are extracted from the guest, > and locally saved.Can we test this somehow? The reason I ask is because I wonder if the host-side tar command also needs some flags to make it not ignore the new metadata in the tar stream? Rich.> generator/actions.ml | 37 +++++++++++++++++++++++++++++++++++-- > gobject/Makefile.inc | 2 ++ > lib/copy-in-out.c | 29 ++++++++++++++++++++++++++--- > 3 files changed, 63 insertions(+), 5 deletions(-) > > diff --git a/generator/actions.ml b/generator/actions.ml > index 990eacb..9015a1a 100644 > --- a/generator/actions.ml > +++ b/generator/actions.ml > @@ -3437,8 +3437,9 @@ Wildcards cannot be used." }; > > { defaults with > name = "copy_out"; added = (1, 29, 24); > - style = RErr, [Pathname "remotepath"; String "localdir"], []; > + style = RErr, [Pathname "remotepath"; String "localdir"], [OBool "numericowner"; OStringList "excludes"; OBool "xattrs"; OBool "selinux"; OBool "acls"]; > visibility = VPublicNoFish; > + once_had_no_optargs = true; > shortdesc = "copy remote files or directories out of an image"; > longdesc = "\ > C<guestfs_copy_out> copies remote files or directories recursively > @@ -3449,7 +3450,39 @@ To download to the current directory, use C<.> as in: > > C<guestfs_copy_out> /home . > > -Wildcards cannot be used." }; > +Wildcards cannot be used. > + > +The other optional arguments are: > + > +=over 4 > + > +=item C<numericowner> > + > +If set to true, the destination file will contain UID/GID numbers > +matching these in the sources, instead of using user/group names. > +Note this applies only if C<remotepath> is a directory. > + > +=item C<excludes> > + > +A list of wildcards. Files are excluded if they match any of the > +wildcards. Note they are used only if C<remotepath> is a directory. > + > +=item C<xattrs> > + > +If set to true, extended attributes are restored. > +Note this applies only if C<remotepath> is a directory. > + > +=item C<selinux> > + > +If set to true, SELinux contexts are restored. > +Note this applies only if C<remotepath> is a directory. > + > +=item C<acls> > + > +If set to true, POSIX ACLs are restored. > +Note this applies only if C<remotepath> is a directory. > + > +=back" }; > > { defaults with > name = "set_identifier"; added = (1, 31, 14); > diff --git a/gobject/Makefile.inc b/gobject/Makefile.inc > index 55a137e..76482f7 100644 > --- a/gobject/Makefile.inc > +++ b/gobject/Makefile.inc > @@ -67,6 +67,7 @@ guestfs_gobject_headers= \ > include/guestfs-gobject/optargs-copy_device_to_file.h \ > include/guestfs-gobject/optargs-copy_file_to_device.h \ > include/guestfs-gobject/optargs-copy_file_to_file.h \ > + include/guestfs-gobject/optargs-copy_out.h \ > include/guestfs-gobject/optargs-cpio_out.h \ > include/guestfs-gobject/optargs-disk_create.h \ > include/guestfs-gobject/optargs-download_blocks.h \ > @@ -158,6 +159,7 @@ guestfs_gobject_sources= \ > src/optargs-copy_device_to_file.c \ > src/optargs-copy_file_to_device.c \ > src/optargs-copy_file_to_file.c \ > + src/optargs-copy_out.c \ > src/optargs-cpio_out.c \ > src/optargs-disk_create.c \ > src/optargs-download_blocks.c \ > diff --git a/lib/copy-in-out.c b/lib/copy-in-out.c > index a4e39f8..cf2a9d6 100644 > --- a/lib/copy-in-out.c > +++ b/lib/copy-in-out.c > @@ -131,8 +131,9 @@ child_setup (guestfs_h *g, void *data) > } > > int > -guestfs_impl_copy_out (guestfs_h *g, > - const char *remotepath, const char *localdir) > +guestfs_impl_copy_out_opts (guestfs_h *g, > + const char *remotepath, const char *localdir, > + const struct guestfs_copy_out_opts_argv *optargs) > { > struct stat statbuf; > int r; > @@ -170,6 +171,7 @@ guestfs_impl_copy_out (guestfs_h *g, > struct copy_out_child_data data; > char fdbuf[64]; > int fd; > + struct guestfs_tar_out_opts_argv tar_optargs = { .bitmask = 0 }; > > r = guestfs_is_dir (g, remotepath); > if (r == -1) > @@ -210,7 +212,28 @@ guestfs_impl_copy_out (guestfs_h *g, > > snprintf (fdbuf, sizeof fdbuf, "/dev/fd/%d", fd); > > - r = guestfs_tar_out (g, remotepath, fdbuf); > + if (optargs->bitmask & GUESTFS_COPY_OUT_OPTS_NUMERICOWNER_BITMASK) { > + tar_optargs.numericowner = optargs->numericowner; > + tar_optargs.bitmask |= GUESTFS_TAR_OUT_OPTS_NUMERICOWNER_BITMASK; > + } > + if (optargs->bitmask & GUESTFS_COPY_OUT_OPTS_EXCLUDES_BITMASK) { > + tar_optargs.excludes = optargs->excludes; > + tar_optargs.bitmask |= GUESTFS_TAR_OUT_OPTS_EXCLUDES_BITMASK; > + } > + if (optargs->bitmask & GUESTFS_COPY_OUT_OPTS_XATTRS_BITMASK) { > + tar_optargs.xattrs = optargs->xattrs; > + tar_optargs.bitmask |= GUESTFS_TAR_OUT_OPTS_XATTRS_BITMASK; > + } > + if (optargs->bitmask & GUESTFS_COPY_OUT_OPTS_SELINUX_BITMASK) { > + tar_optargs.selinux = optargs->selinux; > + tar_optargs.bitmask |= GUESTFS_TAR_OUT_OPTS_SELINUX_BITMASK; > + } > + if (optargs->bitmask & GUESTFS_COPY_OUT_OPTS_ACLS_BITMASK) { > + tar_optargs.acls = optargs->acls; > + tar_optargs.bitmask |= GUESTFS_TAR_OUT_OPTS_ACLS_BITMASK; > + } > + > + r = guestfs_tar_out_opts_argv (g, remotepath, fdbuf, &tar_optargs); > > if (close (fd) == -1) { > perrorf (g, "close (tar-output subprocess)"); > -- > 2.9.3 > > _______________________________________________ > Libguestfs mailing list > Libguestfs@redhat.com > https://www.redhat.com/mailman/listinfo/libguestfs-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-top is 'top' for virtual machines. Tiny program with many powerful monitoring features, net stats, disk stats, logging, etc. http://people.redhat.com/~rjones/virt-top