[Libguestfs] [PATCH] customize: Add --uninstall operation.

Richard W.M. Jones rjones at redhat.com
Tue Jun 7 09:29:01 UTC 2016


---
 customize/customize_run.ml | 30 ++++++++++++++++++++++++++++++
 generator/customize.ml     | 17 +++++++++++++++--
 2 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/customize/customize_run.ml b/customize/customize_run.ml
index c9d9d7d..b2506d1 100644
--- a/customize/customize_run.ml
+++ b/customize/customize_run.ml
@@ -151,6 +151,31 @@ exec >>%s 2>&1
     | pm ->
       error_unimplemented_package_manager (s_"--update") pm
 
+  and guest_uninstall_command packages =
+    let quoted_args = String.concat " " (List.map quote packages) in
+    match g#inspect_get_package_management root with
+    | "apk" -> sprintf "apk del %s" quoted_args
+    | "apt" ->
+      (* http://unix.stackexchange.com/questions/22820 *)
+      sprintf "
+        export DEBIAN_FRONTEND=noninteractive
+        apt_opts='-q -y -o Dpkg::Options::=--force-confnew'
+        apt-get $apt_opts update
+        apt-get $apt_opts remove %s
+      " quoted_args
+    | "dnf" ->    sprintf "dnf -y remove %s" quoted_args
+    | "pisi" ->   sprintf "pisi rm %s" quoted_args
+    | "pacman" -> sprintf "pacman -R %s" quoted_args
+    | "urpmi" ->  sprintf "urpme %s" quoted_args
+    | "xbps" ->   sprintf "xbps-remove -Sy %s" quoted_args
+    | "yum" ->    sprintf "yum -y remove %s" quoted_args
+    | "zypper" -> sprintf "zypper -n rm -l %s" quoted_args
+
+    | "unknown" ->
+      error_unknown_package_manager (s_"--uninstall")
+    | pm ->
+      error_unimplemented_package_manager (s_"--uninstall") pm
+
   (* Windows has package_management == "unknown". *)
   and error_unknown_package_manager flag =
     error (f_"cannot use '%s' because no package manager has been detected for this guest OS.\n\nIf this guest OS is a common one with ordinary package management then this may have been caused by a failure of libguestfs inspection.\n\nFor OSes such as Windows that lack package management, this is not possible.  Try using one of the '--firstboot*' flags instead (described in the manual).") flag
@@ -330,6 +355,11 @@ exec >>%s 2>&1
       message (f_"Running touch: %s") path;
       g#touch path
 
+    | `UninstallPackages pkgs ->
+      message (f_"Uninstalling packages: %s") (String.concat " " pkgs);
+      let cmd = guest_uninstall_command pkgs in
+      do_run ~display:cmd cmd
+
     | `Update ->
       message (f_"Updating packages");
       let cmd = guest_update_command () in
diff --git a/generator/customize.ml b/generator/customize.ml
index 3d3f978..496077b 100644
--- a/generator/customize.ml
+++ b/generator/customize.ml
@@ -214,7 +214,7 @@ installed during the image build using the guest's package manager
 For an overview on the different ways to install packages, see
 L<virt-builder(1)/INSTALLING PACKAGES>.
 
-See also I<--update>.";
+See also I<--update>, I<--uninstall>.";
   };
 
   { op_name = "link";
@@ -424,6 +424,19 @@ string like C<Europe/London>";
 This command performs a L<touch(1)>-like operation on C<FILE>.";
   };
 
+  { op_name = "uninstall";
+    op_type = StringList "PKG,PKG..";
+    op_discrim = "`UninstallPackages";
+    op_shortdesc = "Uninstall package(s)";
+    op_pod_longdesc = "\
+Uninstall the named packages (a comma-separated list).  These are
+removed during the image build using the guest's package manager
+(eg. apt, yum, etc.).  Dependent packages may also need to be
+uninstalled to satisfy the request.
+
+See also I<--install>, I<--update>.";
+  };
+
   { op_name = "update";
     op_type = Unit;
     op_discrim = "`Update";
@@ -433,7 +446,7 @@ Do the equivalent of C<yum update>, C<apt-get upgrade>, or whatever
 command is required to update the packages already installed in the
 template to their latest versions.
 
-See also I<--install>.";
+See also I<--install>, I<--uninstall>.";
   };
 
   { op_name = "upload";
-- 
2.7.4




More information about the Libguestfs mailing list