[Libguestfs] [PATCH v2] copy-out: new optional arguments

Richard W.M. Jones rjones at redhat.com
Wed Feb 15 15:54:38 UTC 2017


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 at 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




More information about the Libguestfs mailing list