From 9882d33e0d95f565a9b89c881db12abfcd71f712 Mon Sep 17 00:00:00 2001 From: eabdullin Date: Mon, 30 Sep 2024 15:40:19 +0000 Subject: [PATCH] import CS guestfs-tools-1.51.6-5.el9 --- ...tor.c-Remove-extra-cases-covered-by-.patch | 47 +++ ....m4-Re-add-.-configure-enable-werror.patch | 42 +++ .../0007-make-fs-Use-S-option-with-z.patch | 43 +++ ...earer-that-we-do-not-support-Windows.patch | 28 ++ ...EANFILES-for-a-generated-but-few-rar.patch | 63 ++++ ...pilation-to-output-whole-exe-instead.patch | 28 ++ ...-translate-and-sed-commands-separate.patch | 42 +++ ...irt-dib-from-list-of-translated-man-.patch | 25 ++ SOURCES/0013-Update-common-submodule.patch | 65 ++++ ...ze-Implement-inject-blnsvr-operation.patch | 222 +++++++++++ SOURCES/0015-Update-common-submodule.patch | 344 ++++++++++++++++++ SOURCES/0016-Update-common-submodule.patch | 57 +++ SOURCES/copy-patches.sh | 2 +- SPECS/guestfs-tools.spec | 26 +- 14 files changed, 1031 insertions(+), 3 deletions(-) create mode 100644 SOURCES/0005-inspector-inspector.c-Remove-extra-cases-covered-by-.patch create mode 100644 SOURCES/0006-m4-guestfs-c.m4-Re-add-.-configure-enable-werror.patch create mode 100644 SOURCES/0007-make-fs-Use-S-option-with-z.patch create mode 100644 SOURCES/0008-sysprep-Make-clearer-that-we-do-not-support-Windows.patch create mode 100644 SOURCES/0009-build-Use-DISTCLEANFILES-for-a-generated-but-few-rar.patch create mode 100644 SOURCES/0010-Fix-bytecode-compilation-to-output-whole-exe-instead.patch create mode 100644 SOURCES/0011-po-docs-Run-po4a-translate-and-sed-commands-separate.patch create mode 100644 SOURCES/0012-po-docs-Remove-virt-dib-from-list-of-translated-man-.patch create mode 100644 SOURCES/0013-Update-common-submodule.patch create mode 100644 SOURCES/0014-customize-Implement-inject-blnsvr-operation.patch create mode 100644 SOURCES/0015-Update-common-submodule.patch create mode 100644 SOURCES/0016-Update-common-submodule.patch diff --git a/SOURCES/0005-inspector-inspector.c-Remove-extra-cases-covered-by-.patch b/SOURCES/0005-inspector-inspector.c-Remove-extra-cases-covered-by-.patch new file mode 100644 index 0000000..1bc04da --- /dev/null +++ b/SOURCES/0005-inspector-inspector.c-Remove-extra-cases-covered-by-.patch @@ -0,0 +1,47 @@ +From 76080541ae09c6242e0a162009c5faec3ba94b41 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 29 Feb 2024 21:27:47 +0000 +Subject: [PATCH] inspector/inspector.c: Remove extra cases covered by default +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +In GCC 14: + +inspector.c: In function ‘do_xpath’: +inspector.c:770:3: error: case value ‘5’ not in enumerated type ‘xmlXPathObjectType’ [-Werror=switch] + 770 | case XPATH_POINT: + | ^~~~ +inspector.c:771:3: error: case value ‘6’ not in enumerated type ‘xmlXPathObjectType’ [-Werror=switch] + 771 | case XPATH_RANGE: + | ^~~~ +inspector.c:772:3: error: case value ‘7’ not in enumerated type ‘xmlXPathObjectType’ [-Werror=switch] + 772 | case XPATH_LOCATIONSET: + | ^~~~ + +We already have a default case here, remove the other cases. + +(cherry picked from commit 9d2ac9c9b48bf34f5fc3485303143302ead4cb4f) +--- + inspector/inspector.c | 8 -------- + 1 file changed, 8 deletions(-) + +diff --git a/inspector/inspector.c b/inspector/inspector.c +index 73357c7d7..01abfae0c 100644 +--- a/inspector/inspector.c ++++ b/inspector/inspector.c +@@ -764,14 +764,6 @@ do_xpath (const char *query) + printf ("\n"); + break; + +- case XPATH_UNDEFINED: /* grrrrr ... switch-enum is a useless warning */ +- case XPATH_BOOLEAN: +- case XPATH_NUMBER: +- case XPATH_POINT: +- case XPATH_RANGE: +- case XPATH_LOCATIONSET: +- case XPATH_USERS: +- case XPATH_XSLT_TREE: + default: + r = (char *) xmlXPathCastToString (xpathObj); + printf ("%s\n", r); diff --git a/SOURCES/0006-m4-guestfs-c.m4-Re-add-.-configure-enable-werror.patch b/SOURCES/0006-m4-guestfs-c.m4-Re-add-.-configure-enable-werror.patch new file mode 100644 index 0000000..ae13179 --- /dev/null +++ b/SOURCES/0006-m4-guestfs-c.m4-Re-add-.-configure-enable-werror.patch @@ -0,0 +1,42 @@ +From dbc179ab026897be96651e7f9ca6026a3ebf540d Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 29 Feb 2024 21:20:59 +0000 +Subject: [PATCH] m4/guestfs-c.m4: Re-add ./configure --enable-werror + +Somewhere during removal of gnulib and splitting guestfs-tools from +libguestfs, this option was lost. Re-add it simply by copying the +configure fragment over from libguestfs. + +(cherry picked from commit 42426992a292b45611b00fcff42160854db09922) +--- + m4/guestfs-c.m4 | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +diff --git a/m4/guestfs-c.m4 b/m4/guestfs-c.m4 +index bc7e3b2aa..67004d0a1 100644 +--- a/m4/guestfs-c.m4 ++++ b/m4/guestfs-c.m4 +@@ -29,6 +29,23 @@ test "x$U" != "x" && AC_MSG_ERROR([Compiler not ANSI compliant]) + + AM_PROG_CC_C_O + ++AC_ARG_ENABLE([werror], ++ [AS_HELP_STRING([--enable-werror], ++ [turn on lots of GCC warnings (for developers)])], ++ [case $enableval in ++ yes|no) ;; ++ *) AC_MSG_ERROR([bad value $enableval for werror option]) ;; ++ esac ++ gcc_warnings=$enableval], ++ [gcc_warnings=no] ++) ++WARN_CFLAGS="-Wall" ++AC_SUBST([WARN_CFLAGS]) ++if test "x$gcc_warnings" = "xyes"; then ++ WERROR_CFLAGS="-Werror" ++fi ++AC_SUBST([WERROR_CFLAGS]) ++ + # Provide a global place to set CFLAGS. (Note that setting AM_CFLAGS + # is no use because it doesn't override target_CFLAGS). + #--- diff --git a/SOURCES/0007-make-fs-Use-S-option-with-z.patch b/SOURCES/0007-make-fs-Use-S-option-with-z.patch new file mode 100644 index 0000000..71ac342 --- /dev/null +++ b/SOURCES/0007-make-fs-Use-S-option-with-z.patch @@ -0,0 +1,43 @@ +From 51b0bf74b249ac6646b7e083a678553fc40d44d7 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 7 Mar 2024 12:00:45 +0000 +Subject: [PATCH] make-fs: Use -S option with -z + +Basically the file -z option is broken for distributions that enable +seccomp support in the 'file' command. Turn off seccomp when we know +we'll be using -z. + +We hit this before in the libguestfs daemon: +https://github.com/libguestfs/libguestfs/issues/100 + +It was reported upstream but the fix was rejected: +https://bugs.astron.com/view.php?id=406 + +See also libguestfs commit 23986d3c4f4d1f9cbac44cc743d3e6af721e4237 +("file: Use -S option with -z"). + +Note this requires file > 5.32. We could make it work for earlier +versions of file with some extra work: +https://listman.redhat.com/archives/libguestfs/2023-September/032613.html +& libguestfs commit c95d8c4cf64142bb707b42c32cf3e1ba3c4a5eb1 + +Reported-by: Jax Young +Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2266201 +(cherry picked from commit a706f6f55345b06578fd1ca4af531524dc2131fb) +--- + make-fs/make-fs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/make-fs/make-fs.c b/make-fs/make-fs.c +index 7837b61be..b8aebccfb 100644 +--- a/make-fs/make-fs.c ++++ b/make-fs/make-fs.c +@@ -457,7 +457,7 @@ estimate_input (const char *input, uint64_t *estimate_rtn, char **ifmt_rtn) + } + else { + argv[0] = "file"; +- argv[1] = "-bsLz"; ++ argv[1] = "-bsSLz"; + argv[2] = input; + argv[3] = NULL; + diff --git a/SOURCES/0008-sysprep-Make-clearer-that-we-do-not-support-Windows.patch b/SOURCES/0008-sysprep-Make-clearer-that-we-do-not-support-Windows.patch new file mode 100644 index 0000000..54314af --- /dev/null +++ b/SOURCES/0008-sysprep-Make-clearer-that-we-do-not-support-Windows.patch @@ -0,0 +1,28 @@ +From cc0ae4acabfc857f2bcee828e725a9d69dab5735 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 12 Mar 2024 09:42:30 +0000 +Subject: [PATCH] sysprep: Make clearer that we do not support Windows + +Thanks: Dan Kenigsberg +(cherry picked from commit 82c0fb1231c1a9250104cff278f1c67ab482fa4b) +--- + sysprep/virt-sysprep.pod | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/sysprep/virt-sysprep.pod b/sysprep/virt-sysprep.pod +index 0bcdc4dec..b48ac55c1 100644 +--- a/sysprep/virt-sysprep.pod ++++ b/sysprep/virt-sysprep.pod +@@ -30,10 +30,8 @@ disk image to be writable as the non-root user running virt-sysprep. + + "Sysprep" stands for "system preparation" tool. The name comes from + the Microsoft program F which is used to unconfigure +-Windows machines in preparation for cloning them. Having said that, +-virt-sysprep does I currently work on Microsoft Windows guests. +-We plan to support Windows sysprepping in a future version, and we +-already have code to do it. ++Windows machines in preparation for cloning them. (Virt-sysprep does ++not work on Microsoft Windows guests.) + + =head1 OPTIONS + diff --git a/SOURCES/0009-build-Use-DISTCLEANFILES-for-a-generated-but-few-rar.patch b/SOURCES/0009-build-Use-DISTCLEANFILES-for-a-generated-but-few-rar.patch new file mode 100644 index 0000000..0299109 --- /dev/null +++ b/SOURCES/0009-build-Use-DISTCLEANFILES-for-a-generated-but-few-rar.patch @@ -0,0 +1,63 @@ +From a103e367c4fd6bd073c324253833289f6a8ecc3a Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 12 Mar 2024 10:04:34 +0000 +Subject: [PATCH] build: Use DISTCLEANFILES for a generated but few rarely + updated files + +We rarely change the generated test scripts or the sysprep mli files, +so we only need to delete them in 'make distclean', not 'make clean'. + +(cherry picked from commit 35e15c68ac9c4e5361e4cf8a49a60a4bc2708d89) +--- + builder/Makefile.am | 4 +++- + customize/Makefile.am | 6 ++++-- + sysprep/Makefile.am | 2 +- + 3 files changed, 8 insertions(+), 4 deletions(-) + +diff --git a/builder/Makefile.am b/builder/Makefile.am +index 42606aaf3..b474f0c9d 100644 +--- a/builder/Makefile.am ++++ b/builder/Makefile.am +@@ -412,8 +412,10 @@ test-console-%.sh: + chmod 0755 $@-t + mv $@-t $@ + ++DISTCLEANFILES += \ ++ $(console_test_scripts) ++ + CLEANFILES += \ +- $(console_test_scripts) \ + console-*.img \ + console-*.out + +diff --git a/customize/Makefile.am b/customize/Makefile.am +index 3a974590f..461629062 100644 +--- a/customize/Makefile.am ++++ b/customize/Makefile.am +@@ -285,9 +285,11 @@ test-settings-%.sh: + chmod 0755 $@-t + mv $@-t $@ + ++DISTCLEANFILES += \ ++ $(password_test_scripts) \ ++ $(settings_test_scripts) ++ + CLEANFILES += \ +- $(password_test_scripts) \ +- $(settings_test_scripts) \ + password-*.img \ + password-*.log \ + settings-*.img +diff --git a/sysprep/Makefile.am b/sysprep/Makefile.am +index 4b29d4e10..4b1c23ce0 100644 +--- a/sysprep/Makefile.am ++++ b/sysprep/Makefile.am +@@ -179,7 +179,7 @@ virt_sysprep_LINK = \ + $(OBJECTS) -o $@ + + # The sysprep_operation_*.mli files are all empty and autogenerated. +-CLEANFILES += \ ++DISTCLEANFILES += \ + $(patsubst %,sysprep_operation_%.mli,$(operations)) + + sysprep_operation_%.mli: diff --git a/SOURCES/0010-Fix-bytecode-compilation-to-output-whole-exe-instead.patch b/SOURCES/0010-Fix-bytecode-compilation-to-output-whole-exe-instead.patch new file mode 100644 index 0000000..b4241da --- /dev/null +++ b/SOURCES/0010-Fix-bytecode-compilation-to-output-whole-exe-instead.patch @@ -0,0 +1,28 @@ +From 6ea88c2011b02a47058ba6d89af156983bd52a91 Mon Sep 17 00:00:00 2001 +From: Jerry James +Date: Fri, 12 Apr 2024 20:11:50 +0100 +Subject: [PATCH] Fix bytecode compilation to output whole exe instead of using + -custom + +These binaries are more resistant to being stripped. + +Reported-by: Ilya Leoshkevich +Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2274708 +(cherry picked from commit c249fd5caca8f1eed439f83e2bb1af46c8a28a27) +--- + subdir-rules.mk | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/subdir-rules.mk b/subdir-rules.mk +index 6bd62b653..051dc9d5a 100644 +--- a/subdir-rules.mk ++++ b/subdir-rules.mk +@@ -49,7 +49,7 @@ LOG_DRIVER = env $(SHELL) $(top_srcdir)/build-aux/guestfs-test-driver + + if !HAVE_OCAMLOPT + MLARCHIVE = cma +-LINK_CUSTOM_OCAMLC_ONLY = -custom ++LINK_CUSTOM_OCAMLC_ONLY = -output-complete-exe + BEST = c + else + MLARCHIVE = cmxa diff --git a/SOURCES/0011-po-docs-Run-po4a-translate-and-sed-commands-separate.patch b/SOURCES/0011-po-docs-Run-po4a-translate-and-sed-commands-separate.patch new file mode 100644 index 0000000..de72f45 --- /dev/null +++ b/SOURCES/0011-po-docs-Run-po4a-translate-and-sed-commands-separate.patch @@ -0,0 +1,42 @@ +From 8a942cdd8e6d1aa526844c428660d0bb4ca02770 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 4 Apr 2024 09:38:28 +0100 +Subject: [PATCH] po-docs: Run po4a-translate and sed commands separately + +I noticed that 1-byte translated POD files were being generated in the +output directory (po-docs/ja/). This seems to have happened because +po4a-translate was generating an error, but because we were +immediately pipeing the output into sed the error was suppressed. + +By running them as two separate commands this cannot happen. + +Fixes: commit bd896d68c06d7f66303bd77daa666367b0de5f3a +(cherry picked from libguestfs commit d755070346c0498672517c844d7ced52e9263197) + +(cherry picked from commit 8c8da80adf8a9e3c350b010b5724a5ae7d9875b6) +--- + po-docs/language.mk | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/po-docs/language.mk b/po-docs/language.mk +index b4e3544ca..ba2e36998 100644 +--- a/po-docs/language.mk ++++ b/po-docs/language.mk +@@ -101,13 +101,16 @@ virt-sysprep.1: virt-sysprep.pod sysprep-extra-options.pod sysprep-operations.po + # Remove both. + # XXX Fix po4a so it doesn't do this. + %.pod: $(srcdir)/../$(LINGUA).po ++ rm -f $@ $@-t + $(guestfs_am_v_po4a_translate)$(PO4A_TRANSLATE) \ + -f pod \ + -M utf-8 -L utf-8 \ + -k 0 \ + -m $(top_srcdir)/$(shell grep -E '/$(basename $@)(\.|$$)' $(top_srcdir)/po-docs/podfiles) \ + -p $< \ +- | $(SED) '0,/^=encoding/d' > $@ ++ -l $@-t ++ $(SED) '0,/^=encoding/d' < $@-t > $@ ++ rm $@-t + + # XXX Can automake do this properly? + install-data-hook: diff --git a/SOURCES/0012-po-docs-Remove-virt-dib-from-list-of-translated-man-.patch b/SOURCES/0012-po-docs-Remove-virt-dib-from-list-of-translated-man-.patch new file mode 100644 index 0000000..40e65be --- /dev/null +++ b/SOURCES/0012-po-docs-Remove-virt-dib-from-list-of-translated-man-.patch @@ -0,0 +1,25 @@ +From 80806f5438c769b71e92a7669db029f5f243cfce Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Fri, 12 Apr 2024 22:06:55 +0100 +Subject: [PATCH] po-docs: Remove virt-dib from list of translated man pages + +This page no longer exists. + +Fixes: commit 57423d907270526ea664ff15601cce956353820e +(cherry picked from commit 2e797d3bb4c8a13305a948e3d87e4eabfd692e17) +--- + po-docs/language.mk | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/po-docs/language.mk b/po-docs/language.mk +index ba2e36998..7328265e6 100644 +--- a/po-docs/language.mk ++++ b/po-docs/language.mk +@@ -30,7 +30,6 @@ MANPAGES = \ + virt-cat.1 \ + virt-customize.1 \ + virt-df.1 \ +- virt-dib.1 \ + virt-diff.1 \ + virt-edit.1 \ + virt-filesystems.1 \ diff --git a/SOURCES/0013-Update-common-submodule.patch b/SOURCES/0013-Update-common-submodule.patch new file mode 100644 index 0000000..7b86099 --- /dev/null +++ b/SOURCES/0013-Update-common-submodule.patch @@ -0,0 +1,65 @@ +From d0b1b1eaaebdff2cee004304e9d498cd2a720e23 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Wed, 24 Apr 2024 12:23:34 +0100 +Subject: [PATCH] Update common submodule + +In particular pick this: + + commit 93a7f3af5c23ece6a8e092827ed5928a8973fd3c + Author: Richard W.M. Jones + Date: Wed Apr 24 12:08:01 2024 +0100 + + options: Allow nbd+unix:// URIs + +(cherry picked from commit 21a507d8aeb2d264863e1fbdfadc0ff44455ffb4) +--- + common | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Submodule common 54869c987..93a7f3af5: +diff --git a/common/options/uri.c b/common/options/uri.c +index 84d393c1e..9180d6a27 100644 +--- a/common/options/uri.c ++++ b/common/options/uri.c +@@ -99,7 +99,7 @@ is_uri (const char *arg) + return 0; + + for (p--; p >= arg; p--) { +- if (!c_islower (*p)) ++ if (! (c_islower (*p) || *p == '+')) + return 0; + } + +@@ -148,7 +148,10 @@ parse (const char *arg, char **path_ret, char **protocol_ret, + } + */ + +- *protocol_ret = strdup (uri->scheme); ++ if (STREQ (uri->scheme, "nbd+unix")) ++ *protocol_ret = strdup ("nbd"); ++ else ++ *protocol_ret = strdup (uri->scheme); + if (*protocol_ret == NULL) { + perror ("strdup: protocol"); + return -1; +@@ -194,7 +197,7 @@ parse (const char *arg, char **path_ret, char **protocol_ret, + if (path && path[0] == '/' && + (STREQ (uri->scheme, "gluster") || + STREQ (uri->scheme, "iscsi") || +- STREQ (uri->scheme, "nbd") || ++ STRPREFIX (uri->scheme, "nbd") || + STREQ (uri->scheme, "rbd") || + STREQ (uri->scheme, "sheepdog"))) + path++; +diff --git a/common/progress/progress.c b/common/progress/progress.c +index e4b30663f..5848abd70 100644 +--- a/common/progress/progress.c ++++ b/common/progress/progress.c +@@ -123,6 +123,7 @@ progress_bar_init (unsigned flags) + bar->machine_readable = 1; + bar->utf8_mode = 0; + bar->have_terminfo = 0; ++ bar->fp = NULL; + } else { + bar->machine_readable = 0; + diff --git a/SOURCES/0014-customize-Implement-inject-blnsvr-operation.patch b/SOURCES/0014-customize-Implement-inject-blnsvr-operation.patch new file mode 100644 index 0000000..c8303b0 --- /dev/null +++ b/SOURCES/0014-customize-Implement-inject-blnsvr-operation.patch @@ -0,0 +1,222 @@ +From d326f1080aafe32d47b49064099f2e9d7759b2a0 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 16 May 2024 12:49:24 +0100 +Subject: [PATCH] customize: Implement --inject-blnsvr operation + +Also updates the common submodule with the generated changes from +libguestfs, and the implementation of Inject_virtio_win.inject_blnsvr. + +(cherry picked from commit 80d258baa49214c8e59b91d6085595c9b989fc0d) +--- + common | 2 +- + customize/customize_run.ml | 13 +++++++++++-- + 2 files changed, 12 insertions(+), 3 deletions(-) + +Submodule common 93a7f3af5..830cbdcf4: +diff --git a/common/mlcustomize/customize-options.pod b/common/mlcustomize/customize-options.pod +index ff93630d8..b2ac57526 100644 +--- a/common/mlcustomize/customize-options.pod ++++ b/common/mlcustomize/customize-options.pod +@@ -193,6 +193,18 @@ L. + Set the hostname of the guest to C. You can use a + dotted hostname.domainname (FQDN) if you want. + ++=item B<--inject-blnsvr> METHOD ++ ++Inject the Balloon Server (F) into a Windows guest. ++This operation also injects a firstboot script so that the Balloon ++Server is installed when the guest boots. ++ ++The parameter is the same as used by the I<--inject-virtio-win> operation. ++ ++Note that to do a full conversion of a Windows guest from a ++foreign hypervisor like VMware (which involves many other operations) ++you should use the L tool instead of this. ++ + =item B<--inject-qemu-ga> METHOD + + Inject the QEMU Guest Agent into a Windows guest. The guest +diff --git a/common/mlcustomize/customize-synopsis.pod b/common/mlcustomize/customize-synopsis.pod +index bb0ce1255..957de8cf2 100644 +--- a/common/mlcustomize/customize-synopsis.pod ++++ b/common/mlcustomize/customize-synopsis.pod +@@ -3,16 +3,16 @@ + [--copy SOURCE:DEST] [--copy-in LOCALPATH:REMOTEDIR] + [--delete PATH] [--edit FILE:EXPR] [--firstboot SCRIPT] + [--firstboot-command 'CMD+ARGS'] [--firstboot-install PKG,PKG..] +- [--hostname HOSTNAME] [--inject-qemu-ga METHOD] +- [--inject-virtio-win METHOD] [--install PKG,PKG..] +- [--link TARGET:LINK[:LINK..]] [--mkdir DIR] [--move SOURCE:DEST] +- [--password USER:SELECTOR] [--root-password SELECTOR] +- [--run SCRIPT] [--run-command 'CMD+ARGS'] [--scrub FILE] +- [--sm-attach SELECTOR] [--sm-register] [--sm-remove] +- [--sm-unregister] [--ssh-inject USER[:SELECTOR]] +- [--tar-in TARFILE:REMOTEDIR] [--timezone TIMEZONE] [--touch FILE] +- [--truncate FILE] [--truncate-recursive PATH] +- [--uninstall PKG,PKG..] [--update] [--upload FILE:DEST] +- [--write FILE:CONTENT] [--no-logfile] ++ [--hostname HOSTNAME] [--inject-blnsvr METHOD] ++ [--inject-qemu-ga METHOD] [--inject-virtio-win METHOD] ++ [--install PKG,PKG..] [--link TARGET:LINK[:LINK..]] [--mkdir DIR] ++ [--move SOURCE:DEST] [--password USER:SELECTOR] ++ [--root-password SELECTOR] [--run SCRIPT] ++ [--run-command 'CMD+ARGS'] [--scrub FILE] [--sm-attach SELECTOR] ++ [--sm-register] [--sm-remove] [--sm-unregister] ++ [--ssh-inject USER[:SELECTOR]] [--tar-in TARFILE:REMOTEDIR] ++ [--timezone TIMEZONE] [--touch FILE] [--truncate FILE] ++ [--truncate-recursive PATH] [--uninstall PKG,PKG..] [--update] ++ [--upload FILE:DEST] [--write FILE:CONTENT] [--no-logfile] + [--password-crypto md5|sha256|sha512] [--no-selinux-relabel] + [--selinux-relabel] [--sm-credentials SELECTOR] +diff --git a/common/mlcustomize/customize_cmdline.ml b/common/mlcustomize/customize_cmdline.ml +index 48ee33445..c4d6a77d5 100644 +--- a/common/mlcustomize/customize_cmdline.ml ++++ b/common/mlcustomize/customize_cmdline.ml +@@ -61,6 +61,8 @@ and op = [ + (* --firstboot-install PKG,PKG.. *) + | `Hostname of string + (* --hostname HOSTNAME *) ++ | `InjectBalloonServer of string ++ (* --inject-blnsvr METHOD *) + | `InjectQemuGA of string + (* --inject-qemu-ga METHOD *) + | `InjectVirtioWin of string +@@ -286,6 +288,12 @@ let rec argspec () = + s_"Set the hostname" + ), + Some "HOSTNAME", "Set the hostname of the guest to C. You can use a\ndotted hostname.domainname (FQDN) if you want."; ++ ( ++ [ L"inject-blnsvr" ], ++ Getopt.String (s_"METHOD", fun s -> List.push_front (`InjectBalloonServer s) ops), ++ s_"Inject the Balloon Server into a Windows guest" ++ ), ++ Some "METHOD", "Inject the Balloon Server (F) into a Windows guest.\nThis operation also injects a firstboot script so that the Balloon\nServer is installed when the guest boots.\n\nThe parameter is the same as used by the I<--inject-virtio-win> operation.\n\nNote that to do a full conversion of a Windows guest from a\nforeign hypervisor like VMware (which involves many other operations)\nyou should use the L tool instead of this."; + ( + [ L"inject-qemu-ga" ], + Getopt.String (s_"METHOD", fun s -> List.push_front (`InjectQemuGA s) ops), +diff --git a/common/mlcustomize/customize_cmdline.mli b/common/mlcustomize/customize_cmdline.mli +index 51a156eae..ee62961a1 100644 +--- a/common/mlcustomize/customize_cmdline.mli ++++ b/common/mlcustomize/customize_cmdline.mli +@@ -53,6 +53,8 @@ and op = [ + (* --firstboot-install PKG,PKG.. *) + | `Hostname of string + (* --hostname HOSTNAME *) ++ | `InjectBalloonServer of string ++ (* --inject-blnsvr METHOD *) + | `InjectQemuGA of string + (* --inject-qemu-ga METHOD *) + | `InjectVirtioWin of string +diff --git a/common/mlcustomize/inject_virtio_win.ml b/common/mlcustomize/inject_virtio_win.ml +index 2a30b2008..4e0ed0e0e 100644 +--- a/common/mlcustomize/inject_virtio_win.ml ++++ b/common/mlcustomize/inject_virtio_win.ml +@@ -24,6 +24,8 @@ open Common_gettext.Gettext + + open Regedit + ++let re_blnsvr = PCRE.compile ~caseless:true "\\bblnsvr\\.exe$" ++ + type t = { + g : Guestfs.guestfs; (** guestfs handle *) + +@@ -267,6 +269,18 @@ and inject_qemu_ga t = + configure_qemu_ga t msi_files; + msi_files <> [] (* return true if we found some qemu-ga MSI files *) + ++and inject_blnsvr t = ++ let files = copy_blnsvr t in ++ match files with ++ | [] -> false (* Didn't find or install anything. *) ++ ++ (* We usually find blnsvr.exe in two locations (drivers/by-os and ++ * drivers/by-driver). Pick the first. ++ *) ++ | blnsvr :: _ -> ++ configure_blnsvr t blnsvr; ++ true ++ + and add_guestor_to_registry t ((g, root) as reg) drv_name drv_pciid = + let ddb_node = g#hivex_node_get_child root "DriverDatabase" in + +@@ -351,6 +365,11 @@ and copy_qemu_ga t = + (fun () -> + error (f_"root directory ‘/’ is missing from the virtio-win directory or ISO.\n\nThis should not happen and may indicate that virtio-win or virt-v2v is broken in some way. Please report this as a bug with a full debug log.")) + ++and copy_blnsvr t = ++ copy_from_virtio_win t "/" "/" (virtio_iso_path_matches_blnsvr t) ++ (fun () -> ++ error (f_"root directory ‘/’ is missing from the virtio-win directory or ISO.\n\nThis should not happen and may indicate that virtio-win or virt-v2v is broken in some way. Please report this as a bug with a full debug log.")) ++ + (* Copy all files from virtio_win directory/ISO located in [srcdir] + * subdirectory and all its subdirectories to the [destdir]. The directory + * hierarchy is not preserved, meaning all files will be directly in [destdir]. +@@ -513,6 +532,10 @@ and virtio_iso_path_matches_qemu_ga t path = + | ("x86_64", "rhev-qga64.msi") -> true + | _ -> false + ++(* Find blnsvr for the current Windows version. *) ++and virtio_iso_path_matches_blnsvr t path = ++ virtio_iso_path_matches_guest_os t path && PCRE.matches re_blnsvr path ++ + (* Look up in libosinfo for the OS, and copy all the locally + * available files specified as drivers for that OS to the [destdir]. + * +@@ -586,3 +609,10 @@ and configure_qemu_ga t files = + Firstboot.add_firstboot_powershell t.g t.root + (sprintf "install-%s.ps1" msi_path) !psh_script; + ) files ++ ++and configure_blnsvr t blnsvr = ++ let cmd = sprintf "\ ++ @echo off\n\ ++ echo Installing %s\n\ ++ c:\\%s -i\n" blnsvr blnsvr in ++ Firstboot.add_firstboot_script t.g t.root (sprintf "install-%s" blnsvr) cmd +diff --git a/common/mlcustomize/inject_virtio_win.mli b/common/mlcustomize/inject_virtio_win.mli +index d14f04973..d273c4dd3 100644 +--- a/common/mlcustomize/inject_virtio_win.mli ++++ b/common/mlcustomize/inject_virtio_win.mli +@@ -93,3 +93,11 @@ val inject_qemu_ga : t -> bool + the MSI(s). + + Returns [true] iff we were able to inject qemu-ga. *) ++ ++val inject_blnsvr : t -> bool ++(** Inject the Balloon Server ([blnsvr.exe]) into a Windows guest. ++ ++ A firstboot script is also injected which should install ++ the server by running [blnsvr -i]. ++ ++ Returns [true] iff we were able to inject the Balloon Server. *) +diff --git a/customize/customize_run.ml b/customize/customize_run.ml +index 1314d6e30..1d7c13eaf 100644 +--- a/customize/customize_run.ml ++++ b/customize/customize_run.ml +@@ -113,8 +113,8 @@ let run (g : G.guestfs) root (ops : ops) = + Hashtbl.replace passwords user pw + in + +- (* Helper function to convert --inject-qemu-ga/--inject-virtio-win +- * method parameter into a virtio-win handle. ++ (* Helper function to convert --inject-blnsvr/--inject-qemu-ga/ ++ * --inject-virtio-win method parameter into a virtio-win handle. + *) + let get_virtio_win_handle op meth = + if g#inspect_get_type root <> "windows" then ( +@@ -216,6 +216,15 @@ let run (g : G.guestfs) root (ops : ops) = + if not (Hostname.set_hostname g root hostname) then + warning (f_"hostname could not be set for this type of guest") + ++ | `InjectBalloonServer meth -> ++ (match get_virtio_win_handle "--inject-blnsvr" meth with ++ | None -> () ++ | Some t -> ++ if not (Inject_virtio_win.inject_blnsvr t) then ++ warning (f_"--inject-blnsvr: blnsvr.exe not found in \ ++ virtio-win source that you specified") ++ ) ++ + | `InjectQemuGA meth -> + (match get_virtio_win_handle "--inject-qemu-ga" meth with + | None -> () diff --git a/SOURCES/0015-Update-common-submodule.patch b/SOURCES/0015-Update-common-submodule.patch new file mode 100644 index 0000000..3f51270 --- /dev/null +++ b/SOURCES/0015-Update-common-submodule.patch @@ -0,0 +1,344 @@ +From a2faa7d57ea997e4194e95a5ccdf2b9e41376f55 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 6 Aug 2024 08:51:29 +0100 +Subject: [PATCH] Update common submodule + +Considerable changes have been made in virt-v2v to how powershell +scripts are run in Windows guests, and to qemu-ga installation (also +for Windows). This pulls in the following commits: + +Richard W.M. Jones (10): + mlcustomize: firstboot: Use Linux path for Powershell script path + mlcustomize: firstboot: Use powershell.exe instead of path + mlcustomize: firstboot: Use Powershell -NoProfile flag + mlcustomize: Revert delay installation of qemu-ga MSI + mldrivers/linux_kernels.ml: Prefix general information with ^info: + mlcustomize: Use Start-Process -Wait to run qemu-ga installer + mlcustomize: Add Firstboot.firstboot_dir function + mlcustomize: Place powershell scripts into \Temp + mlcustomize: Inject qemu-ga & blnsvr into /Temp + mlcustomize: Write qemu-ga log file name to log.txt + +(cherry picked from commit b8d57760ea9c9d3ec7a21ee41d74731ab81173df) +--- + common | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Submodule common 830cbdcf4..7b84a370e: +diff --git a/common/mlcustomize/firstboot.ml b/common/mlcustomize/firstboot.ml +index 5dc012340..3bbba714d 100644 +--- a/common/mlcustomize/firstboot.ml ++++ b/common/mlcustomize/firstboot.ml +@@ -239,7 +239,22 @@ WantedBy=%s + end + + module Windows = struct +- let rec install_service (g : Guestfs.guestfs) root = ++ (* Create and return the firstboot directory. *) ++ let create_firstboot_dir (g : Guestfs.guestfs) = ++ let rec loop firstboot_dir firstboot_dir_win = function ++ | [] -> firstboot_dir, firstboot_dir_win ++ | dir :: path -> ++ let firstboot_dir = ++ if firstboot_dir = "" then "/" ^ dir else firstboot_dir // dir in ++ let firstboot_dir_win = firstboot_dir_win ^ "\\" ^ dir in ++ let firstboot_dir = g#case_sensitive_path firstboot_dir in ++ g#mkdir_p firstboot_dir; ++ loop firstboot_dir firstboot_dir_win path ++ in ++ loop "" "C:" ["Program Files"; "Guestfs"; "Firstboot"] ++ ++ let rec install_service (g : Guestfs.guestfs) root ++ firstboot_dir firstboot_dir_win = + (* Either rhsrvany.exe or pvvxsvc.exe must exist. + * + * (Check also that it's not a dangling symlink but a real file). +@@ -254,20 +269,7 @@ module Windows = struct + error (f_"One of rhsrvany.exe or pvvxsvc.exe is missing in %s. One of them is required in order to install Windows firstboot scripts. You can get one by building rhsrvany (https://github.com/rwmjones/rhsrvany)") + (virt_tools_data_dir ()) in + +- (* Create a directory for firstboot files in the guest. *) +- let firstboot_dir, firstboot_dir_win = +- let rec loop firstboot_dir firstboot_dir_win = function +- | [] -> firstboot_dir, firstboot_dir_win +- | dir :: path -> +- let firstboot_dir = +- if firstboot_dir = "" then "/" ^ dir else firstboot_dir // dir in +- let firstboot_dir_win = firstboot_dir_win ^ "\\" ^ dir in +- let firstboot_dir = g#case_sensitive_path firstboot_dir in +- g#mkdir_p firstboot_dir; +- loop firstboot_dir firstboot_dir_win path +- in +- loop "" "C:" ["Program Files"; "Guestfs"; "Firstboot"] in +- ++ (* Create a directory for firstboot scripts in the guest. *) + g#mkdir_p (firstboot_dir // "scripts"); + + (* Copy pvvxsvc or rhsrvany to the guest. *) +@@ -339,11 +341,25 @@ echo uninstalling firstboot service + "PWD", REG_SZ firstboot_dir_win ]; + ] in + reg_import reg regedits +- ); +- +- firstboot_dir ++ ) + end + ++let firstboot_dir (g : Guestfs.guestfs) root = ++ let typ = g#inspect_get_type root in ++ ++ match typ with ++ | "linux" -> ++ let dir = Linux.firstboot_dir in ++ g#mkdir_p dir; ++ dir, None ++ ++ | "windows" -> ++ let dir, dir_win = Windows.create_firstboot_dir g in ++ dir, Some dir_win ++ ++ | _ -> ++ error (f_"guest type %s is not supported") typ ++ + let script_count = ref 0 + + let add_firstboot_script (g : Guestfs.guestfs) root ?(prio = 5000) name +@@ -363,7 +379,8 @@ let add_firstboot_script (g : Guestfs.guestfs) root ?(prio = 5000) name + g#chmod 0o755 filename + + | "windows", _ -> +- let firstboot_dir = Windows.install_service g root in ++ let firstboot_dir, firstboot_dir_win = Windows.create_firstboot_dir g in ++ Windows.install_service g root firstboot_dir firstboot_dir_win; + let filename = firstboot_dir // "scripts" // filename ^ ".bat" in + g#write filename (String.unix2dos content) + +@@ -382,21 +399,18 @@ let add_firstboot_powershell g root ?prio name code = + *) + assert (g#inspect_get_type root = "windows"); + +- let windows_systemroot = g#inspect_get_windows_systemroot root in +- +- (* Create the temporary directory to put the Powershell file. *) +- let tempdir = sprintf "%s/Temp" windows_systemroot in ++ (* Place the Powershell script into firstboot_dir/Temp *) ++ let firstboot_dir, firstboot_dir_win = Windows.create_firstboot_dir g in ++ let tempdir = sprintf "%s/Temp" firstboot_dir in + g#mkdir_p tempdir; ++ ++ let ps_path = sprintf "%s/%s.ps1" tempdir name in ++ let ps_path_win = sprintf "%s\\Temp\\%s.ps1" firstboot_dir_win name in + let code = String.concat "\r\n" code ^ "\r\n" in +- g#write (sprintf "%s/%s" tempdir name) code; ++ g#write ps_path code; + +- (* Powershell interpreter. Should we check this exists? XXX *) +- let ps_exe = +- windows_systemroot ^ +- "\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" in +- +- (* Windows path to the Powershell script. *) +- let ps_path = windows_systemroot ^ "\\Temp\\" ^ name in +- +- let fb = sprintf "%s -ExecutionPolicy ByPass -file %s" ps_exe ps_path in ++ (* Create a regular firstboot bat that just invokes powershell *) ++ let fb = ++ sprintf "powershell.exe -ExecutionPolicy ByPass -NoProfile -file \"%s\"" ++ ps_path_win in + add_firstboot_script g root ?prio name fb +diff --git a/common/mlcustomize/firstboot.mli b/common/mlcustomize/firstboot.mli +index 8231af658..34ff06901 100644 +--- a/common/mlcustomize/firstboot.mli ++++ b/common/mlcustomize/firstboot.mli +@@ -16,6 +16,23 @@ + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + *) + ++val firstboot_dir : Guestfs.guestfs -> string -> string * string option ++(** [firstboot_dir g root] ++ returns the path of the firstboot directory, creating it in ++ the guest if necessary. ++ ++ This returns the name of the directory as a guestfs path, and ++ optionally the name as a Windows path (only for Windows guests). ++ ++ For Linux this could be [/usr/lib/virt-sysprep, None] ++ ++ For Windows this could be ["/Program Files/Guestfs/Firstboot", ++ Some "C:\Program Files\Guestfs\Firstboot"] ++ ++ Additional files that are used during firstboot can be placed ++ in this directory, but be careful not to conflict with files ++ and scripts added by the firstboot process itself. *) ++ + val add_firstboot_script : Guestfs.guestfs -> string -> ?prio:int -> string -> + string -> unit + (** [add_firstboot_script g root prio name content] adds a firstboot +diff --git a/common/mlcustomize/inject_virtio_win.ml b/common/mlcustomize/inject_virtio_win.ml +index 4e0ed0e0e..afec1e456 100644 +--- a/common/mlcustomize/inject_virtio_win.ml ++++ b/common/mlcustomize/inject_virtio_win.ml +@@ -263,14 +263,28 @@ let rec inject_virtio_win_drivers ({ g } as t) reg = + } + ) + +-and inject_qemu_ga t = +- let msi_files = copy_qemu_ga t in ++and inject_qemu_ga ({ g; root } as t) = ++ (* Copy the qemu-ga MSI(s) to the guest. *) ++ let dir, dir_win = Firstboot.firstboot_dir g root in ++ let dir_win = Option.value dir_win ~default:dir in ++ let tempdir = sprintf "%s/Temp" dir in ++ let tempdir_win = sprintf "%s\\Temp" dir_win in ++ g#mkdir_p tempdir; ++ ++ let msi_files = copy_qemu_ga t tempdir in + if msi_files <> [] then +- configure_qemu_ga t msi_files; ++ configure_qemu_ga t tempdir_win msi_files; + msi_files <> [] (* return true if we found some qemu-ga MSI files *) + +-and inject_blnsvr t = +- let files = copy_blnsvr t in ++and inject_blnsvr ({ g; root } as t) = ++ (* Copy the files to the guest. *) ++ let dir, dir_win = Firstboot.firstboot_dir g root in ++ let dir_win = Option.value dir_win ~default:dir in ++ let tempdir = sprintf "%s/Temp" dir in ++ let tempdir_win = sprintf "%s\\Temp" dir_win in ++ g#mkdir_p tempdir; ++ ++ let files = copy_blnsvr t tempdir in + match files with + | [] -> false (* Didn't find or install anything. *) + +@@ -278,7 +292,7 @@ and inject_blnsvr t = + * drivers/by-driver). Pick the first. + *) + | blnsvr :: _ -> +- configure_blnsvr t blnsvr; ++ configure_blnsvr t tempdir_win blnsvr; + true + + and add_guestor_to_registry t ((g, root) as reg) drv_name drv_pciid = +@@ -360,13 +374,13 @@ and copy_drivers t driverdir = + (fun () -> + error (f_"root directory ‘/’ is missing from the virtio-win directory or ISO.\n\nThis should not happen and may indicate that virtio-win or virt-v2v is broken in some way. Please report this as a bug with a full debug log.")) + +-and copy_qemu_ga t = +- copy_from_virtio_win t "/" "/" (virtio_iso_path_matches_qemu_ga t) ++and copy_qemu_ga t tempdir = ++ copy_from_virtio_win t "/" tempdir (virtio_iso_path_matches_qemu_ga t) + (fun () -> + error (f_"root directory ‘/’ is missing from the virtio-win directory or ISO.\n\nThis should not happen and may indicate that virtio-win or virt-v2v is broken in some way. Please report this as a bug with a full debug log.")) + +-and copy_blnsvr t = +- copy_from_virtio_win t "/" "/" (virtio_iso_path_matches_blnsvr t) ++and copy_blnsvr t tempdir = ++ copy_from_virtio_win t "/" tempdir (virtio_iso_path_matches_blnsvr t) + (fun () -> + error (f_"root directory ‘/’ is missing from the virtio-win directory or ISO.\n\nThis should not happen and may indicate that virtio-win or virt-v2v is broken in some way. Please report this as a bug with a full debug log.")) + +@@ -575,44 +589,35 @@ and copy_from_libosinfo { g; i_osinfo; i_arch } destdir = + ) driver.Libosinfo.files + with Not_found -> [] + +-and configure_qemu_ga t files = ++(* Install qemu-ga. [files] is the non-empty list of possible qemu-ga ++ * installers we detected. ++ *) ++and configure_qemu_ga t tempdir_win files = ++ let script = ref [] in ++ let add = List.push_back script in ++ ++ add "# Virt-v2v script which installs QEMU Guest Agent"; ++ add ""; ++ add "# Uncomment this line for lots of debug output."; ++ add "# Set-PSDebug -Trace 2"; ++ add ""; ++ add "Write-Host Installing QEMU Guest Agent"; ++ add ""; ++ add "# Run qemu-ga installers"; + List.iter ( +- fun msi_path -> +- (* Windows is a trashfire. +- * https://stackoverflow.com/a/18730884 +- * https://bugzilla.redhat.com/show_bug.cgi?id=1895323 +- *) +- let psh_script = ref [] in +- let add = List.push_back psh_script in ++ fun msi -> ++ add (sprintf "Write-Host \"Writing log to %s\\%s.log\"" ++ tempdir_win msi); ++ (* [`] is an escape char for quotes *) ++ add (sprintf "Start-Process -Wait -FilePath \"%s\\%s\" -ArgumentList \"/norestart\",\"/qn\",\"/l+*vx\",\"`\"%s\\%s.log`\"\"" ++ tempdir_win msi tempdir_win msi) ++ ) files; + +- add "# Uncomment this line for lots of debug output."; +- add "# Set-PSDebug -Trace 2"; +- add ""; +- add "Write-Host Removing any previously scheduled qemu-ga installation"; +- add "schtasks.exe /Delete /TN Firstboot-qemu-ga /F"; +- add ""; +- add (sprintf +- "Write-Host Scheduling delayed installation of qemu-ga from %s" +- msi_path); +- add "$d = (get-date).AddSeconds(120)"; +- add "$dtfinfo = [System.Globalization.DateTimeFormatInfo]::CurrentInfo"; +- add "$sdp = $dtfinfo.ShortDatePattern"; +- add "$sdp = $sdp -replace 'y+', 'yyyy'"; +- add "$sdp = $sdp -replace 'M+', 'MM'"; +- add "$sdp = $sdp -replace 'd+', 'dd'"; +- add "schtasks.exe /Create /SC ONCE `"; +- add " /ST $d.ToString('HH:mm') /SD $d.ToString($sdp) `"; +- add " /RU SYSTEM /TN Firstboot-qemu-ga `"; +- add (sprintf " /TR \"C:\\%s /forcerestart /qn /l+*vx C:\\%s.log\"" +- msi_path msi_path); ++ Firstboot.add_firstboot_powershell t.g t.root "install-qemu-ga" !script + +- Firstboot.add_firstboot_powershell t.g t.root +- (sprintf "install-%s.ps1" msi_path) !psh_script; +- ) files +- +-and configure_blnsvr t blnsvr = ++and configure_blnsvr t tempdir_win blnsvr = + let cmd = sprintf "\ + @echo off\n\ + echo Installing %s\n\ +- c:\\%s -i\n" blnsvr blnsvr in +- Firstboot.add_firstboot_script t.g t.root (sprintf "install-%s" blnsvr) cmd ++ \"%s\\%s\" -i\n" blnsvr tempdir_win blnsvr in ++ Firstboot.add_firstboot_script t.g t.root "install-blnsvr" cmd +diff --git a/common/mldrivers/linux_kernels.ml b/common/mldrivers/linux_kernels.ml +index 23ff76a55..e0b6b8a00 100644 +--- a/common/mldrivers/linux_kernels.ml ++++ b/common/mldrivers/linux_kernels.ml +@@ -102,7 +102,7 @@ let detect_kernels (g : G.guestfs) root bootloader apps = + ) apps in + if verbose () then ( + let names = List.map (fun { G.app2_name = name } -> name) kernel_pkgs in +- eprintf "candidate kernel packages in this guest: %s%!\n" ++ eprintf "info: candidate kernel packages in this guest: %s%!\n" + (String.concat " " names) + ); + List.filter_map ( +@@ -306,7 +306,7 @@ let detect_kernels (g : G.guestfs) root bootloader apps = + ) kernel_pkgs in + + if verbose () then ( +- eprintf "installed kernel packages in this guest:\n"; ++ eprintf "info: installed kernel packages in this guest:\n"; + List.iter (print_kernel_info stderr "\t") installed_kernels; + flush stderr + ); +@@ -343,7 +343,7 @@ let detect_kernels (g : G.guestfs) root bootloader apps = + ) vmlinuzes in + + if verbose () then ( +- eprintf "kernels offered by the bootloader in this guest (first in list is default):\n"; ++ eprintf "info: kernels offered by the bootloader in this guest (first in list is default):\n"; + List.iter (print_kernel_info stderr "\t") bootloader_kernels; + flush stderr + ); diff --git a/SOURCES/0016-Update-common-submodule.patch b/SOURCES/0016-Update-common-submodule.patch new file mode 100644 index 0000000..2fa5601 --- /dev/null +++ b/SOURCES/0016-Update-common-submodule.patch @@ -0,0 +1,57 @@ +From 924bf9e6b76fa6c910c1708a20e0716384fbbe07 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Sat, 10 Aug 2024 14:17:51 +0100 +Subject: [PATCH] Update common submodule + +Further refinements to Windows firstboot code. + +Richard W.M. Jones (2): + mlcustomize: Add some comments to firstboot batch file + mlcustomize: Reboot Windows between each firstboot script + +(cherry picked from commit d7719d6954f48c3a395da7486bcf55fbac66ea07) +--- + common | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Submodule common 7b84a370e..a78839676: +diff --git a/common/mlcustomize/firstboot.ml b/common/mlcustomize/firstboot.ml +index 3bbba714d..52e76401e 100644 +--- a/common/mlcustomize/firstboot.ml ++++ b/common/mlcustomize/firstboot.ml +@@ -278,6 +278,9 @@ module Windows = struct + (* Write a firstboot.bat control script which just runs the other + * scripts in the directory. Note we need to use CRLF line endings + * in this script. ++ * ++ * XXX It would be better to use powershell here. For some ideas see ++ * https://github.com/HCK-CI/HLK-Setup-Scripts/ + *) + let firstboot_script = sprintf "\ + @echo off +@@ -299,6 +302,7 @@ if not exist \"%%scripts_done%%\" ( + mkdir \"%%scripts_done%%\" + ) + ++:: Pick the next script to run. + for %%%%f in (\"%%scripts%%\"\\*.bat) do ( + echo running \"%%%%f\" + move \"%%%%f\" \"%%scripts_done%%\" +@@ -307,8 +311,17 @@ for %%%%f in (\"%%scripts%%\"\\*.bat) do ( + set elvl=!errorlevel! + echo .... exit code !elvl! + popd ++ ++ :: Reboot the computer. This is necessary to free any locked ++ :: files which may prevent later scripts from running. ++ shutdown /r /t 0 /y ++ ++ :: Exit the script (in case shutdown returns before rebooting). ++ :: On next boot, the whole firstboot service will be called again. ++ exit /b + ) + ++:: Fallthrough here if there are no scripts. + echo uninstalling firstboot service + \"%%firstboot%%\\%s\" -s firstboot uninstall + " firstboot_dir_win srvany in diff --git a/SOURCES/copy-patches.sh b/SOURCES/copy-patches.sh index b40867c..13343e8 100755 --- a/SOURCES/copy-patches.sh +++ b/SOURCES/copy-patches.sh @@ -7,7 +7,7 @@ set -e # ./copy-patches.sh project=guestfs-tools -rhel_version=9.4 +rhel_version=9.5 # Check we're in the right directory. if [ ! -f $project.spec ]; then diff --git a/SPECS/guestfs-tools.spec b/SPECS/guestfs-tools.spec index 6a5f7a2..7e56904 100644 --- a/SPECS/guestfs-tools.spec +++ b/SPECS/guestfs-tools.spec @@ -19,7 +19,7 @@ Summary: Tools to access and modify virtual machine disk images Name: guestfs-tools Version: 1.51.6 -Release: 2%{?dist} +Release: 5%{?dist} License: GPL-2.0-or-later AND LGPL-2.0-or-later # Build only for architectures that have a kernel @@ -45,13 +45,25 @@ Source2: libguestfs.keyring Source3: copy-patches.sh # Patches are maintained in the following repository: -# https://github.com/rwmjones/guestfs-tools/commits/rhel-9.4 +# https://github.com/rwmjones/guestfs-tools/commits/rhel-9.5 # Patches. Patch0001: 0001-Update-common-submodule.patch Patch0002: 0002-builder-Add-a-test-of-the-chown-parameter.patch Patch0003: 0003-RHEL-Reject-use-of-libguestfs-winsupport-features-ex.patch Patch0004: 0004-RHEL-builder-Disable-opensuse-repository.patch +Patch0005: 0005-inspector-inspector.c-Remove-extra-cases-covered-by-.patch +Patch0006: 0006-m4-guestfs-c.m4-Re-add-.-configure-enable-werror.patch +Patch0007: 0007-make-fs-Use-S-option-with-z.patch +Patch0008: 0008-sysprep-Make-clearer-that-we-do-not-support-Windows.patch +Patch0009: 0009-build-Use-DISTCLEANFILES-for-a-generated-but-few-rar.patch +Patch0010: 0010-Fix-bytecode-compilation-to-output-whole-exe-instead.patch +Patch0011: 0011-po-docs-Run-po4a-translate-and-sed-commands-separate.patch +Patch0012: 0012-po-docs-Remove-virt-dib-from-list-of-translated-man-.patch +Patch0013: 0013-Update-common-submodule.patch +Patch0014: 0014-customize-Implement-inject-blnsvr-operation.patch +Patch0015: 0015-Update-common-submodule.patch +Patch0016: 0016-Update-common-submodule.patch %if 0%{patches_touch_autotools} BuildRequires: autoconf, automake, libtool, gettext-devel @@ -410,6 +422,16 @@ end %changelog +* Tue Aug 27 2024 Richard W.M. Jones - 1.51.6-5 +- Reboot Windows between each firstboot script to improve reliability + resolves: RHEL-55759 + +* Thu May 16 2024 Richard W.M. Jones - 1.51.6-4 +- Add support for nbd+unix:// URIs + resolves: RHEL-33956 +- customize: Implement --inject-blnsvr operation + resolves: RHEL-36634 + * Fri Jan 19 2024 Richard W.M. Jones - 1.51.6-2 - Rebase to guestfs-tools 1.51.6 - Implement --key all:...