Richard W.M. Jones
2014-Feb-27  18:20 UTC
[Libguestfs] FYI: [PATCH supermin] rpm: Add support for OpenSUSE.
Olaf, I added this patch to supermin 5, which enables support for OpenSUSE / zypper, and allowed me to rebuild libguestfs on 13.1. It is largely based on the previous code that you did, but I have dropped support for the --packager-config option. I can add this back if you want, although I'd like to avoid use of the 'inifiles' library. If you want to try this you will need to: - git clone supermin - compile supermin - either install supermin 5, or: export SUPERMIN=/path/to/supermin/src/supermin - configure & compile libguestfs (>= 1.25.38) in the usual way Rich.
Richard W.M. Jones
2014-Feb-27  18:20 UTC
[Libguestfs] [PATCH supermin] rpm: Add support for OpenSUSE.
This is based on the existing support for OpenSUSE / zypper in
supermin 4 which was added by Olaf Hering.
---
 src/rpm.ml | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 69 insertions(+), 16 deletions(-)
diff --git a/src/rpm.ml b/src/rpm.ml
index bb55411..0a57c32 100644
--- a/src/rpm.ml
+++ b/src/rpm.ml
@@ -22,11 +22,15 @@ open Printf
 open Utils
 open Package_handler
 
-let rpm_detect () +let fedora_detect ()    Config.rpm <> "no"
&&
     Config.yumdownloader <> "no" &&
-    (file_exists "/etc/redhat-release" ||
-       file_exists "/etc/fedora-release")
+    (file_exists "/etc/redhat-release" || file_exists
"/etc/fedora-release")
+
+let opensuse_detect () +  Config.rpm <> "no" &&
+    Config.zypper <> "no" &&
+    file_exists "/etc/SuSE-release"
 
 let settings = ref no_settings
 
@@ -166,7 +170,10 @@ let rpm_get_all_files pkgs  
 let rpm_get_files pkg = rpm_get_all_files (PackageSet.singleton pkg)
 
-let rpm_download_all_packages pkgs dir +let rpm_get_package_database_mtime () +
(lstat "/var/lib/rpm/Packages").st_mtime
+
+let rec fedora_download_all_packages pkgs dir    let tdir = !settings.tmpdir //
string_random8 () in
 
   (* It's quite complex to get yumdownloader to download specific
@@ -195,6 +202,50 @@ let rpm_download_all_packages pkgs dir        (quoted_list
rpms) in
   run_command cmd;
 
+  rpm_unpack tdir dir
+
+and opensuse_download_all_packages pkgs dir +  let tdir = !settings.tmpdir //
string_random8 () in
+
+  let rpms = List.map rpm_of_pkg (PackageSet.elements pkgs) in
+  let rpms = List.map (
+    fun { name = name; arch = arch } ->
+      sprintf "%s.%s" name arch
+  ) rpms in
+
+  (* This isn't quite right because zypper will resolve the dependencies
+   * of the listed packages against the public repos and download all the
+   * dependencies too.  We only really want it to download the named
+   * packages. XXX
+   *)
+  let cmd +    sprintf "
+      %s%s \\
+        --root %s \\
+        --reposd-dir /etc/zypp/repos.d \\
+        --cache-dir %s \\
+        --pkg-cache-dir %s \\
+        --gpg-auto-import-keys --no-gpg-checks --non-interactive \\
+        install \\
+        --auto-agree-with-licenses --download-only \\
+        %s"
+      Config.zypper
+      (if !settings.debug >= 1 then " --verbose --verbose" else
" --quiet")
+      (quote tdir)
+      (quote tdir)
+      (quote tdir)
+      (quoted_list rpms) in
+  run_command cmd;
+
+  rpm_unpack tdir dir
+
+and fedora_download_package pkg dir +  fedora_download_all_packages
(PackageSet.singleton pkg) dir
+
+and opensuse_download_package pkg dir +  opensuse_download_all_packages
(PackageSet.singleton pkg) dir
+
+and rpm_unpack tdir dir    (* Unpack each downloaded package.
    * 
    * yumdownloader can't necessarily download the specific file that we
@@ -203,21 +254,16 @@ let rpm_download_all_packages pkgs dir    let cmd     
sprintf "
 umask 0000
-for f in %s/*.rpm; do
+for f in `find %s -name '*.rpm'`; do
   rpm2cpio \"$f\" | (cd %s && cpio --quiet -id)
 done"
       (quote tdir) (quote dir) in
   run_command cmd
 
-let rpm_download_package pkg dir -  rpm_download_all_packages
(PackageSet.singleton pkg) dir
-
-let rpm_get_package_database_mtime () -  (lstat
"/var/lib/rpm/Packages").st_mtime
-
+(* We register package handlers for each RPM distro variant. *)
 let () -  let ph = {
-    ph_detect = rpm_detect;
+  let fedora = {
+    ph_detect = fedora_detect;
     ph_init = rpm_init;
     ph_package_of_string = rpm_package_of_string;
     ph_package_to_string = rpm_package_to_string;
@@ -226,8 +272,15 @@ let ()      ph_get_all_requires = rpm_get_all_requires;
     ph_get_files = rpm_get_files;
     ph_get_all_files = rpm_get_all_files;
-    ph_download_package = rpm_download_package;
-    ph_download_all_packages = rpm_download_all_packages;
     ph_get_package_database_mtime = rpm_get_package_database_mtime;
+    ph_download_package = fedora_download_package;
+    ph_download_all_packages = fedora_download_all_packages;
   } in
-  register_package_handler "rpm" ph
+  register_package_handler "rpm-fedora" fedora;
+  let opensuse = {
+    fedora with
+    ph_detect = opensuse_detect;
+    ph_download_package = opensuse_download_package;
+    ph_download_all_packages = opensuse_download_all_packages;
+  } in
+  register_package_handler "rpm-opensuse" opensuse
-- 
1.8.5.3
Olaf Hering
2014-Mar-03  08:56 UTC
Re: [Libguestfs] FYI: [PATCH supermin] rpm: Add support for OpenSUSE.
On Thu, Feb 27, Richard W.M. Jones wrote:> I added this patch to supermin 5, which enables support for OpenSUSE / > zypper, and allowed me to rebuild libguestfs on 13.1.Thanks for porting the zypper patches. Right now I dont have time to continue with zypper support for supermin. Olaf