From 1416614d194152ee52f26e33af3822fae5a41de5 Mon Sep 17 00:00:00 2001 From: Andrew Lukoshko Date: Mon, 8 Jun 2026 12:45:15 +0000 Subject: [PATCH] import CS virt-v2v-2.10.0-7.el10 --- .gitignore | 16 +- ...ify-server-certificate-docs-to-alpha.patch | 47 - ...d-Document-Windows-vTPM-and-BitLocke.patch | 46 + ....ml-Fix-escaping-of-export-.-paramet.patch | 67 - ...-debugging-around-remote_file_exists.patch | 24 + ...gure_pnputil_install-script-to-check.patch | 76 - ...ut-ssh.ml-Fix-Ssh.remote_file_exists.patch | 47 + 0004-Update-common-submodule.patch | 120 + 0004-Update-the-common-submodule.patch | 50 - ...OR_NO_MORE_ITEMS-status-from-PnPUtil.patch | 27 - ...pection-with-filesystems-information.patch | 177 + ...e-virt-v2v-inspector-output-with-fil.patch | 131 + ...rsion-of-libnbd-nbdcopy-in-debug-out.patch | 50 - ...-convert_linux.ml-Add-debian-12-UEFI.patch | 9 +- ...vddk-Remove-io-vddk-noextents-option.patch | 101 - ...sh-vddk-file-Add-nbdkit-count-filter.patch | 114 - ...-double-uri_encode-dcPath-and-dsName.patch | 3 +- ...it-file-cache-none-with-reduce-memor.patch | 112 + ...o-disk-to-allow-disk-names-to-be-ove.patch | 233 - ...linux.ml-Condense-device-regex-handl.patch | 36 + ...output-Add-optional-create-parameter.patch | 141 - ...place-etc-crypttab-dev-sdX-with-UUID.patch | 75 + ...o-create-false-to-avoid-disk-creatio.patch | 119 - ..._GNU_GETTEXT-with-simpler-LIBINTL-ch.patch | 4099 ++++++++++++++ ...eferences-to-virtio-win-osinfo-usage.patch | 44 + ...update-virtio-win-exploded-tree-docs.patch | 30 + ...in-pass-explicit-guestfs-search-path.patch | 54 + 0016-output-introduce-disk_name-helper.patch | 85 + 0017-output-Replace-in-VM-names-with-_.patch | 71 + 0018-RHEL-Remove-input-from-Xen.patch | 543 -- ...e-guest-names-in-metadata-file-paths.patch | 55 + 0019-RHEL-Remove-o-glance.patch | 239 - ...put-sanitize-VM-names-in-libvirt-XML.patch | 27 + ...RHEL-Fixes-for-libguestfs-winsupport.patch | 44 +- 0021-RHEL-Remove-block-driver-option.patch | 157 - ...correct-qemu-binary-for-o-qemu-mode-.patch | 6 +- ...virt-o-ovirt-upload-and-o-vdsm-modes.patch | 4712 ----------------- ...-the-qemu-boot-oo-qemu-boot-option-R.patch | 14 +- ...-supported-sound-cards-to-match-RHEL.patch | 6 +- ...sk-force-VNC-as-display-RHBZ-1372671.patch | 6 +- ...before-installing-virtio-win-drivers.patch | 24 - ...-for-supported-v2v-hypervisors-guest.patch | 2 +- 0025-v2v-Fix-SELinux-relabelling.patch | 81 - ...d-on-libguestfs-1.56.1-2.el10-for-gu.patch | 25 - ...=> 0026-RHEL-tests-Remove-btrfs-test.patch | 4 +- ...-about-virt-v2v-in-place-not-being-s.patch | 42 +- 0027-convert-Model-target-boot-device.patch | 98 - ...ut.ml-Remove-reduce-memory-pressure-.patch | 26 +- ...order-depending-on-target-boot-devic.patch | 184 - ...atch => 0029-Update-common-submodule.patch | 11 +- ...-target-boot-device-for-Linux-guests.patch | 78 - ...rt-linux-properly-match-etc-crypttab.patch | 33 + ...evirt-Add-bootOrder-to-Kubevirt-YAML.patch | 66 - ...-GRUB-signature-first-to-identify-bo.patch | 239 - ...s.ml-Fix-formatting-of-debug-message.patch | 34 - ...Fix-ESP-conversion-if-C-Windows-Temp.patch | 69 - 0034-Update-common-submodule.patch | 34 - ....ml-Handle-subdirectories-in-nbdkit-.patch | 118 - ....ml-Pass-only-longest-prefix-to-vddk.patch | 127 - 0038-v2v-Add-memsize-and-smp-options.patch | 364 -- ...-more-description-for-memsize-option.patch | 60 - ...tion-to-disable-fstrim-during-conver.patch | 303 -- ...top-using-maxmem-xfs_repair-m-option.patch | 52 - 0045-Update-common-submodule.patch | 53 - copy-patches.sh | 2 +- gating.yaml | 7 + libguestfs.keyring | Bin 0 -> 2823 bytes rpminspect.yaml | 10 + sources | 4 +- tests/basic-test.sh | 13 + tests/tests.yml | 13 + virt-v2v-2.8.1.tar.gz.sig | 17 - virt-v2v.spec | 311 +- 73 files changed, 5589 insertions(+), 8928 deletions(-) delete mode 100644 0001-docs-Move-oo-verify-server-certificate-docs-to-alpha.patch create mode 100644 0001-docs-virt-v2v.pod-Document-Windows-vTPM-and-BitLocke.patch delete mode 100644 0002-input-input_vddk.ml-Fix-escaping-of-export-.-paramet.patch create mode 100644 0002-input-ssh.ml-Add-debugging-around-remote_file_exists.patch delete mode 100644 0003-Modify-configure_pnputil_install-script-to-check.patch create mode 100644 0003-input-ssh.ml-Fix-Ssh.remote_file_exists.patch create mode 100644 0004-Update-common-submodule.patch delete mode 100644 0004-Update-the-common-submodule.patch delete mode 100644 0005-Ignore-ERROR_NO_MORE_ITEMS-status-from-PnPUtil.patch create mode 100644 0005-v2v-Enhance-inspection-with-filesystems-information.patch create mode 100644 0006-inspector-Enhance-virt-v2v-inspector-output-with-fil.patch delete mode 100644 0006-v2v-Print-the-version-of-libnbd-nbdcopy-in-debug-out.patch rename 0040-convert-convert_linux.ml-Add-debian-12-UEFI.patch => 0007-convert-convert_linux.ml-Add-debian-12-UEFI.patch (86%) delete mode 100644 0007-vddk-Remove-io-vddk-noextents-option.patch delete mode 100644 0008-curl-ssh-vddk-file-Add-nbdkit-count-filter.patch rename 0041-input-vcenter-double-uri_encode-dcPath-and-dsName.patch => 0008-input-vcenter-double-uri_encode-dcPath-and-dsName.patch (92%) create mode 100644 0009-lib-Replace-nbdkit-file-cache-none-with-reduce-memor.patch delete mode 100644 0009-o-kubevirt-Add-oo-disk-to-allow-disk-names-to-be-ove.patch create mode 100644 0010-convert-convert_linux.ml-Condense-device-regex-handl.patch delete mode 100644 0010-output-Add-optional-create-parameter.patch create mode 100644 0011-convert-linux-replace-etc-crypttab-dev-sdX-with-UUID.patch delete mode 100644 0011-o-kubevirt-Add-oo-create-false-to-avoid-disk-creatio.patch create mode 100644 0012-build-replace-AM_GNU_GETTEXT-with-simpler-LIBINTL-ch.patch create mode 100644 0013-docs-Drop-references-to-virtio-win-osinfo-usage.patch create mode 100644 0014-docs-update-virtio-win-exploded-tree-docs.patch create mode 100644 0015-ocaml-link.sh.in-pass-explicit-guestfs-search-path.patch create mode 100644 0016-output-introduce-disk_name-helper.patch create mode 100644 0017-output-Replace-in-VM-names-with-_.patch delete mode 100644 0018-RHEL-Remove-input-from-Xen.patch create mode 100644 0018-output-sanitize-guest-names-in-metadata-file-paths.patch delete mode 100644 0019-RHEL-Remove-o-glance.patch create mode 100644 0019-output-sanitize-VM-names-in-libvirt-XML.patch rename 0012-RHEL-Fixes-for-libguestfs-winsupport.patch => 0020-RHEL-Fixes-for-libguestfs-winsupport.patch (82%) delete mode 100644 0021-RHEL-Remove-block-driver-option.patch rename 0013-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch => 0021-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch (87%) delete mode 100644 0022-RHEL-Remove-o-ovirt-o-ovirt-upload-and-o-vdsm-modes.patch rename 0014-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch => 0022-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch (88%) rename 0015-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch => 0023-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch (83%) rename 0016-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch => 0024-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch (85%) delete mode 100644 0024-remove-timeout-before-installing-virtio-win-drivers.patch rename 0017-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch => 0025-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch (97%) delete mode 100644 0025-v2v-Fix-SELinux-relabelling.patch delete mode 100644 0026-RHEL-10-m4-Depend-on-libguestfs-1.56.1-2.el10-for-gu.patch rename 0020-RHEL-tests-Remove-btrfs-test.patch => 0026-RHEL-tests-Remove-btrfs-test.patch (86%) rename 0023-RHEL-Add-warning-about-virt-v2v-in-place-not-being-s.patch => 0027-RHEL-Add-warning-about-virt-v2v-in-place-not-being-s.patch (74%) delete mode 100644 0027-convert-Model-target-boot-device.patch rename 0035-RHEL-output-output.ml-Remove-cache-none.patch => 0028-RHEL-output-output.ml-Remove-reduce-memory-pressure-.patch (59%) delete mode 100644 0028-output-Add-boot-order-depending-on-target-boot-devic.patch rename 0042-Update-common-submodule.patch => 0029-Update-common-submodule.patch (84%) delete mode 100644 0029-convert-Detect-target-boot-device-for-Linux-guests.patch create mode 100644 0030-convert-linux-properly-match-etc-crypttab.patch delete mode 100644 0030-output-kubevirt-Add-bootOrder-to-Kubevirt-YAML.patch delete mode 100644 0031-convert-Look-for-GRUB-signature-first-to-identify-bo.patch delete mode 100644 0032-lib-types.ml-Fix-formatting-of-debug-message.patch delete mode 100644 0033-convert-windows-Fix-ESP-conversion-if-C-Windows-Temp.patch delete mode 100644 0034-Update-common-submodule.patch delete mode 100644 0036-input-input_vddk.ml-Handle-subdirectories-in-nbdkit-.patch delete mode 100644 0037-input-input_vddk.ml-Pass-only-longest-prefix-to-vddk.patch delete mode 100644 0038-v2v-Add-memsize-and-smp-options.patch delete mode 100644 0039-docs-Add-more-description-for-memsize-option.patch delete mode 100644 0043-Add-no-fstrim-option-to-disable-fstrim-during-conver.patch delete mode 100644 0044-convert-Stop-using-maxmem-xfs_repair-m-option.patch delete mode 100644 0045-Update-common-submodule.patch create mode 100755 gating.yaml create mode 100644 libguestfs.keyring create mode 100644 rpminspect.yaml create mode 100755 tests/basic-test.sh create mode 100644 tests/tests.yml delete mode 100644 virt-v2v-2.8.1.tar.gz.sig diff --git a/.gitignore b/.gitignore index 4ed584f..8203505 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,14 @@ -libguestfs.keyring -virt-v2v-2.8.1.tar.gz +*~ + +# RPM target directories +/x86_64 + +# Version-dependent build artifacts +/.build-*.log +/virt-v2v-v*/ +/virt-v2v-*.src.rpm +/results_virt-v2v/ + +# Source +/virt-v2v-*.tar.gz +/virt-v2v-*.tar.gz.sig diff --git a/0001-docs-Move-oo-verify-server-certificate-docs-to-alpha.patch b/0001-docs-Move-oo-verify-server-certificate-docs-to-alpha.patch deleted file mode 100644 index 427ccb7..0000000 --- a/0001-docs-Move-oo-verify-server-certificate-docs-to-alpha.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 7566e3e433bd6ea44785b08164506fd013fe2b51 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Tue, 8 Jul 2025 11:11:48 +0100 -Subject: [PATCH] docs: Move -oo verify-server-certificate docs to alphabetical - place - -This option wasn't in alphabetical order. - -(cherry picked from commit 378967fc4984af4f06c586886a1148aebede8cff) ---- - docs/virt-v2v.pod | 16 ++++++++-------- - 1 file changed, 8 insertions(+), 8 deletions(-) - -diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod -index 3cfb0948..3eefe404 100644 ---- a/docs/virt-v2v.pod -+++ b/docs/virt-v2v.pod -@@ -611,14 +611,6 @@ volume property. - When using I<-o qemu> only, this boots the guest immediately after - virt-v2v finishes. - --=item B<-oo verify-server-certificate> -- --=item B<-oo verify-server-certificate=>C -- --For I<-o openstack> (L) only, this can --be used to disable SSL certification validation when connecting to --OpenStack by specifying I<-oo verify-server-certificate=false>. -- - =item B<-oo os->*B<=>* - - For I<-o openstack> (L) only, set optional -@@ -736,6 +728,14 @@ The OVF format understood by oVirt REST API. - For backward compatibility the default is I, but this may change in - the future. - -+=item B<-oo verify-server-certificate> -+ -+=item B<-oo verify-server-certificate=>C -+ -+For I<-o openstack> (L) only, this can -+be used to disable SSL certification validation when connecting to -+OpenStack by specifying I<-oo verify-server-certificate=false>. -+ - =item B<-op> file - - Supply a file containing a password to be used when connecting to the diff --git a/0001-docs-virt-v2v.pod-Document-Windows-vTPM-and-BitLocke.patch b/0001-docs-virt-v2v.pod-Document-Windows-vTPM-and-BitLocke.patch new file mode 100644 index 0000000..8b799ad --- /dev/null +++ b/0001-docs-virt-v2v.pod-Document-Windows-vTPM-and-BitLocke.patch @@ -0,0 +1,46 @@ +From 859c43b1eb81cfdcb5f481b571e2c387860f8a27 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 13 Jan 2026 12:33:11 +0000 +Subject: [PATCH] docs/virt-v2v.pod: Document Windows vTPM and BitLocker + Recovery + +Reported-by: Ming Xie +Fixes: https://issues.redhat.com/browse/RHEL-103915 +--- + docs/virt-v2v.pod | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod +index a3cacb82..f751f4e7 100644 +--- a/docs/virt-v2v.pod ++++ b/docs/virt-v2v.pod +@@ -1600,6 +1600,29 @@ L + and + L + ++=head2 Windows: "Enter the recovery key for this drive" ++ ++After conversion, you may be presented with a Windows boot screen showing: ++ ++ BitLocker recovery ++ Enter the recovery key for this drive ++ [|___________________] ++ ++(See screenshot on L) ++ ++This happens when the Windows BitLocker disk encryption key is ++contained in the VMware Virtual Trusted Platform Module (vTPM). The ++vTPM is working I. It is preventing the ++encrypted disk from being moved from one machine to another by storing ++the encryption key in trusted storage on the source. By design, we ++cannot access or move this key to the target. ++ ++To start the VM you will need to enter the BitLocker recovery key. ++This will also register the disk against the new vTPM on the target, ++so it should only be necessary to do this once. ++ ++For help finding the recovery key: L ++ + =head2 Networks and bridges + + Guests are usually connected to one or more networks, and when diff --git a/0002-input-input_vddk.ml-Fix-escaping-of-export-.-paramet.patch b/0002-input-input_vddk.ml-Fix-escaping-of-export-.-paramet.patch deleted file mode 100644 index 59d734b..0000000 --- a/0002-input-input_vddk.ml-Fix-escaping-of-export-.-paramet.patch +++ /dev/null @@ -1,67 +0,0 @@ -From c2c829eb22add09de338da065214c9b6aced42e2 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Thu, 10 Jul 2025 09:13:54 +0100 -Subject: [PATCH] input/input_vddk.ml: Fix escaping of export=... parameter - -Commit b49ee14368 ("input: vddk: Use single nbdkit-vddk-plugin -instance with exports") switched to using the new nbdkit-vddk-plugin -export feature, where we can run a single nbdkit instance and choose -which disk we want to see using the NBD protocol exportname feature. - -As part of this, we are required to set an export parameter, which is -a wildcard that all exportnames must match. This is a safety feature -so that nbdkit will only serve a subset of the VMware files, instead -of allowing anyone who can attach to the nbdkit socket to read any -file on the server. (The socket is further protected by not being -readable to users other than the user running virt-v2v.) - -We compute this by doing a longest common prefix of all the disk names -associated with a guest. - -Ming Xie found a case where this failed. Given two names called: - - "[datastore1 (3)] esx8.0-win11-efi-secureboot-with-vtpm-and-turn-on-bitlocker/esx8.0-win11-efi-secureboot-with-vtpm-and-turn-on-bitlocker.vmdk" - "[datastore1 (3)] esx8.0-win11-efi-secureboot-with-vtpm-and-turn-on-bitlocker/esx8.0-win11-efi-secureboot-with-vtpm-and-turn-on-bitlocker_1.vmdk" - -we computed the wildcard: - - "\[datastore1 (3)\] esx8.0-win11-efi-secureboot-with-vtpm-and-turn-on-bitlocker/esx8.0-win11-efi-secureboot-with-vtpm-and-turn-on-bitlocker\*.vmdk" - -However the escaping is wrong. We correctly escape the '[' and ']' -characters, but incorrectly escape the '*' character (which is meant -to be a wildcard). - -This caused failure to convert when a guest has multiple disks and -nbdkit >= 1.44 is installed. - -Reported-by: Ming Xie -Fixes: commit 076727e55f4d4fed246097d3f89ebfe83e3de88f -Fixes: https://issues.redhat.com/browse/RHEL-102734 -(cherry picked from commit 5461976e229873a203062848c0de30e70067b3fb) ---- - input/input_vddk.ml | 5 ++--- - 1 file changed, 2 insertions(+), 3 deletions(-) - -diff --git a/input/input_vddk.ml b/input/input_vddk.ml -index b70d76fb..39356129 100644 ---- a/input/input_vddk.ml -+++ b/input/input_vddk.ml -@@ -446,7 +446,7 @@ See also the virt-v2v-input-vmware(1) manual.") libNN - let wildcard = - match files with - | [] -> assert false (* can't happen, see assert above *) -- | [f] -> f -+ | [f] -> fnmatch_escape f - | files -> - (* Calculate the longest common prefix across all the files, - * then set the wildcard to this. -@@ -454,8 +454,7 @@ See also the virt-v2v-input-vmware(1) manual.") libNN - * XXX Is every file we want to read called *.vmdk? - *) - let prefix = String.longest_common_prefix files in -- prefix ^ "*.vmdk" in -- let wildcard = fnmatch_escape wildcard in -+ fnmatch_escape prefix ^ "*.vmdk" in - - let socket = sprintf "%s/in0" dir in - On_exit.unlink socket; diff --git a/0002-input-ssh.ml-Add-debugging-around-remote_file_exists.patch b/0002-input-ssh.ml-Add-debugging-around-remote_file_exists.patch new file mode 100644 index 0000000..b8d0c5d --- /dev/null +++ b/0002-input-ssh.ml-Add-debugging-around-remote_file_exists.patch @@ -0,0 +1,24 @@ +From b6d5f9dc47fa57836215a698a1ed9df20f90dabc Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 13 Jan 2026 14:11:49 +0000 +Subject: [PATCH] input/ssh.ml: Add debugging around remote_file_exists + function + +It's hard to tell when this function was called and if it returned +success or failure, so add some debugging. +--- + input/ssh.ml | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/input/ssh.ml b/input/ssh.ml +index 9b93df7b..51276156 100644 +--- a/input/ssh.ml ++++ b/input/ssh.ml +@@ -60,4 +60,6 @@ let remote_file_exists ~server ?port ?user ?password path = + * prove the remote file exists. + *) + let cmd = [ Config.nbdinfo; "--can"; "connect"; uri ] in +- run_command cmd = 0 ++ let r = run_command cmd = 0 in ++ debug "ssh: remote_file_exists: testing %s -> %b" path r; ++ r diff --git a/0003-Modify-configure_pnputil_install-script-to-check.patch b/0003-Modify-configure_pnputil_install-script-to-check.patch deleted file mode 100644 index 2cefb6d..0000000 --- a/0003-Modify-configure_pnputil_install-script-to-check.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 5fda965d292bd1b5b62e47d357ddf046dfa007b6 Mon Sep 17 00:00:00 2001 -From: Vadim Rozenfeld -Date: Thu, 10 Jul 2025 10:12:56 +1000 -Subject: [PATCH] Modify configure_pnputil_install script to check pending - reboot status and report PnPUtil execution status - -This change adds checks for system reboot status and reports -the result of PnPUtil driver installation attempt. - -Related: https://issues.redhat.com/browse/RHEL-100682 - -Signed-off-by: Vadim Rozenfeld -(cherry picked from commit 594b05d6940c8719167d10c0cdfaa253349060ab) ---- - convert/convert_windows.ml | 48 +++++++++++++++++++++++++++++++++++--- - 1 file changed, 45 insertions(+), 3 deletions(-) - -diff --git a/convert/convert_windows.ml b/convert/convert_windows.ml -index 71e867a5..8f0ff87b 100644 ---- a/convert/convert_windows.ml -+++ b/convert/convert_windows.ml -@@ -396,9 +396,51 @@ let convert (g : G.guestfs) source inspect i_firmware - and configure_pnputil_install () = - let fb_script = "@echo off\n\ - \n\ -- echo Wait for VirtIO drivers to be installed\n\ -- %systemroot%\\Sysnative\\PnPutil -i -a \ -- %systemroot%\\Drivers\\Virtio\\*.inf" in -+ setlocal EnableDelayedExpansion\n\ -+ set inf_dir=%systemroot%\\Drivers\\Virtio\\\n\ -+ echo Installing drivers from %inf_dir%\n\ -+ set REBOOT_PENDING=0\n\ -+ \n\ -+ timeout /t 10 /nobreak\n\ -+ \n\ -+ reg query \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Auto Update\\RebootRequired\"\n\ -+ if %errorlevel%==0 (\n\ -+ echo Windows Update: Reboot required.\n\ -+ set REBOOT_PENDING=1\n\ -+ )\n\ -+ \n\ -+ reg query \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Component Based Servicing\\RebootPending\"\n\ -+ if %errorlevel%==0 (\n\ -+ echo CBS: Reboot required.\n\ -+ set REBOOT_PENDING=1\n\ -+ )\n\ -+ \n\ -+ reg query \"HKLM\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\" /v PendingFileRenameOperations\n\ -+ if %errorlevel%==0 (\n\ -+ echo Session Manager: Reboot required.\n\ -+ set REBOOT_PENDING=1\n\ -+ )\n\ -+ \n\ -+ if \"%REBOOT_PENDING%\"==\"1\" (\n\ -+ echo A reboot is pending.\n\ -+ exit /b 249\n\ -+ ) else (\n\ -+ echo No pending reboot detected.\n\ -+ )\n\ -+ \n\ -+ for %%f in (\"%inf_dir%*.inf\") do (\n\ -+ echo Installing: %%~nxf.\n\ -+ %systemroot%\\Sysnative\\PnPutil -i -a \"%%f\"\n\ -+ if !errorlevel! NEQ 0 (\n\ -+ echo Failed to install %%~nxf.\n\ -+ exit /b 249\n\ -+ ) else (\n\ -+ echo Successfully installed %%~nxf.\n\ -+ )\n\ -+ )\n\ -+ echo All drivers installed successfully.\n\ -+ exit /b 0\n\ -+ )" in - - (* Set priority higher than that of "network-configure" firstboot script. *) - Firstboot.add_firstboot_script g inspect.i_root ~prio:2000 diff --git a/0003-input-ssh.ml-Fix-Ssh.remote_file_exists.patch b/0003-input-ssh.ml-Fix-Ssh.remote_file_exists.patch new file mode 100644 index 0000000..eeeacac --- /dev/null +++ b/0003-input-ssh.ml-Fix-Ssh.remote_file_exists.patch @@ -0,0 +1,47 @@ +From 986edd3e609cc33e0004e41447b74b93572bd61e Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 13 Jan 2026 14:20:18 +0000 +Subject: [PATCH] input/ssh.ml: Fix Ssh.remote_file_exists + +This function was inadvertently broken in commit 970d7123c2 +("input/ssh: Use nbdinfo --can connect (instead of --size)"), since +'nbdinfo --can connect' just says that nbdinfo managed to connect at +all, even if the connection failed to fully negotiate the NBD +handshake. (This is possibly a bug in nbdinfo.) + +Using --size means we must have negotiated the NBD handshake. + +However this leaves the problem that commit 970d7123c2 was originally +intended to fix, that 'nbdinfo --size' prints the size on stdout. To +fix this, replace use of run_command with shell_command so we can +redirect stdout. + +Reported-by: Ming Xie +Thanks: Ming Xie +Updates: commit fb72e059863a60503b6011b8590c25c3a010a58f +Reverts: commit 970d7123c2025bc148870f4bc6fa75fa9e95905f +--- + input/ssh.ml | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/input/ssh.ml b/input/ssh.ml +index 51276156..2393965c 100644 +--- a/input/ssh.ml ++++ b/input/ssh.ml +@@ -56,10 +56,13 @@ let download_file ~server ?port ?user ?password path output = + let remote_file_exists ~server ?port ?user ?password path = + let uri = start_nbdkit ~server ?port ?user ?password path in + +- (* Testing that we can connect to the nbdkit server is enough to ++ (* Testing that the nbdkit server can get the size is enough to + * prove the remote file exists. + *) +- let cmd = [ Config.nbdinfo; "--can"; "connect"; uri ] in +- let r = run_command cmd = 0 in ++ let cmd = sprintf "%s --size %s >/dev/null %s" ++ Config.nbdinfo (quote uri) ++ (* If verbose then allow stderr to go to the log, else hide it *) ++ (if verbose () then "" else "2>&1") in ++ let r = shell_command cmd = 0 in + debug "ssh: remote_file_exists: testing %s -> %b" path r; + r diff --git a/0004-Update-common-submodule.patch b/0004-Update-common-submodule.patch new file mode 100644 index 0000000..a7256fd --- /dev/null +++ b/0004-Update-common-submodule.patch @@ -0,0 +1,120 @@ +From aec2e0a6e6861a2b895d27001e009650f6227dfe Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 26 Jan 2026 16:20:50 +0000 +Subject: [PATCH] Update common submodule + +This pulls in the following commits: + + Richard W.M. Jones (4): + mlcustomize/firstboot.ml: Print %USERNAME% and %USERDOMAIN% + mlcustomize/firstboot.ml: Fix %-encoding in previous commit + mlpcre: Add optional PCRE_ANCHORED flag when compiling expressions + mlstdutils: Export List.assoc_opt + +(cherry picked from commit e3e5cbcf45a0c9a523b8389b2fd8835d5ab684ee) +--- + common | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Submodule common b54ba203..1005f4a6: +diff --git a/common/mlcustomize/firstboot.ml b/common/mlcustomize/firstboot.ml +index 360c33d6..f29884c8 100644 +--- a/common/mlcustomize/firstboot.ml ++++ b/common/mlcustomize/firstboot.ml +@@ -295,6 +295,7 @@ exit /b + + :main + echo starting firstboot service ++echo effective user: %%USERNAME%% domain: %%USERDOMAIN%% + + if not exist "%%scripts_done%%" ( + mkdir "%%scripts_done%%" +diff --git a/common/mlpcre/PCRE.ml b/common/mlpcre/PCRE.ml +index 077290ef..33074af1 100644 +--- a/common/mlpcre/PCRE.ml ++++ b/common/mlpcre/PCRE.ml +@@ -22,7 +22,7 @@ exception Error of string * int + + type regexp + +-external compile : ?caseless:bool -> ?dotall:bool -> ?extended:bool -> ?multiline:bool -> string -> regexp = "guestfs_int_pcre_compile" ++external compile : ?anchored:bool -> ?caseless:bool -> ?dotall:bool -> ?extended:bool -> ?multiline:bool -> string -> regexp = "guestfs_int_pcre_compile_byte" "guestfs_int_pcre_compile" + external matches : ?offset:int -> regexp -> string -> bool = "guestfs_int_pcre_matches" + external sub : int -> string = "guestfs_int_pcre_sub" + external subi : int -> int * int = "guestfs_int_pcre_subi" +diff --git a/common/mlpcre/PCRE.mli b/common/mlpcre/PCRE.mli +index b69a56ba..0fdc2bd5 100644 +--- a/common/mlpcre/PCRE.mli ++++ b/common/mlpcre/PCRE.mli +@@ -52,11 +52,12 @@ exception Error of string * int + type regexp + (** The type of a compiled regular expression. *) + +-val compile : ?caseless:bool -> ?dotall:bool -> ?extended:bool -> ?multiline:bool -> string -> regexp ++val compile : ?anchored:bool -> ?caseless:bool -> ?dotall:bool -> ++ ?extended:bool -> ?multiline:bool -> string -> regexp + (** Compile a regular expression. This can raise {!Error}. + +- The flags [?caseless], [?dotall], [?extended], [?multiline] +- correspond to the [pcre_compile] flags [PCRE_CASELESS] etc. ++ The flags [?anchored], [?caseless], [?dotall], [?extended], [?multiline] ++ correspond to the [pcre_compile] flags [PCRE_ANCHORED] etc. + See pcre2api(3) for details of what they do. + All flags default to false. *) + +diff --git a/common/mlpcre/pcre-c.c b/common/mlpcre/pcre-c.c +index 3959fd56..11be1577 100644 +--- a/common/mlpcre/pcre-c.c ++++ b/common/mlpcre/pcre-c.c +@@ -154,11 +154,12 @@ Optint_val (value intv, int defval) + } + + value +-guestfs_int_pcre_compile (value caselessv, value dotallv, +- value extendedv, value multilinev, ++guestfs_int_pcre_compile (value anchoredv, value caselessv, ++ value dotallv, value extendedv, ++ value multilinev, + value pattv) + { +- CAMLparam4 (caselessv, dotallv, extendedv, multilinev); ++ CAMLparam5 (anchoredv, caselessv, dotallv, extendedv, multilinev); + CAMLxparam1 (pattv); + const char *patt; + int options = 0; +@@ -167,6 +168,8 @@ guestfs_int_pcre_compile (value caselessv, value dotallv, + PCRE2_SIZE errnum; + + /* Flag parameters are all ‘bool option’, defaulting to false. */ ++ if (is_Some_true (anchoredv)) ++ options |= PCRE2_ANCHORED; + if (is_Some_true (caselessv)) + options |= PCRE2_CASELESS; + if (is_Some_true (dotallv)) +@@ -186,6 +189,14 @@ guestfs_int_pcre_compile (value caselessv, value dotallv, + CAMLreturn (Val_regexp (re)); + } + ++value ++guestfs_int_pcre_compile_byte (value *argv, int argn) ++{ ++ assert (argn == 6); ++ return guestfs_int_pcre_compile (argv[0], argv[1], argv[2], ++ argv[3], argv[4], argv[5]); ++} ++ + value + guestfs_int_pcre_matches (value offsetv, value rev, value strv) + { +diff --git a/common/mlstdutils/std_utils.mli b/common/mlstdutils/std_utils.mli +index 6c1911da..77cf107e 100644 +--- a/common/mlstdutils/std_utils.mli ++++ b/common/mlstdutils/std_utils.mli +@@ -51,6 +51,7 @@ module List : sig + val find_all : ('a -> bool) -> 'a list -> 'a list + val partition : ('a -> bool) -> 'a list -> 'a list * 'a list + val assoc : 'a -> ('a * 'b) list -> 'b ++ val assoc_opt : 'a -> ('a * 'b) list -> 'b option + val assq : 'a -> ('a * 'b) list -> 'b + val mem_assoc : 'a -> ('a * 'b) list -> bool + val mem_assq : 'a -> ('a * 'b) list -> bool diff --git a/0004-Update-the-common-submodule.patch b/0004-Update-the-common-submodule.patch deleted file mode 100644 index f65562c..0000000 --- a/0004-Update-the-common-submodule.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 1162c9c21497e24e3388689fd2c58e8dfa043bc4 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Sun, 13 Jul 2025 12:29:28 +0100 -Subject: [PATCH] Update the common submodule - -Pick up this commit from the submodule: - - commit b40e534fefb74af32bd496904e44ce9bca1a7b34 - Author: Vadim Rozenfeld - Date: Thu Jul 10 10:48:04 2025 +1000 - - Modify the firstboot script to check the scripts - -which is required for commit 594b05d694 ("Modify -configure_pnputil_install script to check pending reboot status and -report PnPUtil execution status") to work properly. - -Updates: commit 594b05d6940c8719167d10c0cdfaa253349060ab -(cherry picked from commit 3e08788aaebf96d86452dc2c88d610dc0b72d02e) ---- - common | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -Submodule common 0e9caa17..10d2b626: -diff --git a/common/mlcustomize/firstboot.ml b/common/mlcustomize/firstboot.ml -index 6aca4c34..5f2642b0 100644 ---- a/common/mlcustomize/firstboot.ml -+++ b/common/mlcustomize/firstboot.ml -@@ -305,13 +305,19 @@ if not exist \"%%scripts_done%%\" ( - :: Pick the next script to run. - for %%%%f in (\"%%scripts%%\"\\*.bat) do ( - echo running \"%%%%f\" -- move \"%%%%f\" \"%%scripts_done%%\" -- pushd \"%%scripts_done%%\" -+ pushd \"%%scripts%%\" - call \"%%%%~nf\" - set elvl=!errorlevel! - echo .... exit code !elvl! - popd - -+ if !elvl! NEQ 249 ( -+ echo Script succeeded, moving to scripts-done -+ move \"%%%%f\" \"%%scripts_done%%\" -+ ) else ( -+ echo Script failed, will retry on next boot -+ ) -+ - :: Reboot the computer. This is necessary to free any locked - :: files which may prevent later scripts from running. - shutdown /r /t 0 /y diff --git a/0005-Ignore-ERROR_NO_MORE_ITEMS-status-from-PnPUtil.patch b/0005-Ignore-ERROR_NO_MORE_ITEMS-status-from-PnPUtil.patch deleted file mode 100644 index fc5e79b..0000000 --- a/0005-Ignore-ERROR_NO_MORE_ITEMS-status-from-PnPUtil.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 90376739e05166de15a94637f64e6b2256f5d90a Mon Sep 17 00:00:00 2001 -From: Vadim Rozenfeld -Date: Tue, 15 Jul 2025 18:35:16 +1000 -Subject: [PATCH] Ignore ERROR_NO_MORE_ITEMS status from PnPUtil. - -This status indicates the target device already has a -better or newer driver installed. - -Signed-off-by: Vadim Rozenfeld -(cherry picked from commit 523aff28975532a4fe715193c28c2ede21741392) ---- - convert/convert_windows.ml | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/convert/convert_windows.ml b/convert/convert_windows.ml -index 8f0ff87b..2ff9bcfa 100644 ---- a/convert/convert_windows.ml -+++ b/convert/convert_windows.ml -@@ -431,7 +431,7 @@ let convert (g : G.guestfs) source inspect i_firmware - for %%f in (\"%inf_dir%*.inf\") do (\n\ - echo Installing: %%~nxf.\n\ - %systemroot%\\Sysnative\\PnPutil -i -a \"%%f\"\n\ -- if !errorlevel! NEQ 0 (\n\ -+ if !errorlevel! neq 0 if !errorlevel! neq 259 (\n\ - echo Failed to install %%~nxf.\n\ - exit /b 249\n\ - ) else (\n\ diff --git a/0005-v2v-Enhance-inspection-with-filesystems-information.patch b/0005-v2v-Enhance-inspection-with-filesystems-information.patch new file mode 100644 index 0000000..381c28e --- /dev/null +++ b/0005-v2v-Enhance-inspection-with-filesystems-information.patch @@ -0,0 +1,177 @@ +From 3e60eef83ed072b605a3c34f3bf3acbc89a876bb Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 26 Jan 2026 16:26:27 +0000 +Subject: [PATCH] v2v: Enhance inspection with filesystems information + +Add the list of filesystems found by inspection to the internal +inspection struct. This is not actually used by virt-v2v itself (it +is used by virt-v2v-inspector), so this change should have no effect. + +(cherry picked from commit 6bd4ab3a5da9bf3bb3b22585d2226d6e338f23ba) + +For RHEL 10: Adjust minimum version of libguestfs since we will +backport the new API to libguestfs 1.58.1-2.el10. +--- + convert/mount_filesystems.ml | 49 ++++++++++++++++++++++++++++++++++++ + lib/types.ml | 9 +++++++ + lib/types.mli | 9 +++++++ + m4/guestfs-libraries.m4 | 5 ++-- + v2v/v2v_unit_tests.ml | 1 + + 5 files changed, 70 insertions(+), 3 deletions(-) + +diff --git a/convert/mount_filesystems.ml b/convert/mount_filesystems.ml +index e7974359..aa117e51 100644 +--- a/convert/mount_filesystems.ml ++++ b/convert/mount_filesystems.ml +@@ -30,6 +30,42 @@ let rec mount_filesystems g root = + reject_if_not_installed_image g root; + reject_if_unknown_fields g root; + ++ (* Get the list of filesystems. This is not actually used by ++ * virt-v2v (only used by virt-v2v-inspector) so try hard not ++ * to fail here. ++ *) ++ let fses = g#inspect_get_filesystems root in ++ let fses = Array.to_list fses in ++ let fses = List.sort compare fses in ++ let fses = ++ List.map ( ++ fun dev -> ++ let dev = g#canonical_device_name dev ++ and fs_type = ref None ++ and fs_version = ref None ++ and fs_label = ref None ++ and fs_uuid = ref None in ++ ++ (try ++ let v = g#vfs_type dev in ++ if v <> "" then ( ++ fs_type := Some v; ++ fs_version := get_filesystem_version g dev v; ++ ) ++ with G.Error msg -> debug "vfs_type: %s: %s (ignored)" dev msg); ++ (try ++ let v = g#vfs_label dev in ++ if v <> "" then fs_label := Some v ++ with G.Error msg -> debug "vfs_label: %s: %s (ignored)" dev msg); ++ (try ++ let v = g#vfs_uuid dev in ++ if v <> "" then fs_uuid := Some v ++ with G.Error msg -> debug "vfs_uuid: %s: %s (ignored)" dev msg); ++ ++ { fs_dev = dev; fs_type = !fs_type; fs_version = !fs_version; ++ fs_label = !fs_label; fs_uuid = !fs_uuid } ++ ) fses in ++ + (* Mount up the filesystems. *) + let mps = g#inspect_get_mountpoints root in + let cmp (a,_) (b,_) = compare (String.length a) (String.length b) in +@@ -121,6 +157,7 @@ let rec mount_filesystems g root = + i_product_name = g#inspect_get_product_name root; + i_product_variant = g#inspect_get_product_variant root; + i_mountpoints = mps; ++ i_filesystems = fses; + i_apps = apps; + i_apps_map = apps_map; + i_windows_systemroot = systemroot; +@@ -164,6 +201,18 @@ and error_if_unknown fieldname value = + Inspection field ‘%s’ was ‘unknown’.") + fieldname + ++(* See equivalent function in guestfs-tools.git:inspector/inspector.c *) ++and get_filesystem_version g dev = function ++ | "xfs" -> ++ let hash = g#xfs_info2 dev in ++ (match List.assoc_opt "meta-data.crc" hash with ++ | None -> None ++ | Some "0" -> (* XFS version *) Some "4" ++ | Some "1" -> (* XFS version *) Some "5" ++ | Some _ -> None ++ ) ++ | _ -> None ++ + (* Wrapper around g#inspect_list_applications2 which, for RPM + * guests, on failure tries to rebuild the RPM database before + * repeating the operation. +diff --git a/lib/types.ml b/lib/types.ml +index 9ba580e4..d727af89 100644 +--- a/lib/types.ml ++++ b/lib/types.ml +@@ -300,6 +300,7 @@ type inspect = { + i_product_name : string; + i_product_variant : string; + i_mountpoints : (string * string) list; ++ i_filesystems : filesystem list; + i_apps : Guestfs.application2 list; + i_apps_map : Guestfs.application2 list StringMap.t; + i_windows_systemroot : string; +@@ -310,6 +311,14 @@ type inspect = { + i_drive_mappings : (string * string) list; + } + ++and filesystem = { ++ fs_dev : string; ++ fs_type : string option; ++ fs_version : string option; ++ fs_label : string option; ++ fs_uuid : string option; ++} ++ + let string_of_inspect inspect = + sprintf "\ + i_root = %s +diff --git a/lib/types.mli b/lib/types.mli +index 4c705a73..64b6336f 100644 +--- a/lib/types.mli ++++ b/lib/types.mli +@@ -207,6 +207,7 @@ type inspect = { + i_product_name : string; + i_product_variant : string; + i_mountpoints : (string * string) list; ++ i_filesystems : filesystem list; + i_apps : Guestfs.application2 list; (** List of packages installed. *) + i_apps_map : Guestfs.application2 list StringMap.t; + (** This is a map from the app name to the application object. +@@ -220,6 +221,14 @@ type inspect = { + i_drive_mappings : (string * string) list; + } + ++and filesystem = { ++ fs_dev : string; ++ fs_type : string option; ++ fs_version : string option; ++ fs_label : string option; ++ fs_uuid : string option; ++} ++ + val string_of_inspect : inspect -> string + + (** {2 Disk stats} *) +diff --git a/m4/guestfs-libraries.m4 b/m4/guestfs-libraries.m4 +index db11cff6..c4237438 100644 +--- a/m4/guestfs-libraries.m4 ++++ b/m4/guestfs-libraries.m4 +@@ -19,9 +19,8 @@ dnl Any C libraries required by virt-v2v. + + dnl Of course we need libguestfs. + dnl +-dnl We need libguestfs 1.57.3 for guestfs_ntfs_chmod. +-dnl We need libguestfs 1.57.6 for guestfs_inspect_get_windows_group_policy. +-PKG_CHECK_MODULES([LIBGUESTFS], [libguestfs >= 1.57.6]) ++dnl We need libguestfs >= 1.58.1-2.el10 for guestfs_xfs_info2. ++PKG_CHECK_MODULES([LIBGUESTFS], [libguestfs >= 1.58.1]) + printf "libguestfs version is "; $PKG_CONFIG --modversion libguestfs + + dnl And libnbd. +diff --git a/v2v/v2v_unit_tests.ml b/v2v/v2v_unit_tests.ml +index 892bf190..efbadc80 100644 +--- a/v2v/v2v_unit_tests.ml ++++ b/v2v/v2v_unit_tests.ml +@@ -38,6 +38,7 @@ let inspect_defaults = { + i_major_version = 0; i_minor_version = 0; + i_root = ""; i_package_format = ""; i_package_management = ""; + i_product_name = ""; i_product_variant = ""; i_mountpoints = []; ++ i_filesystems = []; + i_apps = []; i_apps_map = StringMap.empty; + i_windows_systemroot = ""; + i_windows_software_hive = ""; i_windows_system_hive = ""; diff --git a/0006-inspector-Enhance-virt-v2v-inspector-output-with-fil.patch b/0006-inspector-Enhance-virt-v2v-inspector-output-with-fil.patch new file mode 100644 index 0000000..ba043ff --- /dev/null +++ b/0006-inspector-Enhance-virt-v2v-inspector-output-with-fil.patch @@ -0,0 +1,131 @@ +From 3eef674a08ca904baff2e4d6a0f871e303d08e6e Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 26 Jan 2026 16:27:42 +0000 +Subject: [PATCH] inspector: Enhance virt-v2v-inspector output with filesystems + information + +RHEL 7.0, 7.1 and (possibly*) 7.2 used XFS version 4. New versions of +RHEL use XFS v5. + +Support even for opening version 4 filesystems was removed in RHEL 10 +(and will be removed altogether from the Linux kernel in 2030). This +prevents virt-v2v conversions. + +Therefore it's a good idea to be able to tell the XFS filesystem +version and print that in virt-inspector output, so that management +tools can warn about it. + +Since we didn't have the virt-inspector section at all +before, we have to add that whole section, sticking as close as +possible to the virt-inspector output. + +Example output for a RHEL 7.0 guest: + + + + + virt-v2v-inspector + ... + + linux + ... + + / + /boot + + + + ext4 + 15e8838c-136e-4a1f-ac01-97b4fa6b0fe4 + + + swap + 8e966377-86f1-45a1-bdff-28724530818d + + + xfs + 67ae8aeb-a9f4-4639-a201-c02b7dbb5d98 + + + + + +Example output for a RHEL 7.3 guest: + + + + + virt-v2v-inspector + ... + + linux + ... + + / + /boot + + + + ext4 + e0467228-8727-482d-bd7a-6741885fe7ed + + + swap + 9c2e6658-c600-4fbd-8731-864ff987553c + + + xfs + 9692610c-0025-4a8c-b806-8a78de2ec2eb + + + + + +To work this requires libguestfs >= 1.59.2 (with guestfs_xfs_info2). + +The version field may be missing, for non-XFS filesystems, but also if +we cannot tell the XFS version for some reason. + +* = The virt-builder rhel-7.2 image definitely uses XFS v4, but it may +have been built from an early (pre-)release of 7.2. Later RHEL 7.2 +seems to use XFS v5. + +Fixes: https://issues.redhat.com/browse/RHEL-144075 +(cherry picked from commit d6b2e643b174fff7d3442865da047bf3d3f9aac9) +--- + inspector/create_inspector_xml.ml | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +diff --git a/inspector/create_inspector_xml.ml b/inspector/create_inspector_xml.ml +index fb434227..a531cecc 100644 +--- a/inspector/create_inspector_xml.ml ++++ b/inspector/create_inspector_xml.ml +@@ -126,6 +126,28 @@ let rec create_inspector_xml input_disks inspect target_meta = + ) inspect.i_mountpoints; + List.push_back os (e "mountpoints" [] !mps); + ++ let fses = ref [] in ++ List.iter ( ++ fun { fs_dev; fs_type; fs_version; fs_label; fs_uuid } -> ++ let fs = ref [] in ++ (match fs_type, fs_version with ++ | None, _ -> () ++ | Some typ, None -> List.push_back fs (e "type" [] [PCData typ]) ++ | Some typ, Some ver -> ++ List.push_back fs (e "type" [ "version", ver] [PCData typ]) ++ ); ++ (match fs_label with ++ | None -> () ++ | Some label -> List.push_back fs (e "label" [] [PCData label]) ++ ); ++ (match fs_uuid with ++ | None -> () ++ | Some uuid -> List.push_back fs (e "uuid" [] [PCData uuid]) ++ ); ++ List.push_back fses (e "filesystem" [ "dev", fs_dev] !fs) ++ ) inspect.i_filesystems; ++ List.push_back os (e "filesystems" [] !fses); ++ + List.push_back body (e "operatingsystem" [] !os); + + (* Construct the final document. *) diff --git a/0006-v2v-Print-the-version-of-libnbd-nbdcopy-in-debug-out.patch b/0006-v2v-Print-the-version-of-libnbd-nbdcopy-in-debug-out.patch deleted file mode 100644 index cf52565..0000000 --- a/0006-v2v-Print-the-version-of-libnbd-nbdcopy-in-debug-out.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 4835c9c91cff55f1411a0413c1469e212124ba03 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Wed, 16 Jul 2025 13:10:01 +0100 -Subject: [PATCH] v2v: Print the version of libnbd / nbdcopy in debug output - -We didn't previously log the version of libnbd or nbdcopy, and nbdcopy -itself won't tell us (because we don't use the nbdcopy --verbose -option). However this information can be useful to know. This commit -enhances the verbose output of virt-v2v to include this. - -With current versions of nbdcopy it will look like this: - - info: nbdcopy version: - nbdcopy 1.23.4 - libnbd 1.23.4 - -Note the second line is the version of the installed library, which in -some (very unusual, and probably broken) situations might be different -from the version of the nbdcopy binary, which is why both are logged. - -libnbd 1.23.5 will soon enhance the output to include the downstream -package version (such as the RPM version) which is even more useful. -In future the output will look like: - - info: nbdcopy version: - nbdcopy 1.23.5 (libnbd-1.23.5-1.fc43) - libnbd 1.23.5 (libnbd-1.23.5-1.fc43) - -See: https://gitlab.com/nbdkit/libnbd/-/merge_requests/28 -(cherry picked from commit a8a0caf54ccaf52db70988494b6f5a397a1af105) ---- - v2v/v2v.ml | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/v2v/v2v.ml b/v2v/v2v.ml -index d32993d4..c780ab1d 100644 ---- a/v2v/v2v.ml -+++ b/v2v/v2v.ml -@@ -469,6 +469,11 @@ read the man page virt-v2v(1). - (* Do the copy. *) - with_open_out (v2vdir // "copy") (fun _ -> ()); - -+ if verbose () then ( -+ eprintf "info: nbdcopy version:\n%!"; -+ ignore (Sys.command (sprintf "%s --version >&2" Config.nbdcopy)) -+ ); -+ - (* Get the list of disks and corresponding NBD URIs. *) - let disks = - List.combine input_disks output_disks |> diff --git a/0040-convert-convert_linux.ml-Add-debian-12-UEFI.patch b/0007-convert-convert_linux.ml-Add-debian-12-UEFI.patch similarity index 86% rename from 0040-convert-convert_linux.ml-Add-debian-12-UEFI.patch rename to 0007-convert-convert_linux.ml-Add-debian-12-UEFI.patch index fddad5e..0807950 100644 --- a/0040-convert-convert_linux.ml-Add-debian-12-UEFI.patch +++ b/0007-convert-convert_linux.ml-Add-debian-12-UEFI.patch @@ -1,4 +1,4 @@ -From 7e0bee433cb357afae186e5821c738c3b2f3bf57 Mon Sep 17 00:00:00 2001 +From 3ef1078cd3cf5a56dc8023ed113838533d9cea09 Mon Sep 17 00:00:00 2001 From: Martin Necas Date: Tue, 27 Jan 2026 21:56:41 +0900 Subject: [PATCH] convert/convert_linux.ml: Add debian 12 UEFI @@ -11,16 +11,15 @@ Fixes: https://issues.redhat.com/browse/RHEL-144467 Signed-off-by: Martin Necas (cherry picked from commit 161679267f2100e3604dca3f5bfa0827e9a5de30) -(cherry picked from commit 3ef1078cd3cf5a56dc8023ed113838533d9cea09) --- convert/convert_linux.ml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml -index fe88b903..a0674d88 100644 +index 6c021efb..ce02b04a 100644 --- a/convert/convert_linux.ml +++ b/convert/convert_linux.ml -@@ -1320,13 +1320,15 @@ let convert (g : G.guestfs) source inspect i_firmware _ keep_serial_console _ = +@@ -1324,13 +1324,15 @@ fi g inspect.i_root "fix uefi boot" fix_script) else cant_fix_uefi () @@ -37,7 +36,7 @@ index fe88b903..a0674d88 100644 let shim = String.concat "" [grub_path; "/shim"; arch_suffix; ".efi"] in let uefi_grub_name = -@@ -1342,14 +1344,14 @@ let convert (g : G.guestfs) source inspect i_firmware _ keep_serial_console _ = +@@ -1346,14 +1348,14 @@ fi * if not, then just don't clean up and leave the temp loader * at UEFI fallback path for simplicity *) diff --git a/0007-vddk-Remove-io-vddk-noextents-option.patch b/0007-vddk-Remove-io-vddk-noextents-option.patch deleted file mode 100644 index e4049e0..0000000 --- a/0007-vddk-Remove-io-vddk-noextents-option.patch +++ /dev/null @@ -1,101 +0,0 @@ -From ef40dab47ba94ca47e6a268853d415d9311aca04 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Wed, 9 Jul 2025 09:38:50 +0100 -Subject: [PATCH] vddk: Remove -io vddk-noextents option - -Commit 191b8cf418 ("input: Add undocumented -io vddk-noextents=true -option") added an option which could be used to insert the nbdkit -noextents filter on top of the VDDK source. This was designed so we -could test in production if this improved performance (which it -didn't). - -Since then we've spent more time investigating problems with -QueryAllocatedBlocks and believe we have a better solution in nbdkit. -See: -https://gitlab.com/nbdkit/nbdkit/-/commit/5a882e74cae3dbaa09bf3b942a02f9947b12f6e5 - -Reverts: commit 191b8cf418076ae3766b134ffa96eee048c7eb9d ---- - README | 1 - - input/input_vddk.ml | 35 ----------------------------------- - 2 files changed, 36 deletions(-) - -diff --git a/README b/README -index 49082a96..1cdbef15 100644 ---- a/README -+++ b/README -@@ -71,7 +71,6 @@ REQUIREMENTS - + nbdkit-blocksize-filter - + nbdkit-cow-filter - + nbdkit-multi-conn-filter -- + nbdkit-noextents-filter - + nbdkit-rate-filter - + nbdkit-retry-filter - -diff --git a/input/input_vddk.ml b/input/input_vddk.ml -index 39356129..12f43729 100644 ---- a/input/input_vddk.ml -+++ b/input/input_vddk.ml -@@ -58,7 +58,6 @@ All other settings are optional: - -io vddk-file=FILE Override nbdkit-vddk-plugin file= parameter - -io vddk-libdir=LIBDIR VDDK library parent directory - -io vddk-nfchostport=PORT VDDK nfchostport -- -io vddk-noextents=true Avoid slow VDDK QueryAllocatedBlocks API - -io vddk-port=PORT VDDK port - -io vddk-snapshot=SNAPSHOT-MOREF - VDDK snapshot moref -@@ -79,7 +78,6 @@ information on these settings. - "file"; - "libdir"; - "nfchostport"; -- "noextents"; - "port"; - "snapshot"; - "thumbprint"; -@@ -208,9 +206,6 @@ information on these settings. - try Some (List.assoc "libdir" io_options) with Not_found -> None in - let nfchostport = - try Some (List.assoc "nfchostport" io_options) with Not_found -> None in -- let noextents = -- try bool_of_string (List.assoc "noextents" io_options) -- with Not_found -> false in - let port = - try Some (List.assoc "port" io_options) with Not_found -> None in - let snapshot = -@@ -318,36 +313,6 @@ See also the virt-v2v-input-vmware(1) manual.") libNN - *) - Nbdkit.add_filter_if_available cmd "retry"; - -- (* VDDK's QueryAllocatedBlocks API is infamously slow. It appears -- * to block all other requests while it is running. This API is -- * also only called during the copy phase, not during conversion -- * (or if it is, extremely rarely). -- * -- * If fstrim was successful, then trimmed blocks are stored in -- * the COW filter (see below), and so requests for extents stop -- * at that layer. However for areas of the disk that fstrim -- * thinks contain data, we still have to go through to VDDK to -- * fetch extents. -- * -- * We could therefore add nbdkit-noextents-filter here (below COW, -- * above VDDK plugin) which stops extents requests from going -- * to VDDK, which would stop QueryAllocatedBlocks ever being -- * called. In my testing this is a moderate performance win. -- * -- * However ... in the case where fstrim failed, or for filesystems -- * or partitions on the disk that we don't understand, doing this -- * would mean that those are copied completely, as there would be -- * no extent data (nbdcopy will still sparsify them on the target, -- * but we'd have to copy all the bits from VMware). Because -- * here we don't know if this is the case, be conservative and -- * actually don't use this filter. -- * -- * If used, this filter should be close to the plugin and MUST -- * be below the COW filter. -- *) -- if noextents then -- Nbdkit.add_filter_if_available cmd "noextents"; -- - (* Split very large requests to avoid out of memory errors on the - * server. Since we're using this filter, also add minblock=512 - * although it will make no difference. diff --git a/0008-curl-ssh-vddk-file-Add-nbdkit-count-filter.patch b/0008-curl-ssh-vddk-file-Add-nbdkit-count-filter.patch deleted file mode 100644 index 38c1f46..0000000 --- a/0008-curl-ssh-vddk-file-Add-nbdkit-count-filter.patch +++ /dev/null @@ -1,114 +0,0 @@ -From cdb7ffa3a378a1832c92f40aef9e7dd6d8d093ff Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Wed, 9 Jul 2025 09:48:35 +0100 -Subject: [PATCH] curl, ssh, vddk, file: Add nbdkit-count-filter - -nbdkit-count-filter, added in nbdkit 1.45.1, prints a debug message -which just records the number of bytes read, written, trimmed or -zeroed. This is useful for determining how many bytes were actually -copied over the wire or written to disk, and that's a common question -that we currently have no easy way to answer. For more details about -this filter see: -https://gitlab.com/nbdkit/nbdkit/-/commit/3512c3ce9308b4d940119ac6cc87f1baa9afb655 -https://libguestfs.org/nbdkit-count-filter.1.html - -Use this filter (if available) unconditionally for all inputs that -read over the network, and for the common file-based outputs -(specifically -o kubevirt). - -It is only enabled if we're producing debug output (ie. conversion -logs). ---- - README | 1 + - input/input_vddk.ml | 7 +++++++ - input/nbdkit_curl.ml | 7 +++++++ - input/nbdkit_ssh.ml | 7 +++++++ - output/output.ml | 2 ++ - 5 files changed, 24 insertions(+) - -diff --git a/README b/README -index 1cdbef15..407869b4 100644 ---- a/README -+++ b/README -@@ -69,6 +69,7 @@ REQUIREMENTS - + nbdkit-vddk-plugin - - + nbdkit-blocksize-filter -+ + nbdkit-count-filter - + nbdkit-cow-filter - + nbdkit-multi-conn-filter - + nbdkit-rate-filter -diff --git a/input/input_vddk.ml b/input/input_vddk.ml -index 12f43729..e88befa2 100644 ---- a/input/input_vddk.ml -+++ b/input/input_vddk.ml -@@ -313,6 +313,13 @@ See also the virt-v2v-input-vmware(1) manual.") libNN - *) - Nbdkit.add_filter_if_available cmd "retry"; - -+ (* Add the count filter if available, to report bytes read. -+ * Since it writes a debug message, only do this if verbose. -+ * This should be close to the plugin so we're reporting what -+ * is read over the wire. -+ *) -+ if verbose () then Nbdkit.add_filter_if_available cmd "count"; -+ - (* Split very large requests to avoid out of memory errors on the - * server. Since we're using this filter, also add minblock=512 - * although it will make no difference. -diff --git a/input/nbdkit_curl.ml b/input/nbdkit_curl.ml -index d8c832b8..f8a0213e 100644 ---- a/input/nbdkit_curl.ml -+++ b/input/nbdkit_curl.ml -@@ -58,6 +58,13 @@ let create_curl ?bandwidth ?cookie_script ?cookie_script_renew ?cor - *) - Nbdkit.add_filter_if_available cmd "retry"; - -+ (* Add the count filter if available, to report bytes read. -+ * Since it writes a debug message, only do this if verbose. -+ * This should be close to the plugin so we're reporting what -+ * is read over the wire. -+ *) -+ if verbose () then Nbdkit.add_filter_if_available cmd "count"; -+ - (* IMPORTANT! Add the COW filter. It must be furthest away - * except for the rate filter. - *) -diff --git a/input/nbdkit_ssh.ml b/input/nbdkit_ssh.ml -index e6d99ede..4e4c918f 100644 ---- a/input/nbdkit_ssh.ml -+++ b/input/nbdkit_ssh.ml -@@ -54,6 +54,13 @@ let create_ssh ?bandwidth ?cor ?(retry=true) - if retry then - Nbdkit.add_filter_if_available cmd "retry"; - -+ (* Add the count filter if available, to report bytes read. -+ * Since it writes a debug message, only do this if verbose. -+ * This should be close to the plugin so we're reporting what -+ * is read over the wire. -+ *) -+ if verbose () then Nbdkit.add_filter_if_available cmd "count"; -+ - (* IMPORTANT! Add the COW filter. It must be furthest away - * except for the rate filter. - *) -diff --git a/output/output.ml b/output/output.ml -index b3629372..65325538 100644 ---- a/output/output.ml -+++ b/output/output.ml -@@ -98,6 +98,7 @@ let output_to_local_file ?(changeuid = fun f -> f ()) ?(compressed = false) - let cmd = Nbdkit.create "file" in - Nbdkit.add_arg cmd "file" filename; - Nbdkit.add_arg cmd "cache" "none"; -+ if verbose () then Nbdkit.add_filter_if_available cmd "count"; - let _, pid = Nbdkit.run_unix socket cmd in - pid - -@@ -197,6 +198,7 @@ let create_local_output_disks dir - let cmd = Nbdkit.create "file" in - Nbdkit.add_arg cmd "dir" output_storage; - Nbdkit.add_arg cmd "cache" "none"; -+ if verbose () then Nbdkit.add_filter_if_available cmd "count"; - let _, pid = Nbdkit.run_unix socket cmd in - On_exit.kill pid; - diff --git a/0041-input-vcenter-double-uri_encode-dcPath-and-dsName.patch b/0008-input-vcenter-double-uri_encode-dcPath-and-dsName.patch similarity index 92% rename from 0041-input-vcenter-double-uri_encode-dcPath-and-dsName.patch rename to 0008-input-vcenter-double-uri_encode-dcPath-and-dsName.patch index 8221f33..514b233 100644 --- a/0041-input-vcenter-double-uri_encode-dcPath-and-dsName.patch +++ b/0008-input-vcenter-double-uri_encode-dcPath-and-dsName.patch @@ -1,4 +1,4 @@ -From a5fe9fd47c3695c021dc7479bdce18aa59f9d068 Mon Sep 17 00:00:00 2001 +From c532b2c1d14b22b540cced337ad26473aa5b6648 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Tue, 27 Jan 2026 09:14:29 -0500 Subject: [PATCH] input: vcenter: double uri_encode `dcPath` and `dsName` @@ -19,7 +19,6 @@ Fixes: https://issues.redhat.com/browse/RHEL-133729 Signed-off-by: Cole Robinson (cherry picked from commit f13e85f9ce3bb51f65c0afbaae009b5a3e6af9c7) -(cherry picked from commit c532b2c1d14b22b540cced337ad26473aa5b6648) --- input/vCenter.ml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/0009-lib-Replace-nbdkit-file-cache-none-with-reduce-memor.patch b/0009-lib-Replace-nbdkit-file-cache-none-with-reduce-memor.patch new file mode 100644 index 0000000..827f267 --- /dev/null +++ b/0009-lib-Replace-nbdkit-file-cache-none-with-reduce-memor.patch @@ -0,0 +1,112 @@ +From 3b6f7752ab8c8879426518c7ab290db79e4f6571 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 27 Jan 2026 08:56:11 +0000 +Subject: [PATCH] lib: Replace nbdkit file cache=none with + reduce-memory-pressure=on + +nbdkit 1.46 replaced the cache=none option with the +same option renamed as 'reduce-memory-pressure', taking a boolean +value, see: + +https://gitlab.com/nbdkit/nbdkit/-/commit/98a5ddc835ba520c949b31328aef7b7987462faa + +The old option caused customer confusion. cache=none still works, but +to reduce confusion we should also prefer reduce-memory-pressure=on +when that option is available. + +(cherry picked from commit 7aab8a85f2f1a6d01d5e62dabe1839483abd0401) +--- + input/input_disk.ml | 2 +- + input/input_libvirt.ml | 2 +- + lib/nbdkit.ml | 9 +++++++++ + lib/nbdkit.mli | 8 ++++++++ + output/output.ml | 4 ++-- + 5 files changed, 21 insertions(+), 4 deletions(-) + +diff --git a/input/input_disk.ml b/input/input_disk.ml +index 8a71a3d9..a5291031 100644 +--- a/input/input_disk.ml ++++ b/input/input_disk.ml +@@ -110,7 +110,7 @@ module Disk = struct + if options.read_only then + Nbdkit.add_filter cmd "cow"; + Nbdkit.add_arg cmd "file" disk; +- Nbdkit.add_arg cmd "cache" "none"; ++ Nbdkit.reduce_memory_pressure cmd; + let _, pid = Nbdkit.run_unix socket cmd in + + (* --exit-with-parent should ensure nbdkit is cleaned +diff --git a/input/input_libvirt.ml b/input/input_libvirt.ml +index f566ff5c..4c1a6eef 100644 +--- a/input/input_libvirt.ml ++++ b/input/input_libvirt.ml +@@ -129,7 +129,7 @@ and setup_servers options dir disks = + if options.read_only then + Nbdkit.add_filter cmd "cow"; + Nbdkit.add_arg cmd "file" filename; +- Nbdkit.add_arg cmd "cache" "none"; ++ Nbdkit.reduce_memory_pressure cmd; + let _, pid = Nbdkit.run_unix socket cmd in + + (* --exit-with-parent should ensure nbdkit is cleaned +diff --git a/lib/nbdkit.ml b/lib/nbdkit.ml +index 9e42b607..e975bddf 100644 +--- a/lib/nbdkit.ml ++++ b/lib/nbdkit.ml +@@ -134,6 +134,15 @@ let add_env cmd name value = cmd.env <- (name, value) :: cmd.env + let add_filter_if_available cmd filter = + if probe_filter filter then add_filter cmd filter + ++let reduce_memory_pressure cmd = ++ assert (cmd.plugin = "file"); ++ if probe_plugin_parameter cmd.plugin "reduce-memory-pressure=" then ++ add_arg cmd "reduce-memory-pressure" "on" ++ else if probe_plugin_parameter cmd.plugin "cache=" then ++ add_arg cmd "cache" "none" ++ else ++ assert false ++ + let run_unix socket cmd = + (* Create a temporary directory where we place the PID file. *) + let piddir = Mkdtemp.temp_dir "v2vnbdkit." in +diff --git a/lib/nbdkit.mli b/lib/nbdkit.mli +index ea40b612..eaf65f05 100644 +--- a/lib/nbdkit.mli ++++ b/lib/nbdkit.mli +@@ -109,6 +109,14 @@ val add_args : cmd -> (string * string) list -> unit + + The arguments are added left to right. *) + ++val reduce_memory_pressure : cmd -> unit ++(** This is short-hand for detecting if the file plugin supports the ++ [reduce-memory-pressure=on] option, and adding it to the nbdkit ++ command line. Otherwise it adds the old, confusing [cache=none] ++ option instead. ++ ++ Only use this with the file plugin. *) ++ + val add_env : cmd -> string -> string -> unit + (** Add name=value environment variable. *) + +diff --git a/output/output.ml b/output/output.ml +index 3067b920..7e096278 100644 +--- a/output/output.ml ++++ b/output/output.ml +@@ -102,7 +102,7 @@ let output_to_local_file ?name + | "raw" -> + let cmd = Nbdkit.create ?name "file" in + Nbdkit.add_arg cmd "file" filename; +- Nbdkit.add_arg cmd "cache" "none"; ++ Nbdkit.reduce_memory_pressure cmd; + if verbose () then Nbdkit.add_filter_if_available cmd "count"; + let _, pid = Nbdkit.run_unix socket cmd in + pid +@@ -205,7 +205,7 @@ let create_local_output_disks dir + (* Create the single nbdkit-file-plugin instance. *) + let cmd = Nbdkit.create ~name:"out" "file" in + Nbdkit.add_arg cmd "dir" output_storage; +- Nbdkit.add_arg cmd "cache" "none"; ++ Nbdkit.reduce_memory_pressure cmd; + if verbose () then Nbdkit.add_filter_if_available cmd "count"; + let _, pid = Nbdkit.run_unix socket cmd in + On_exit.kill pid; diff --git a/0009-o-kubevirt-Add-oo-disk-to-allow-disk-names-to-be-ove.patch b/0009-o-kubevirt-Add-oo-disk-to-allow-disk-names-to-be-ove.patch deleted file mode 100644 index 6966e8c..0000000 --- a/0009-o-kubevirt-Add-oo-disk-to-allow-disk-names-to-be-ove.patch +++ /dev/null @@ -1,233 +0,0 @@ -From 71d68738920971f0216cfe77f6873a518369045f Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Tue, 8 Jul 2025 10:40:48 +0100 -Subject: [PATCH] -o kubevirt: Add -oo disk to allow disk names to be - overridden - -Fixes: https://issues.redhat.com/browse/RHEL-101599 ---- - docs/virt-v2v.pod | 15 +++++++-- - output/output_kubevirt.ml | 58 ++++++++++++++++++++++++++------ - tests/Makefile.am | 2 ++ - tests/test-o-kubevirt-oo-disk.sh | 52 ++++++++++++++++++++++++++++ - 4 files changed, 115 insertions(+), 12 deletions(-) - create mode 100755 tests/test-o-kubevirt-oo-disk.sh - -diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod -index 3eefe404..5020d179 100644 ---- a/docs/virt-v2v.pod -+++ b/docs/virt-v2v.pod -@@ -466,8 +466,9 @@ Set the output method to I. B - - In this mode, the converted guest is written to a local directory --specified by I<-os /dir> (the directory must exist). The converted --guest’s disks are written to: -+specified by I<-os /dir> (the directory must exist). -+ -+By default the converted guest’s disks are written to: - - /dir/name-sda - /dir/name-sdb -@@ -479,6 +480,8 @@ and guest metadata is created in the associated YAML file: - - where C is the guest name. - -+You can override the disk paths by using I<-oo disk=...> option(s). -+ - =item B<-o> B - - Set the output method to I. This is the default. -@@ -600,6 +603,14 @@ For outputs which support qcow2 format (I<-of qcow2>), this writes a - compressed qcow2 file. It is the equivalent to the I<-c> option of - L. - -+=item B<-oo disk=>DISK -+ -+For I<-o kubevirt> this overrides the path to each output disk, -+instead of using the default which is C etc in the output -+storage (I<-os>) path. If you use this option at all, you must repeat -+it once for each guest disk. If you don't use it, then the default -+method of putting disks in the output storage path is used. -+ - =item B<-oo guest-id=>C - - For I<-o openstack> (L) only, set a guest ID -diff --git a/output/output_kubevirt.ml b/output/output_kubevirt.ml -index 76ecd39d..eae9c049 100644 ---- a/output/output_kubevirt.ml -+++ b/output/output_kubevirt.ml -@@ -35,7 +35,8 @@ let rfc1123_re = - "^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$" - - module Kubevirt = struct -- type poptions = bool * output_allocation * string * string * string -+ type poptions = -+ bool * string list option * output_allocation * string * string * string - - type t = unit - -@@ -49,15 +50,18 @@ module Kubevirt = struct - printf (f_"Output options that can be used with -o kubevirt: - - -oo compressed Compress the output file (used only with -of qcow2) -+ -oo disk=disk1 Specify filename of output disk (if used, must be -+ given once for each disk, else -os path is used) - ") - -- - let parse_options options source = - let compressed = ref false in -+ let disks = ref [] in - List.iter ( - function - | "compressed", "" -> compressed := true - | "compressed", v -> compressed := bool_of_string v -+ | "disk", v -> List.push_back disks v - | k, _ -> - error (f_"-o kubevirt: unknown output option ‘-oo %s’") k - ) options.output_options; -@@ -84,23 +88,57 @@ module Kubevirt = struct - end with an alphanumeric character. Rerun virt-v2v with \ - the '-on name' option to rename it."); - -- !compressed, options.output_alloc, options.output_format, -+ let disks = match !disks with [] -> None | disks -> Some disks in -+ -+ !compressed, disks, -+ options.output_alloc, options.output_format, - output_name, output_storage - - let setup dir options source input_disks = -- let compressed, output_alloc, output_format, output_name, output_storage = -- options in -+ let compressed, disks, -+ output_alloc, output_format, output_name, output_storage = options in - - let uris = -- create_local_output_disks dir ~compressed output_alloc output_format -- output_name output_storage input_disks in -+ match disks with -+ | None -> -+ create_local_output_disks dir ~compressed -+ output_alloc output_format output_name output_storage input_disks -+ | Some disks -> -+ (* -oo disk specified, so create the disks by hand. *) -+ let nr_input_disks = List.length input_disks -+ and nr_output_disks = List.length disks in -+ if nr_input_disks <> nr_output_disks then -+ error (f_"incorrect number of '-oo disk' parameters. This guest \ -+ has %d disks, but the parameter was used %d times.") -+ nr_input_disks nr_output_disks; -+ -+ let input_sizes = get_disk_sizes input_disks in -+ List.mapi ( -+ fun i (disk, size) -> -+ let socket = sprintf "%s/out%d" dir i in -+ On_exit.unlink socket; -+ -+ output_to_local_file ~compressed -+ output_alloc output_format disk size socket; -+ -+ NBD_URI.Unix (socket, None) -+ ) (List.combine disks input_sizes) -+ in -+ - (), uris - - let finalize dir options () output_disks source inspect target_meta = -- let _, output_alloc, output_format, output_name, output_storage = options in -+ let _, disks, -+ output_alloc, output_format, output_name, output_storage = options in - -- let doc = create_kubevirt_yaml source inspect target_meta -- (disk_path output_storage output_name) -+ (* This function will return the disk path for the i'th disk. *) -+ let disk_path = -+ match disks with -+ | None -> Output.disk_path output_storage output_name -+ | Some disks -> List.nth disks -+ in -+ -+ let doc = create_kubevirt_yaml source inspect target_meta disk_path - output_format output_name in - - let file = output_storage // output_name ^ ".yaml" in -diff --git a/tests/Makefile.am b/tests/Makefile.am -index 62237092..3a8bab3c 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -95,6 +95,7 @@ TESTS = \ - test-networks-and-bridges.sh \ - test-o-glance.sh \ - test-o-kubevirt-fedora.sh \ -+ test-o-kubevirt-oo-disk.sh \ - test-o-kubevirt-windows.sh \ - test-o-libvirt.sh \ - test-o-local-qcow2-compressed.sh \ -@@ -288,6 +289,7 @@ EXTRA_DIST += \ - test-o-glance.sh \ - test-o-kubevirt-fedora.sh \ - test-o-kubevirt-fedora.yaml.expected \ -+ test-o-kubevirt-oo-disk.sh \ - test-o-kubevirt-windows.sh \ - test-o-kubevirt-windows.yaml.expected \ - test-o-libvirt.sh \ -diff --git a/tests/test-o-kubevirt-oo-disk.sh b/tests/test-o-kubevirt-oo-disk.sh -new file mode 100755 -index 00000000..e1e6fd61 ---- /dev/null -+++ b/tests/test-o-kubevirt-oo-disk.sh -@@ -0,0 +1,52 @@ -+#!/bin/bash - -+# libguestfs virt-v2v test script -+# Copyright (C) 2018-2025 Red Hat Inc. -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -+ -+# Test -o kubevirt + -oo disk option. -+ -+set -e -+set -x -+ -+source ./functions.sh -+set -e -+set -x -+ -+skip_if_skipped -+requires test -f ../test-data/phony-guests/fedora.img -+ -+libvirt_uri="test://$abs_top_builddir/test-data/phony-guests/guests.xml" -+fedora=../test-data/phony-guests/fedora.img -+ -+d=test-o-kubevirt-oo-disk.d -+rm -rf $d -+cleanup_fn rm -r $d -+mkdir $d -+ -+# Run virt-v2v -o kubevirt. -+$VG virt-v2v --debug-gc \ -+ -i libvirt -ic "$libvirt_uri" fedora \ -+ -o kubevirt -oo disk=$d/disk.img -os $d -+ -+ls -l $d -+ -+cat $d/fedora.yaml -+ -+# Check the disk was created. -+test -f $d/disk.img -+ -+# Check the default path was _not_ created. -+! test -f $d/fedora-sda diff --git a/0010-convert-convert_linux.ml-Condense-device-regex-handl.patch b/0010-convert-convert_linux.ml-Condense-device-regex-handl.patch new file mode 100644 index 0000000..f95f5be --- /dev/null +++ b/0010-convert-convert_linux.ml-Condense-device-regex-handl.patch @@ -0,0 +1,36 @@ +From e7922450fa61f3280fbd9c429379e95bbde47787 Mon Sep 17 00:00:00 2001 +From: Cole Robinson +Date: Fri, 6 Feb 2026 15:17:05 -0500 +Subject: [PATCH] convert/convert_linux.ml: Condense device regex handling + +Signed-off-by: Cole Robinson +(cherry picked from commit cf8b872c3eb7009cb399bdd395f9894ac288b9db) +--- + convert/convert_linux.ml | 14 +++----------- + 1 file changed, 3 insertions(+), 11 deletions(-) + +diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml +index ce02b04a..d93036f9 100644 +--- a/convert/convert_linux.ml ++++ b/convert/convert_linux.ml +@@ -1194,17 +1194,9 @@ fi + device + in + +- if PCRE.matches rex_device_cciss value then ( +- let device = PCRE.sub 1 +- and part = try PCRE.sub 2 with Not_found -> "" in +- "/dev/" ^ replace device ^ part +- ) +- else if PCRE.matches rex_device_nvme value then ( +- let device = PCRE.sub 1 +- and part = try PCRE.sub 2 with Not_found -> "" in +- "/dev/" ^ replace device ^ part +- ) +- else if PCRE.matches rex_device value then ( ++ if PCRE.matches rex_device_cciss value || ++ PCRE.matches rex_device_nvme value || ++ PCRE.matches rex_device value then ( + let device = PCRE.sub 1 + and part = try PCRE.sub 2 with Not_found -> "" in + "/dev/" ^ replace device ^ part diff --git a/0010-output-Add-optional-create-parameter.patch b/0010-output-Add-optional-create-parameter.patch deleted file mode 100644 index e36e5af..0000000 --- a/0010-output-Add-optional-create-parameter.patch +++ /dev/null @@ -1,141 +0,0 @@ -From ab8623d45801d50e0d9450033ba74a31fdb872fc Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Tue, 8 Jul 2025 11:08:08 +0100 -Subject: [PATCH] output: Add optional ?create parameter - -This parameter of Output.create_local_output_disks and -Output.output_to_local_file allows the default creation of disks to be -skipped. It defaults to true (ie. create them) which is the normal -behaviour. - -This allows output modes to implement the '-oo create=false' option, -although none do so far. ---- - output/output.ml | 61 ++++++++++++++++++++++++++--------------------- - output/output.mli | 5 +++- - 2 files changed, 38 insertions(+), 28 deletions(-) - -diff --git a/output/output.ml b/output/output.ml -index 65325538..15cb50db 100644 ---- a/output/output.ml -+++ b/output/output.ml -@@ -66,7 +66,9 @@ let error_if_disk_count_gt input_disks n = - - type on_exit_kill = Kill | KillAndWait - --let output_to_local_file ?(changeuid = fun f -> f ()) ?(compressed = false) -+let output_to_local_file ?(changeuid = fun f -> f ()) -+ ?(compressed = false) -+ ?(create = true) - ?(on_exit_kill = Kill) - output_alloc output_format filename size socket = - (* Check nbdkit is installed and has the required plugin. *) -@@ -83,13 +85,15 @@ let output_to_local_file ?(changeuid = fun f -> f ()) ?(compressed = false) - is a local qcow2-format file, i.e. ‘-of qcow2’") - ); - -- let g = open_guestfs () in -- let preallocation = -- match output_alloc with -- | Preallocated -> Some "full" -- | Sparse -> None in -- changeuid ( -- fun () -> g#disk_create ?preallocation filename output_format size -+ if create then ( -+ let g = open_guestfs () in -+ let preallocation = -+ match output_alloc with -+ | Preallocated -> Some "full" -+ | Sparse -> None in -+ changeuid ( -+ fun () -> g#disk_create ?preallocation filename output_format size -+ ) - ); - - let pid = -@@ -151,6 +155,7 @@ let disk_path os name i = - - let create_local_output_disks dir - ?(compressed = false) -+ ?(create = true) - output_alloc output_format output_name output_storage - input_disks = - let input_sizes = get_disk_sizes input_disks in -@@ -171,25 +176,27 @@ let create_local_output_disks dir - error (f_"nbdkit-file-plugin is not installed or not working"); - - (* We still have to create the output disks. *) -- let g = open_guestfs () in -- let preallocation = -- match output_alloc with -- | Preallocated -> Some "full" -- | Sparse -> None in -- List.iter ( -- fun (size, filename) -> -- g#disk_create ?preallocation filename output_format size; -+ if create then ( -+ let g = open_guestfs () in -+ let preallocation = -+ match output_alloc with -+ | Preallocated -> Some "full" -+ | Sparse -> None in -+ List.iter ( -+ fun (size, filename) -> -+ g#disk_create ?preallocation filename output_format size; - -- (* We've had issues with there not being enough space to write -- * the disk image. Run df on the output filename. df follows -- * symlinks and reports the space on the filesystem. But don't -- * fail here if df cannot be run. -- *) -- if verbose () then ( -- let cmd = sprintf "df %s 1>&2" (quote filename) in -- ignore (Sys.command cmd) -- ) -- ) (List.combine input_sizes output_disk_names); -+ (* We've had issues with there not being enough space to write -+ * the disk image. Run df on the output filename. df follows -+ * symlinks and reports the space on the filesystem. But don't -+ * fail here if df cannot be run. -+ *) -+ if verbose () then ( -+ let cmd = sprintf "df %s 1>&2" (quote filename) in -+ ignore (Sys.command cmd) -+ ) -+ ) (List.combine input_sizes output_disk_names) -+ ); - - let socket = sprintf "%s/out0" dir in - On_exit.unlink socket; -@@ -220,7 +227,7 @@ let create_local_output_disks dir - On_exit.unlink socket; - - (* Create the actual output disk. *) -- output_to_local_file ~compressed output_alloc output_format -+ output_to_local_file ~compressed ~create output_alloc output_format - outdisk size socket; - - NBD_URI.Unix (socket, None) -diff --git a/output/output.mli b/output/output.mli -index 51bdde06..63a1c3f6 100644 ---- a/output/output.mli -+++ b/output/output.mli -@@ -84,6 +84,7 @@ val error_if_disk_count_gt : NBD_URI.t list -> int -> unit - - val create_local_output_disks : string -> - ?compressed:bool -> -+ ?create:bool -> - Types.output_allocation -> - string -> string -> string -> - NBD_URI.t list -> -@@ -98,7 +99,9 @@ val create_local_output_disks : string -> - type on_exit_kill = Kill | KillAndWait - - val output_to_local_file : ?changeuid:((unit -> unit) -> unit) -> -- ?compressed:bool -> ?on_exit_kill:on_exit_kill -> -+ ?compressed:bool -> -+ ?create:bool -> -+ ?on_exit_kill:on_exit_kill -> - Types.output_allocation -> - string -> string -> int64 -> string -> - unit diff --git a/0011-convert-linux-replace-etc-crypttab-dev-sdX-with-UUID.patch b/0011-convert-linux-replace-etc-crypttab-dev-sdX-with-UUID.patch new file mode 100644 index 0000000..43ecbb3 --- /dev/null +++ b/0011-convert-linux-replace-etc-crypttab-dev-sdX-with-UUID.patch @@ -0,0 +1,75 @@ +From 29dc8ba93237d7d70f5c39c28d74ec9bae0f9c00 Mon Sep 17 00:00:00 2001 +From: Cole Robinson +Date: Sun, 26 Oct 2025 12:53:58 -0400 +Subject: [PATCH] convert: linux: replace /etc/crypttab /dev/sdX with UUID= + +sles12sp5 installer luks setup will put a /dev/sdX style path +in /etc/crypttab. Example: + + $ cat /etc/crypttab + cr_sda2 /dev/sda2 none none + +For v2v conversion, switching that path to eg. /dev/vda2 is not enough: +initrd rebuild does not work correctly with systemd-cryptsetup, +because that new path doesn't exist at v2v conversion time, and +the converted guest doesn't boot correctly. + +What we really want is to replace the unstable path with +UUID=, to make this unambiguous. Do that for /dev/sdX +paths, where the appliance disk ordering should match, so a +vfs_uuid call gives us the UUID we want. + +Fixes: https://issues.redhat.com/browse/RHEL-93583 + +Signed-off-by: Cole Robinson +(cherry picked from commit 25b36dd60ada5a924b0d40a13d92c5e693cbe1a8) +--- + convert/convert_linux.ml | 28 +++++++++++++++++++++++++++- + 1 file changed, 27 insertions(+), 1 deletion(-) + +diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml +index d93036f9..4462e6cf 100644 +--- a/convert/convert_linux.ml ++++ b/convert/convert_linux.ml +@@ -1165,6 +1165,7 @@ fi + let paths = [ + (* /etc/fstab *) + "/files/etc/fstab/*/spec"; ++ "/files/etc/crypttab/*/device"; + ] in + (* Bootloader config *) + let paths = paths @ bootloader#augeas_device_patterns in +@@ -1199,7 +1200,32 @@ fi + PCRE.matches rex_device value then ( + let device = PCRE.sub 1 + and part = try PCRE.sub 2 with Not_found -> "" in +- "/dev/" ^ replace device ^ part ++ let adjusted_dev = "/dev/" ^ replace device ^ part in ++ ++ (* On sles12sp5, the installer puts a non-stable path into ++ /etc/crypttab, like /dev/sda2. If we replace it with eg. /dev/vda2, ++ and then regenerate dracut initrd, systemd cryptab integration ++ doesn't happen correctly, because it all expects /dev/vda2 to ++ exist at initrd creation time.. ++ ++ We can avoid this by filling in a stable `UUID=` value. ++ This depends on /dev/sdXX in the guest having the same /dev/sdXX ++ name in the appliance. ++ *) ++ if String.starts_with "/etc/crypttab" path && ++ String.starts_with "/dev/sd" value then ( ++ try ++ let uuid = g#vfs_uuid value in ++ "UUID=" ^ uuid ++ with ex -> ++ warning (f_"failed to translate encrypted device name %s to a UUID \ ++ in /etc/crypttab. This may prevent the guest from booting \ ++ after conversion. You may have to manually change the file and \ ++ reconvert. The original error was: %s") ++ value (Printexc.to_string ex); ++ adjusted_dev ++ ) else ++ adjusted_dev + ) + else (* doesn't look like a known device name *) + value diff --git a/0011-o-kubevirt-Add-oo-create-false-to-avoid-disk-creatio.patch b/0011-o-kubevirt-Add-oo-create-false-to-avoid-disk-creatio.patch deleted file mode 100644 index d218580..0000000 --- a/0011-o-kubevirt-Add-oo-create-false-to-avoid-disk-creatio.patch +++ /dev/null @@ -1,119 +0,0 @@ -From b0ac37f6c9f6ab8da44e631e9cb6af5649548634 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Tue, 8 Jul 2025 11:15:56 +0100 -Subject: [PATCH] -o kubevirt: Add -oo create=false to avoid disk creation - -Indicate that an external process will create the disks, so normal -creation of disks by virt-v2v should be skipped. - -Testing -------- - -I couldn't think of a way to add a test this since g#disk_create -(implemented in libguestfs.git:lib/create.c) will open(O_TRUNC) + -truncate(2) the existing disk, so the inode will remain the same. -Instead I tested it by hand by not creating the disk and observing the -error from nbdkit: - - nbdkit: error: realpath: /var/tmp/disk.img: No such file or directory - virt-v2v: error: nbdkit did not start up. There may be errors printed by - nbdkit above. - -Fixes: https://issues.redhat.com/browse/RHEL-101599 ---- - docs/virt-v2v.pod | 5 +++++ - output/output_kubevirt.ml | 17 +++++++++++------ - 2 files changed, 16 insertions(+), 6 deletions(-) - -diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod -index 5020d179..e228fb33 100644 ---- a/docs/virt-v2v.pod -+++ b/docs/virt-v2v.pod -@@ -603,6 +603,11 @@ For outputs which support qcow2 format (I<-of qcow2>), this writes a - compressed qcow2 file. It is the equivalent to the I<-c> option of - L. - -+=item B<-oo create=false> -+ -+For I<-o kubevirt>, indicate that another management process will -+create the output disks, so do not (re-)create them in virt-v2v. -+ - =item B<-oo disk=>DISK - - For I<-o kubevirt> this overrides the path to each output disk, -diff --git a/output/output_kubevirt.ml b/output/output_kubevirt.ml -index eae9c049..8a5ab56d 100644 ---- a/output/output_kubevirt.ml -+++ b/output/output_kubevirt.ml -@@ -36,7 +36,8 @@ let rfc1123_re = - - module Kubevirt = struct - type poptions = -- bool * string list option * output_allocation * string * string * string -+ bool * bool * string list option * -+ output_allocation * string * string * string - - type t = unit - -@@ -50,17 +51,21 @@ module Kubevirt = struct - printf (f_"Output options that can be used with -o kubevirt: - - -oo compressed Compress the output file (used only with -of qcow2) -+ -oo create=false Do not create the output disks - -oo disk=disk1 Specify filename of output disk (if used, must be - given once for each disk, else -os path is used) - ") - - let parse_options options source = - let compressed = ref false in -+ let create = ref true in - let disks = ref [] in - List.iter ( - function - | "compressed", "" -> compressed := true - | "compressed", v -> compressed := bool_of_string v -+ | "create", "" -> create := true -+ | "create", v -> create := bool_of_string v - | "disk", v -> List.push_back disks v - | k, _ -> - error (f_"-o kubevirt: unknown output option ‘-oo %s’") k -@@ -90,18 +95,18 @@ module Kubevirt = struct - - let disks = match !disks with [] -> None | disks -> Some disks in - -- !compressed, disks, -+ !compressed, !create, disks, - options.output_alloc, options.output_format, - output_name, output_storage - - let setup dir options source input_disks = -- let compressed, disks, -+ let compressed, create, disks, - output_alloc, output_format, output_name, output_storage = options in - - let uris = - match disks with - | None -> -- create_local_output_disks dir ~compressed -+ create_local_output_disks dir ~compressed ~create - output_alloc output_format output_name output_storage input_disks - | Some disks -> - (* -oo disk specified, so create the disks by hand. *) -@@ -118,7 +123,7 @@ module Kubevirt = struct - let socket = sprintf "%s/out%d" dir i in - On_exit.unlink socket; - -- output_to_local_file ~compressed -+ output_to_local_file ~compressed ~create - output_alloc output_format disk size socket; - - NBD_URI.Unix (socket, None) -@@ -128,7 +133,7 @@ module Kubevirt = struct - (), uris - - let finalize dir options () output_disks source inspect target_meta = -- let _, disks, -+ let _, _, disks, - output_alloc, output_format, output_name, output_storage = options in - - (* This function will return the disk path for the i'th disk. *) diff --git a/0012-build-replace-AM_GNU_GETTEXT-with-simpler-LIBINTL-ch.patch b/0012-build-replace-AM_GNU_GETTEXT-with-simpler-LIBINTL-ch.patch new file mode 100644 index 0000000..172cae0 --- /dev/null +++ b/0012-build-replace-AM_GNU_GETTEXT-with-simpler-LIBINTL-ch.patch @@ -0,0 +1,4099 @@ +From 97c9a2a57adab5ca4ae9c6a7190edb1603443b1c Mon Sep 17 00:00:00 2001 +From: Cole Robinson +Date: Mon, 9 Feb 2026 19:37:39 -0500 +Subject: [PATCH] build: replace AM_GNU_GETTEXT with simpler LIBINTL check + +This reverts "m4: Add junk required to make 'AM_GNU_GETTEXT' work" +commit b9f75ca5b8d091c91187720cd52210117718c693 + +Switch to a simpler LIBINTL check and delete config.rpath while +we are touching it. + +This is the virt-v2v version of what was done in these libguestfs +commits: + +https://github.com/libguestfs/libguestfs/commit/12acfa7de33 +https://github.com/libguestfs/libguestfs/commit/a497a24ecfa +https://github.com/libguestfs/libguestfs/commit/a419076bd3d +(cherry picked from commit 2df2aeb119abf4b26066af20209f48d8ed1ca75f) +--- + Makefile.am | 1 - + build-aux/config.rpath | 751 ------------------------------------ + m4/build-to-host.m4 | 274 -------------- + m4/gettext.m4 | 393 ------------------- + m4/guestfs-libraries.m4 | 10 +- + m4/host-cpu-c-abi.m4 | 532 -------------------------- + m4/iconv.m4 | 324 ---------------- + m4/intlmacosx.m4 | 71 ---- + m4/lib-ld.m4 | 170 --------- + m4/lib-link.m4 | 815 ---------------------------------------- + m4/lib-prefix.m4 | 334 ---------------- + m4/nls.m4 | 33 -- + m4/po.m4 | 157 -------- + m4/progtest.m4 | 93 ----- + 14 files changed, 9 insertions(+), 3949 deletions(-) + delete mode 100755 build-aux/config.rpath + delete mode 100644 m4/build-to-host.m4 + delete mode 100644 m4/gettext.m4 + delete mode 100644 m4/host-cpu-c-abi.m4 + delete mode 100644 m4/iconv.m4 + delete mode 100644 m4/intlmacosx.m4 + delete mode 100644 m4/lib-ld.m4 + delete mode 100644 m4/lib-link.m4 + delete mode 100644 m4/lib-prefix.m4 + delete mode 100644 m4/nls.m4 + delete mode 100644 m4/po.m4 + delete mode 100644 m4/progtest.m4 + +diff --git a/Makefile.am b/Makefile.am +index c66f9656..d2e645c9 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -66,7 +66,6 @@ EXTRA_DIST = \ + .github/workflows/main.yml \ + .gitignore \ + bugs-in-changelog.sh \ +- build-aux/config.rpath \ + check-mli.sh \ + common/.gitignore \ + common/README \ +diff --git a/build-aux/config.rpath b/build-aux/config.rpath +deleted file mode 100755 +index e42a98cb..00000000 +--- a/build-aux/config.rpath ++++ /dev/null +@@ -1,751 +0,0 @@ +-#!/usr/bin/sh +-# Output a system dependent set of variables, describing how to set the +-# run time search path of shared libraries in a binary (executable or +-# shared library). +-# +-# Copyright 1996-2025 Free Software Foundation, Inc. +-# Taken from GNU libtool, 2001 +-# Originally by Gordon Matzigkeit , 1996 +-# +-# This file is free software; the Free Software Foundation gives +-# unlimited permission to copy and/or distribute it, with or without +-# modifications, as long as this notice is preserved. +- +-# Known limitations: +-# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +-# than 256 bytes, otherwise the compiler driver will dump core. The only +-# known workaround is to choose shorter directory names for the build +-# directory and/or the installation directory. +- +-# func_usage +-# outputs to stdout the --help usage message. +-func_usage () +-{ +- echo "\ +-Usage: config.rpath [OPTION] HOST +- +-Prints shell variable assignments that describe how to hardcode a directory +-for the lookup of shared libraries into a binary (executable or shared library). +- +-The first argument passed to this file is the canonical host specification, +- CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +-or +- CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +- +-The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +-should be set by the caller. +- +-The set of defined variables is at the end of this script. +- +-Options: +- --help print this help and exit +- --version print version information and exit +- +-Send patches and bug reports to ." +-} +- +-# func_version +-# outputs to stdout the --version message. +-func_version () +-{ +- echo "config.rpath (GNU gnulib, module havelib)" +- echo "Copyright (C) 2025 Free Software Foundation, Inc. +-License: All-Permissive. +-This is free software: you are free to change and redistribute it. +-There is NO WARRANTY, to the extent permitted by law." +- echo +- printf 'Written by %s.\n' "Bruno Haible" +-} +- +-# func_fatal_error message +-# outputs to stderr a fatal error message, and terminates the program. +-func_fatal_error () +-{ +- echo "config.rpath: *** $1" 1>&2 +- echo "config.rpath: *** Stop." 1>&2 +- exit 1 +-} +- +-# Command-line option processing. +-while test $# -gt 0; do +- case "$1" in +- --help | --hel | --he | --h ) +- func_usage +- exit 0 ;; +- --version | --versio | --versi | --vers | --ver | --ve | --v ) +- func_version +- exit 0 ;; +- -- ) # Stop option processing +- shift; break ;; +- -* ) +- func_fatal_error "unrecognized option: $1" +- ;; +- * ) +- break ;; +- esac +-done +- +-if test $# -gt 1; then +- func_fatal_error "too many arguments" +-fi +-if test $# -lt 1; then +- func_fatal_error "too few arguments" +-fi +- +-# All known linkers require a '.a' archive for static linking (except MSVC, +-# which needs '.lib'). +-libext=a +-shrext=.so +- +-host="$1" +-host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +-host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +-host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +- +-# Code taken from libtool.m4's _LT_CC_BASENAME. +- +-for cc_temp in $CC""; do +- case $cc_temp in +- compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; +- distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; +- \-*) ;; +- *) break;; +- esac +-done +-cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` +- +-# Code taken from libtool.m4's _LT_COMPILER_PIC. +- +-wl= +-if test "$GCC" = yes; then +- wl='-Wl,' +-else +- case "$host_os" in +- aix*) +- wl='-Wl,' +- ;; +- mingw* | cygwin* | pw32* | os2* | cegcc*) +- ;; +- hpux9* | hpux10* | hpux11*) +- wl='-Wl,' +- ;; +- irix5* | irix6* | nonstopux*) +- wl='-Wl,' +- ;; +- linux* | k*bsd*-gnu | kopensolaris*-gnu) +- case $cc_basename in +- ecc*) +- wl='-Wl,' +- ;; +- icc* | ifort*) +- wl='-Wl,' +- ;; +- lf95*) +- wl='-Wl,' +- ;; +- nagfor*) +- wl='-Wl,-Wl,,' +- ;; +- pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) +- wl='-Wl,' +- ;; +- ccc*) +- wl='-Wl,' +- ;; +- xl* | bgxl* | bgf* | mpixl*) +- wl='-Wl,' +- ;; +- como) +- wl='-lopt=' +- ;; +- *) +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ F* | *Sun*Fortran*) +- wl= +- ;; +- *Sun\ C*) +- wl='-Wl,' +- ;; +- esac +- ;; +- esac +- ;; +- newsos6) +- ;; +- *nto* | *qnx*) +- ;; +- osf3* | osf4* | osf5*) +- wl='-Wl,' +- ;; +- rdos*) +- ;; +- solaris*) +- case $cc_basename in +- f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) +- wl='-Qoption ld ' +- ;; +- *) +- wl='-Wl,' +- ;; +- esac +- ;; +- sunos4*) +- wl='-Qoption ld ' +- ;; +- sysv4 | sysv4.2uw2* | sysv4.3*) +- wl='-Wl,' +- ;; +- sysv4*MP*) +- ;; +- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) +- wl='-Wl,' +- ;; +- unicos*) +- wl='-Wl,' +- ;; +- uts4*) +- ;; +- esac +-fi +- +-# Code taken from libtool.m4's _LT_LINKER_SHLIBS. +- +-hardcode_libdir_flag_spec= +-hardcode_libdir_separator= +-hardcode_direct=no +-hardcode_minus_L=no +- +-case "$host_os" in +- cygwin* | mingw* | pw32* | cegcc*) +- # FIXME: the MSVC++ port hasn't been tested in a loooong time +- # When not using gcc, we currently assume that we are using +- # Microsoft Visual C++. +- if test "$GCC" != yes; then +- with_gnu_ld=no +- fi +- ;; +- interix*) +- # we just hope/assume this is gcc and not c89 (= MSVC++) +- with_gnu_ld=yes +- ;; +- openbsd*) +- with_gnu_ld=no +- ;; +-esac +- +-ld_shlibs=yes +-if test "$with_gnu_ld" = yes; then +- # Set some defaults for GNU ld with shared library support. These +- # are reset later if shared libraries are not supported. Putting them +- # here allows them to be overridden if necessary. +- # Unlike libtool, we use -rpath here, not --rpath, since the documented +- # option of GNU ld is called -rpath, not --rpath. +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- case "$host_os" in +- aix[3-9]*) +- # On AIX/PPC, the GNU linker is very broken +- if test "$host_cpu" != ia64; then +- ld_shlibs=no +- fi +- ;; +- amigaos*) +- case "$host_cpu" in +- powerpc) +- ;; +- m68k) +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- ;; +- esac +- ;; +- beos*) +- if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then +- : +- else +- ld_shlibs=no +- fi +- ;; +- cygwin* | mingw* | pw32* | cegcc*) +- # hardcode_libdir_flag_spec is actually meaningless, as there is +- # no search path for DLLs. +- hardcode_libdir_flag_spec='-L$libdir' +- if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then +- : +- else +- ld_shlibs=no +- fi +- ;; +- haiku*) +- ;; +- interix[3-9]*) +- hardcode_direct=no +- hardcode_libdir_flag_spec='${wl}-rpath,$libdir' +- ;; +- gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) +- if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then +- : +- else +- ld_shlibs=no +- fi +- ;; +- netbsd*) +- ;; +- solaris*) +- if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then +- ld_shlibs=no +- elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then +- : +- else +- ld_shlibs=no +- fi +- ;; +- sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) +- case `$LD -v 2>&1` in +- *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) +- ld_shlibs=no +- ;; +- *) +- if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then +- hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' +- else +- ld_shlibs=no +- fi +- ;; +- esac +- ;; +- sunos4*) +- hardcode_direct=yes +- ;; +- *) +- if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then +- : +- else +- ld_shlibs=no +- fi +- ;; +- esac +- if test "$ld_shlibs" = no; then +- hardcode_libdir_flag_spec= +- fi +-else +- case "$host_os" in +- aix3*) +- # Note: this linker hardcodes the directories in LIBPATH if there +- # are no directories specified by -L. +- hardcode_minus_L=yes +- if test "$GCC" = yes; then +- # Neither direct hardcoding nor static linking is supported with a +- # broken collect2. +- hardcode_direct=unsupported +- fi +- ;; +- aix[4-9]*) +- if test "$host_cpu" = ia64; then +- # On IA64, the linker does run time linking by default, so we don't +- # have to do anything special. +- aix_use_runtimelinking=no +- else +- aix_use_runtimelinking=no +- # Test if we are trying to use run time linking or normal +- # AIX style linking. If -brtl is somewhere in LDFLAGS, we +- # need to do runtime linking. +- case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) +- for ld_flag in $LDFLAGS; do +- if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then +- aix_use_runtimelinking=yes +- break +- fi +- done +- ;; +- esac +- fi +- hardcode_direct=yes +- hardcode_libdir_separator=':' +- if test "$GCC" = yes; then +- case $host_os in aix4.[012]|aix4.[012].*) +- collect2name=`${CC} -print-prog-name=collect2` +- if test -f "$collect2name" && \ +- strings "$collect2name" | grep resolve_lib_name >/dev/null +- then +- # We have reworked collect2 +- : +- else +- # We have old collect2 +- hardcode_direct=unsupported +- hardcode_minus_L=yes +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_libdir_separator= +- fi +- ;; +- esac +- fi +- # Begin _LT_AC_SYS_LIBPATH_AIX. +- echo 'int main () { return 0; }' > conftest.c +- ${CC} ${LDFLAGS} conftest.c -o conftest +- aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +-}'` +- if test -z "$aix_libpath"; then +- aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +-}'` +- fi +- if test -z "$aix_libpath"; then +- aix_libpath="/usr/lib:/lib" +- fi +- rm -f conftest.c conftest +- # End _LT_AC_SYS_LIBPATH_AIX. +- if test "$aix_use_runtimelinking" = yes; then +- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" +- else +- if test "$host_cpu" = ia64; then +- hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' +- else +- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" +- fi +- fi +- ;; +- amigaos*) +- case "$host_cpu" in +- powerpc) +- ;; +- m68k) +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- ;; +- esac +- ;; +- bsdi[45]*) +- ;; +- cygwin* | mingw* | pw32* | cegcc*) +- # When not using gcc, we currently assume that we are using +- # Microsoft Visual C++. +- # hardcode_libdir_flag_spec is actually meaningless, as there is +- # no search path for DLLs. +- hardcode_libdir_flag_spec=' ' +- libext=lib +- ;; +- darwin* | rhapsody*) +- hardcode_direct=no +- if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then +- : +- else +- ld_shlibs=no +- fi +- ;; +- dgux*) +- hardcode_libdir_flag_spec='-L$libdir' +- ;; +- freebsd2.[01]*) +- hardcode_direct=yes +- hardcode_minus_L=yes +- ;; +- freebsd* | dragonfly* | midnightbsd*) +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- ;; +- hpux9*) +- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator=: +- hardcode_direct=yes +- # hardcode_minus_L: Not really in the search PATH, +- # but as the default location of the library. +- hardcode_minus_L=yes +- ;; +- hpux10*) +- if test "$with_gnu_ld" = no; then +- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator=: +- hardcode_direct=yes +- # hardcode_minus_L: Not really in the search PATH, +- # but as the default location of the library. +- hardcode_minus_L=yes +- fi +- ;; +- hpux11*) +- if test "$with_gnu_ld" = no; then +- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator=: +- case $host_cpu in +- hppa*64*|ia64*) +- hardcode_direct=no +- ;; +- *) +- hardcode_direct=yes +- # hardcode_minus_L: Not really in the search PATH, +- # but as the default location of the library. +- hardcode_minus_L=yes +- ;; +- esac +- fi +- ;; +- irix5* | irix6* | nonstopux*) +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- ;; +- netbsd*) +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- ;; +- newsos6) +- hardcode_direct=yes +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- ;; +- *nto* | *qnx*) +- ;; +- openbsd*) +- if test -f /usr/libexec/ld.so; then +- hardcode_direct=yes +- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- hardcode_libdir_flag_spec='${wl}-rpath,$libdir' +- else +- case "$host_os" in +- openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) +- hardcode_libdir_flag_spec='-R$libdir' +- ;; +- *) +- hardcode_libdir_flag_spec='${wl}-rpath,$libdir' +- ;; +- esac +- fi +- else +- ld_shlibs=no +- fi +- ;; +- os2*) +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- ;; +- osf3*) +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- ;; +- osf4* | osf5*) +- if test "$GCC" = yes; then +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- else +- # Both cc and cxx compiler support -rpath directly +- hardcode_libdir_flag_spec='-rpath $libdir' +- fi +- hardcode_libdir_separator=: +- ;; +- solaris*) +- hardcode_libdir_flag_spec='-R$libdir' +- ;; +- sunos4*) +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_direct=yes +- hardcode_minus_L=yes +- ;; +- sysv4) +- case $host_vendor in +- sni) +- hardcode_direct=yes # is this really true??? +- ;; +- siemens) +- hardcode_direct=no +- ;; +- motorola) +- hardcode_direct=no #Motorola manual says yes, but my tests say they lie +- ;; +- esac +- ;; +- sysv4.3*) +- ;; +- sysv4*MP*) +- if test -d /usr/nec; then +- ld_shlibs=yes +- fi +- ;; +- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) +- ;; +- sysv5* | sco3.2v5* | sco5v6*) +- hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' +- hardcode_libdir_separator=':' +- ;; +- uts4*) +- hardcode_libdir_flag_spec='-L$libdir' +- ;; +- *) +- ld_shlibs=no +- ;; +- esac +-fi +- +-# Check dynamic linker characteristics +-# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER. +-# Unlike libtool.m4, here we don't care about _all_ names of the library, but +-# only about the one the linker finds when passed -lNAME. This is the last +-# element of library_names_spec in libtool.m4, or possibly two of them if the +-# linker has special search rules. +-library_names_spec= # the last element of library_names_spec in libtool.m4 +-libname_spec='lib$name' +-case "$host_os" in +- aix3*) +- library_names_spec='$libname.a' +- ;; +- aix[4-9]*) +- library_names_spec='$libname$shrext' +- ;; +- amigaos*) +- case "$host_cpu" in +- powerpc*) +- library_names_spec='$libname$shrext' ;; +- m68k) +- library_names_spec='$libname.a' ;; +- esac +- ;; +- beos*) +- library_names_spec='$libname$shrext' +- ;; +- bsdi[45]*) +- library_names_spec='$libname$shrext' +- ;; +- cygwin* | mingw* | pw32* | cegcc*) +- shrext=.dll +- library_names_spec='$libname.dll.a $libname.lib' +- ;; +- darwin* | rhapsody*) +- shrext=.dylib +- library_names_spec='$libname$shrext' +- ;; +- dgux*) +- library_names_spec='$libname$shrext' +- ;; +- freebsd[23].*) +- library_names_spec='$libname$shrext$versuffix' +- ;; +- freebsd* | dragonfly* | midnightbsd*) +- library_names_spec='$libname$shrext' +- ;; +- gnu*) +- library_names_spec='$libname$shrext' +- ;; +- haiku*) +- library_names_spec='$libname$shrext' +- ;; +- hpux9* | hpux10* | hpux11*) +- case $host_cpu in +- ia64*) +- shrext=.so +- ;; +- hppa*64*) +- shrext=.sl +- ;; +- *) +- shrext=.sl +- ;; +- esac +- library_names_spec='$libname$shrext' +- ;; +- interix[3-9]*) +- library_names_spec='$libname$shrext' +- ;; +- irix5* | irix6* | nonstopux*) +- library_names_spec='$libname$shrext' +- case "$host_os" in +- irix5* | nonstopux*) +- libsuff= shlibsuff= +- ;; +- *) +- case $LD in +- *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; +- *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; +- *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; +- *) libsuff= shlibsuff= ;; +- esac +- ;; +- esac +- ;; +- linux*oldld* | linux*aout* | linux*coff*) +- ;; +- linux* | k*bsd*-gnu | kopensolaris*-gnu) +- library_names_spec='$libname$shrext' +- ;; +- knetbsd*-gnu) +- library_names_spec='$libname$shrext' +- ;; +- netbsd*) +- library_names_spec='$libname$shrext' +- ;; +- newsos6) +- library_names_spec='$libname$shrext' +- ;; +- *nto* | *qnx*) +- library_names_spec='$libname$shrext' +- ;; +- openbsd*) +- library_names_spec='$libname$shrext$versuffix' +- ;; +- os2*) +- libname_spec='$name' +- shrext=.dll +- library_names_spec='$libname.a' +- ;; +- osf3* | osf4* | osf5*) +- library_names_spec='$libname$shrext' +- ;; +- rdos*) +- ;; +- solaris*) +- library_names_spec='$libname$shrext' +- ;; +- sunos4*) +- library_names_spec='$libname$shrext$versuffix' +- ;; +- sysv4 | sysv4.3*) +- library_names_spec='$libname$shrext' +- ;; +- sysv4*MP*) +- library_names_spec='$libname$shrext' +- ;; +- sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) +- library_names_spec='$libname$shrext' +- ;; +- tpf*) +- library_names_spec='$libname$shrext' +- ;; +- uts4*) +- library_names_spec='$libname$shrext' +- ;; +-esac +- +-sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +-escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +-shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +-escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +-escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +-escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +- +-LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' < C:\foo\bar +-dnl /usr/local/share -> C:\cygwin64\usr\local\share +-dnl +-dnl gl_BUILD_TO_HOST([somedir]) +-dnl This macro takes as input an AC_SUBSTed variable 'somedir', which must +-dnl already have its final value assigned, and produces two additional +-dnl AC_SUBSTed variables 'somedir_c' and 'somedir_c_make', that designate the +-dnl same file name value, just in different syntax: +-dnl - somedir_c is the file name in target runtime environment syntax, +-dnl as a C string (starting and ending with a double-quote, +-dnl and with escaped backslashes and double-quotes in +-dnl between). +-dnl - somedir_c_make is the same thing, escaped for use in a Makefile. +- +-AC_DEFUN([gl_BUILD_TO_HOST], +-[ +- AC_REQUIRE([AC_CANONICAL_BUILD]) +- AC_REQUIRE([AC_CANONICAL_HOST]) +- AC_REQUIRE([gl_BUILD_TO_HOST_INIT]) +- +- dnl Define somedir_c. +- gl_final_[$1]="$[$1]" +- dnl Translate it from build syntax to host syntax. +- case "$build_os" in +- cygwin*) +- case "$host_os" in +- mingw* | windows*) +- gl_final_[$1]=`cygpath -w "$gl_final_[$1]"` ;; +- esac +- ;; +- esac +- dnl Convert it to C string syntax. +- [$1]_c=`printf '%s\n' "$gl_final_[$1]" | sed -e "$gl_sed_double_backslashes" -e "$gl_sed_escape_doublequotes" | tr -d "$gl_tr_cr"` +- [$1]_c='"'"$[$1]_c"'"' +- AC_SUBST([$1_c]) +- +- dnl Define somedir_c_make. +- [$1]_c_make=`printf '%s\n' "$[$1]_c" | sed -e "$gl_sed_escape_for_make_1" -e "$gl_sed_escape_for_make_2" | tr -d "$gl_tr_cr"` +- dnl Use the substituted somedir variable, when possible, so that the user +- dnl may adjust somedir a posteriori when there are no special characters. +- if test "$[$1]_c_make" = '\"'"${gl_final_[$1]}"'\"'; then +- [$1]_c_make='\"$([$1])\"' +- fi +- AC_SUBST([$1_c_make]) +-]) +- +-dnl Some initializations for gl_BUILD_TO_HOST. +-AC_DEFUN([gl_BUILD_TO_HOST_INIT], +-[ +- gl_sed_double_backslashes='s/\\/\\\\/g' +- gl_sed_escape_doublequotes='s/"/\\"/g' +-changequote(,)dnl +- gl_sed_escape_for_make_1="s,\\([ \"&'();<>\\\\\`|]\\),\\\\\\1,g" +-changequote([,])dnl +- gl_sed_escape_for_make_2='s,\$,\\$$,g' +- dnl Find out how to remove carriage returns from output. Solaris /usr/ucb/tr +- dnl does not understand '\r'. +- case `echo r | tr -d '\r'` in +- '') gl_tr_cr='\015' ;; +- *) gl_tr_cr='\r' ;; +- esac +-]) +- +- +-dnl The following macros are convenience invocations of gl_BUILD_TO_HOST +-dnl for some of the variables that are defined by Autoconf. +-dnl To do so for _all_ the possible variables, use the module 'configmake'. +- +-dnl Defines bindir_c and bindir_c_make. +-AC_DEFUN_ONCE([gl_BUILD_TO_HOST_BINDIR], +-[ +- dnl Find the final value of bindir. +- gl_saved_prefix="${prefix}" +- gl_saved_exec_prefix="${exec_prefix}" +- gl_saved_bindir="${bindir}" +- dnl Unfortunately, prefix and exec_prefix get only finally determined +- dnl at the end of configure. +- if test "X$prefix" = "XNONE"; then +- prefix="$ac_default_prefix" +- fi +- if test "X$exec_prefix" = "XNONE"; then +- exec_prefix='${prefix}' +- fi +- eval exec_prefix="$exec_prefix" +- eval bindir="$bindir" +- gl_BUILD_TO_HOST([bindir]) +- bindir="${gl_saved_bindir}" +- exec_prefix="${gl_saved_exec_prefix}" +- prefix="${gl_saved_prefix}" +-]) +- +-dnl Defines datadir_c and datadir_c_make, +-dnl where datadir = $(datarootdir) +-AC_DEFUN_ONCE([gl_BUILD_TO_HOST_DATADIR], +-[ +- dnl Find the final value of datadir. +- gl_saved_prefix="${prefix}" +- gl_saved_datarootdir="${datarootdir}" +- gl_saved_datadir="${datadir}" +- dnl Unfortunately, prefix gets only finally determined at the end of +- dnl configure. +- if test "X$prefix" = "XNONE"; then +- prefix="$ac_default_prefix" +- fi +- eval datarootdir="$datarootdir" +- eval datadir="$datadir" +- gl_BUILD_TO_HOST([datadir]) +- datadir="${gl_saved_datadir}" +- datarootdir="${gl_saved_datarootdir}" +- prefix="${gl_saved_prefix}" +-]) +- +-dnl Defines libdir_c and libdir_c_make. +-AC_DEFUN_ONCE([gl_BUILD_TO_HOST_LIBDIR], +-[ +- dnl Find the final value of libdir. +- gl_saved_prefix="${prefix}" +- gl_saved_exec_prefix="${exec_prefix}" +- gl_saved_libdir="${libdir}" +- dnl Unfortunately, prefix and exec_prefix get only finally determined +- dnl at the end of configure. +- if test "X$prefix" = "XNONE"; then +- prefix="$ac_default_prefix" +- fi +- if test "X$exec_prefix" = "XNONE"; then +- exec_prefix='${prefix}' +- fi +- eval exec_prefix="$exec_prefix" +- eval libdir="$libdir" +- gl_BUILD_TO_HOST([libdir]) +- libdir="${gl_saved_libdir}" +- exec_prefix="${gl_saved_exec_prefix}" +- prefix="${gl_saved_prefix}" +-]) +- +-dnl Defines libexecdir_c and libexecdir_c_make. +-AC_DEFUN_ONCE([gl_BUILD_TO_HOST_LIBEXECDIR], +-[ +- dnl Find the final value of libexecdir. +- gl_saved_prefix="${prefix}" +- gl_saved_exec_prefix="${exec_prefix}" +- gl_saved_libexecdir="${libexecdir}" +- dnl Unfortunately, prefix and exec_prefix get only finally determined +- dnl at the end of configure. +- if test "X$prefix" = "XNONE"; then +- prefix="$ac_default_prefix" +- fi +- if test "X$exec_prefix" = "XNONE"; then +- exec_prefix='${prefix}' +- fi +- eval exec_prefix="$exec_prefix" +- eval libexecdir="$libexecdir" +- gl_BUILD_TO_HOST([libexecdir]) +- libexecdir="${gl_saved_libexecdir}" +- exec_prefix="${gl_saved_exec_prefix}" +- prefix="${gl_saved_prefix}" +-]) +- +-dnl Defines localedir_c and localedir_c_make. +-AC_DEFUN_ONCE([gl_BUILD_TO_HOST_LOCALEDIR], +-[ +- dnl Find the final value of localedir. +- gl_saved_prefix="${prefix}" +- gl_saved_datarootdir="${datarootdir}" +- gl_saved_localedir="${localedir}" +- dnl Unfortunately, prefix gets only finally determined at the end of +- dnl configure. +- if test "X$prefix" = "XNONE"; then +- prefix="$ac_default_prefix" +- fi +- eval datarootdir="$datarootdir" +- eval localedir="$localedir" +- gl_BUILD_TO_HOST([localedir]) +- localedir="${gl_saved_localedir}" +- datarootdir="${gl_saved_datarootdir}" +- prefix="${gl_saved_prefix}" +-]) +- +-dnl Defines pkgdatadir_c and pkgdatadir_c_make, +-dnl where pkgdatadir = $(datadir)/$(PACKAGE) +-AC_DEFUN_ONCE([gl_BUILD_TO_HOST_PKGDATADIR], +-[ +- dnl Find the final value of pkgdatadir. +- gl_saved_prefix="${prefix}" +- gl_saved_datarootdir="${datarootdir}" +- gl_saved_datadir="${datadir}" +- gl_saved_pkgdatadir="${pkgdatadir}" +- dnl Unfortunately, prefix gets only finally determined at the end of +- dnl configure. +- if test "X$prefix" = "XNONE"; then +- prefix="$ac_default_prefix" +- fi +- eval datarootdir="$datarootdir" +- eval datadir="$datadir" +- eval pkgdatadir="$pkgdatadir" +- gl_BUILD_TO_HOST([pkgdatadir]) +- pkgdatadir="${gl_saved_pkgdatadir}" +- datadir="${gl_saved_datadir}" +- datarootdir="${gl_saved_datarootdir}" +- prefix="${gl_saved_prefix}" +-]) +- +-dnl Defines pkglibdir_c and pkglibdir_c_make, +-dnl where pkglibdir = $(libdir)/$(PACKAGE) +-AC_DEFUN_ONCE([gl_BUILD_TO_HOST_PKGLIBDIR], +-[ +- dnl Find the final value of pkglibdir. +- gl_saved_prefix="${prefix}" +- gl_saved_exec_prefix="${exec_prefix}" +- gl_saved_libdir="${libdir}" +- gl_saved_pkglibdir="${pkglibdir}" +- dnl Unfortunately, prefix and exec_prefix get only finally determined +- dnl at the end of configure. +- if test "X$prefix" = "XNONE"; then +- prefix="$ac_default_prefix" +- fi +- if test "X$exec_prefix" = "XNONE"; then +- exec_prefix='${prefix}' +- fi +- eval exec_prefix="$exec_prefix" +- eval libdir="$libdir" +- eval pkglibdir="$pkglibdir" +- gl_BUILD_TO_HOST([pkglibdir]) +- pkglibdir="${gl_saved_pkglibdir}" +- libdir="${gl_saved_libdir}" +- exec_prefix="${gl_saved_exec_prefix}" +- prefix="${gl_saved_prefix}" +-]) +- +-dnl Defines pkglibexecdir_c and pkglibexecdir_c_make, +-dnl where pkglibexecdir = $(libexecdir)/$(PACKAGE) +-AC_DEFUN_ONCE([gl_BUILD_TO_HOST_PKGLIBEXECDIR], +-[ +- dnl Find the final value of pkglibexecdir. +- gl_saved_prefix="${prefix}" +- gl_saved_exec_prefix="${exec_prefix}" +- gl_saved_libexecdir="${libexecdir}" +- gl_saved_pkglibexecdir="${pkglibexecdir}" +- dnl Unfortunately, prefix and exec_prefix get only finally determined +- dnl at the end of configure. +- if test "X$prefix" = "XNONE"; then +- prefix="$ac_default_prefix" +- fi +- if test "X$exec_prefix" = "XNONE"; then +- exec_prefix='${prefix}' +- fi +- eval exec_prefix="$exec_prefix" +- eval libexecdir="$libexecdir" +- eval pkglibexecdir="$pkglibexecdir" +- gl_BUILD_TO_HOST([pkglibexecdir]) +- pkglibexecdir="${gl_saved_pkglibexecdir}" +- libexecdir="${gl_saved_libexecdir}" +- exec_prefix="${gl_saved_exec_prefix}" +- prefix="${gl_saved_prefix}" +-]) +diff --git a/m4/gettext.m4 b/m4/gettext.m4 +deleted file mode 100644 +index 7de17f99..00000000 +--- a/m4/gettext.m4 ++++ /dev/null +@@ -1,393 +0,0 @@ +-# gettext.m4 +-# serial 81 (gettext-0.24) +-dnl Copyright (C) 1995-2025 Free Software Foundation, Inc. +-dnl This file is free software; the Free Software Foundation +-dnl gives unlimited permission to copy and/or distribute it, +-dnl with or without modifications, as long as this notice is preserved. +-dnl This file is offered as-is, without any warranty. +-dnl +-dnl This file can be used in projects which are not available under +-dnl the GNU General Public License or the GNU Lesser General Public +-dnl License but which still want to provide support for the GNU gettext +-dnl functionality. +-dnl Please note that the actual code of the GNU gettext library is covered +-dnl by the GNU Lesser General Public License, and the rest of the GNU +-dnl gettext package is covered by the GNU General Public License. +-dnl They are *not* in the public domain. +- +-dnl Authors: +-dnl Ulrich Drepper , 1995-2000. +-dnl Bruno Haible , 2000-2024. +- +-dnl Macro to add for using GNU gettext. +- +-dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). +-dnl INTLSYMBOL must be one of 'external', 'use-libtool', 'here'. +-dnl INTLSYMBOL should be 'external' for packages other than GNU gettext. +-dnl It should be 'use-libtool' for the packages 'gettext-runtime' and +-dnl 'gettext-tools'. +-dnl It should be 'here' for the package 'gettext-runtime/intl'. +-dnl If INTLSYMBOL is 'here', then a libtool library +-dnl $(top_builddir)/libintl.la will be created (shared and/or static, +-dnl depending on --{enable,disable}-{shared,static} and on the presence of +-dnl AM-DISABLE-SHARED). +-dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext +-dnl implementations (in libc or libintl) without the ngettext() function +-dnl will be ignored. If NEEDSYMBOL is specified and is +-dnl 'need-formatstring-macros', then GNU gettext implementations that don't +-dnl support the ISO C 99 formatstring macros will be ignored. +-dnl INTLDIR is used to find the intl libraries. If empty, +-dnl the value '$(top_builddir)/intl/' is used. +-dnl +-dnl The result of the configuration is one of three cases: +-dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled +-dnl and used. +-dnl Catalog format: GNU --> install in $(datadir) +-dnl Catalog extension: .mo after installation, .gmo in source tree +-dnl 2) GNU gettext has been found in the system's C library. +-dnl Catalog format: GNU --> install in $(datadir) +-dnl Catalog extension: .mo after installation, .gmo in source tree +-dnl 3) No internationalization, always use English msgid. +-dnl Catalog format: none +-dnl Catalog extension: none +-dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. +-dnl The use of .gmo is historical (it was needed to avoid overwriting the +-dnl GNU format catalogs when building on a platform with an X/Open gettext), +-dnl but we keep it in order not to force irrelevant filename changes on the +-dnl maintainers. +-dnl +-AC_DEFUN([AM_GNU_GETTEXT], +-[ +- dnl Argument checking. +- m4_if([$1], [], , [m4_if([$1], [external], , [m4_if([$1], [use-libtool], , [m4_if([$1], [here], , +- [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT +-])])])])]) +- m4_if(m4_if([$1], [], [old])[]m4_if([$1], [no-libtool], [old]), [old], +- [errprint([ERROR: Use of AM_GNU_GETTEXT without [external] argument is no longer supported. +-])]) +- m4_if([$2], [], , [m4_if([$2], [need-ngettext], , [m4_if([$2], [need-formatstring-macros], , +- [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT +-])])])]) +- define([gt_building_libintl_in_same_build_tree], +- m4_if([$1], [use-libtool], [yes], [m4_if([$1], [here], [yes], [no])])) +- gt_NEEDS_INIT +- AM_GNU_GETTEXT_NEED([$2]) +- +- AC_REQUIRE([AM_PO_SUBDIRS])dnl +- +- dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. +- AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) +- AC_REQUIRE([AC_LIB_RPATH]) +- +- dnl Sometimes libintl requires libiconv, so first search for libiconv. +- dnl Ideally we would do this search only after the +- dnl if test "$USE_NLS" = "yes"; then +- dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then +- dnl tests. But if configure.ac invokes AM_ICONV after AM_GNU_GETTEXT +- dnl the configure script would need to contain the same shell code +- dnl again, outside any 'if'. There are two solutions: +- dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. +- dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. +- dnl Since AC_PROVIDE_IFELSE is not documented, we avoid it. +- m4_if(gt_building_libintl_in_same_build_tree, yes, , [ +- AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) +- ]) +- +- dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation. +- gt_INTL_MACOSX +- +- dnl Set USE_NLS. +- AC_REQUIRE([AM_NLS]) +- +- m4_if(gt_building_libintl_in_same_build_tree, yes, [ +- USE_INCLUDED_LIBINTL=no +- ]) +- LIBINTL= +- LTLIBINTL= +- POSUB= +- +- dnl Add a version number to the cache macros. +- case " $gt_needs " in +- *" need-formatstring-macros "*) gt_api_version=3 ;; +- *" need-ngettext "*) gt_api_version=2 ;; +- *) gt_api_version=1 ;; +- esac +- gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" +- gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" +- +- dnl If we use NLS figure out what method +- if test "$USE_NLS" = "yes"; then +- gt_use_preinstalled_gnugettext=no +- m4_if(gt_building_libintl_in_same_build_tree, yes, [ +- AC_MSG_CHECKING([whether included gettext is requested]) +- AC_ARG_WITH([included-gettext], +- [ --with-included-gettext use the GNU gettext library included here], +- nls_cv_force_use_gnu_gettext=$withval, +- nls_cv_force_use_gnu_gettext=no) +- AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext]) +- +- nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" +- if test "$nls_cv_force_use_gnu_gettext" != "yes"; then +- ]) +- dnl User does not insist on using GNU NLS library. Figure out what +- dnl to use. If GNU gettext is available we use this. Else we have +- dnl to fall back to GNU NLS library. +- +- if test $gt_api_version -ge 3; then +- gt_revision_test_code=' +-#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +-#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +-#endif +-changequote(,)dnl +-typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +-changequote([,])dnl +-' +- else +- gt_revision_test_code= +- fi +- if test $gt_api_version -ge 2; then +- gt_expression_test_code=' + * ngettext ("", "", 0)' +- else +- gt_expression_test_code= +- fi +- +- AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], +- [AC_LINK_IFELSE( +- [AC_LANG_PROGRAM( +- [[ +-#include +-#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +-extern int _nl_msg_cat_cntr; +-extern int *_nl_domain_bindings; +-#define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_domain_bindings) +-#else +-#define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 +-#endif +-$gt_revision_test_code +- ]], +- [[ +-bindtextdomain ("", ""); +-return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION +- ]])], +- [eval "$gt_func_gnugettext_libc=yes"], +- [eval "$gt_func_gnugettext_libc=no"])]) +- +- if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then +- dnl Sometimes libintl requires libiconv, so first search for libiconv. +- m4_if(gt_building_libintl_in_same_build_tree, yes, , [ +- AM_ICONV_LINK +- ]) +- dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL +- dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) +- dnl because that would add "-liconv" to LIBINTL and LTLIBINTL +- dnl even if libiconv doesn't exist. +- AC_LIB_LINKFLAGS_BODY([intl]) +- AC_CACHE_CHECK([for GNU gettext in libintl], +- [$gt_func_gnugettext_libintl], +- [gt_saved_CPPFLAGS="$CPPFLAGS" +- CPPFLAGS="$CPPFLAGS $INCINTL" +- gt_saved_LIBS="$LIBS" +- LIBS="$LIBS $LIBINTL" +- dnl Now see whether libintl exists and does not depend on libiconv. +- AC_LINK_IFELSE( +- [AC_LANG_PROGRAM( +- [[ +-#include +-#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +-extern int _nl_msg_cat_cntr; +-extern +-#ifdef __cplusplus +-"C" +-#endif +-const char *_nl_expand_alias (const char *); +-#define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) +-#else +-#define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 +-#endif +-$gt_revision_test_code +- ]], +- [[ +-bindtextdomain ("", ""); +-return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION +- ]])], +- [eval "$gt_func_gnugettext_libintl=yes"], +- [eval "$gt_func_gnugettext_libintl=no"]) +- dnl Now see whether libintl exists and depends on libiconv or other +- dnl OS dependent libraries, specifically on macOS and AIX. +- gt_LIBINTL_EXTRA="$INTL_MACOSX_LIBS" +- AC_REQUIRE([AC_CANONICAL_HOST]) +- case "$host_os" in +- aix*) gt_LIBINTL_EXTRA="-lpthread" ;; +- esac +- if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } \ +- && { test -n "$LIBICONV" || test -n "$gt_LIBINTL_EXTRA"; }; then +- LIBS="$LIBS $LIBICONV $gt_LIBINTL_EXTRA" +- AC_LINK_IFELSE( +- [AC_LANG_PROGRAM( +- [[ +-#include +-#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +-extern int _nl_msg_cat_cntr; +-extern +-#ifdef __cplusplus +-"C" +-#endif +-const char *_nl_expand_alias (const char *); +-#define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) +-#else +-#define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 +-#endif +-$gt_revision_test_code +- ]], +- [[ +-bindtextdomain ("", ""); +-return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION +- ]])], +- [LIBINTL="$LIBINTL $LIBICONV $gt_LIBINTL_EXTRA" +- LTLIBINTL="$LTLIBINTL $LTLIBICONV $gt_LIBINTL_EXTRA" +- eval "$gt_func_gnugettext_libintl=yes" +- ]) +- fi +- CPPFLAGS="$gt_saved_CPPFLAGS" +- LIBS="$gt_saved_LIBS"]) +- fi +- +- dnl If an already present or preinstalled GNU gettext() is found, +- dnl use it. But if this macro is used in GNU gettext, and GNU +- dnl gettext is already preinstalled in libintl, we update this +- dnl libintl. (Cf. the install rule in intl/Makefile.in.) +- if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ +- || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ +- && test "$PACKAGE" != gettext-runtime \ +- && test "$PACKAGE" != gettext-tools \ +- && test "$PACKAGE" != libintl; }; then +- gt_use_preinstalled_gnugettext=yes +- else +- dnl Reset the values set by searching for libintl. +- LIBINTL= +- LTLIBINTL= +- INCINTL= +- fi +- +- m4_if(gt_building_libintl_in_same_build_tree, yes, [ +- if test "$gt_use_preinstalled_gnugettext" != "yes"; then +- dnl GNU gettext is not found in the C library. +- dnl Fall back on included GNU gettext library. +- nls_cv_use_gnu_gettext=yes +- fi +- fi +- +- if test "$nls_cv_use_gnu_gettext" = "yes"; then +- dnl Mark actions used to generate GNU NLS library. +- USE_INCLUDED_LIBINTL=yes +- LIBINTL="m4_if([$3],[],\${top_builddir}/intl,[$3])/libintl.la $LIBICONV $LIBTHREAD" +- LTLIBINTL="m4_if([$3],[],\${top_builddir}/intl,[$3])/libintl.la $LTLIBICONV $LTLIBTHREAD" +- LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` +- fi +- +- CATOBJEXT= +- if test "$gt_use_preinstalled_gnugettext" = "yes" \ +- || test "$nls_cv_use_gnu_gettext" = "yes"; then +- dnl Mark actions to use GNU gettext tools. +- CATOBJEXT=.gmo +- fi +- ]) +- +- if test -n "$INTL_MACOSX_LIBS"; then +- if test "$gt_use_preinstalled_gnugettext" = "yes" \ +- || test "$nls_cv_use_gnu_gettext" = "yes"; then +- dnl Some extra flags are needed during linking. +- LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" +- LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" +- fi +- fi +- +- if test "$gt_use_preinstalled_gnugettext" = "yes" \ +- || test "$nls_cv_use_gnu_gettext" = "yes"; then +- AC_DEFINE([ENABLE_NLS], [1], +- [Define to 1 if translation of program messages to the user's native language +- is requested.]) +- else +- USE_NLS=no +- fi +- fi +- +- AC_MSG_CHECKING([whether to use NLS]) +- AC_MSG_RESULT([$USE_NLS]) +- if test "$USE_NLS" = "yes"; then +- AC_MSG_CHECKING([where the gettext function comes from]) +- if test "$gt_use_preinstalled_gnugettext" = "yes"; then +- if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then +- gt_source="external libintl" +- else +- gt_source="libc" +- fi +- else +- gt_source="included intl directory" +- fi +- AC_MSG_RESULT([$gt_source]) +- fi +- +- if test "$USE_NLS" = "yes"; then +- +- if test "$gt_use_preinstalled_gnugettext" = "yes"; then +- if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then +- AC_MSG_CHECKING([how to link with libintl]) +- AC_MSG_RESULT([$LIBINTL]) +- AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) +- fi +- +- dnl For backward compatibility. Some packages may be using this. +- AC_DEFINE([HAVE_GETTEXT], [1], +- [Define if the GNU gettext() function is already present or preinstalled.]) +- AC_DEFINE([HAVE_DCGETTEXT], [1], +- [Define if the GNU dcgettext() function is already present or preinstalled.]) +- fi +- +- dnl We need to process the po/ directory. +- POSUB=po +- fi +- +- m4_if(gt_building_libintl_in_same_build_tree, yes, [ +- dnl Make all variables we use known to autoconf. +- AC_SUBST([USE_INCLUDED_LIBINTL]) +- AC_SUBST([CATOBJEXT]) +- ]) +- +- m4_if(gt_building_libintl_in_same_build_tree, yes, [], [ +- dnl For backward compatibility. Some Makefiles may be using this. +- INTLLIBS="$LIBINTL" +- AC_SUBST([INTLLIBS]) +- ]) +- +- dnl Make all documented variables known to autoconf. +- AC_SUBST([LIBINTL]) +- AC_SUBST([LTLIBINTL]) +- AC_SUBST([POSUB]) +- +- dnl Define localedir_c and localedir_c_make. +- gl_BUILD_TO_HOST_LOCALEDIR +-]) +- +- +-dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. +-m4_define([gt_NEEDS_INIT], +-[ +- m4_divert_text([DEFAULTS], [gt_needs=]) +- m4_define([gt_NEEDS_INIT], []) +-]) +- +- +-dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) +-AC_DEFUN([AM_GNU_GETTEXT_NEED], +-[ +- m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) +-]) +- +- +-dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) +-AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) +- +- +-dnl Usage: AM_GNU_GETTEXT_REQUIRE_VERSION([gettext-version]) +-AC_DEFUN([AM_GNU_GETTEXT_REQUIRE_VERSION], []) +diff --git a/m4/guestfs-libraries.m4 b/m4/guestfs-libraries.m4 +index c4237438..11c9974c 100644 +--- a/m4/guestfs-libraries.m4 ++++ b/m4/guestfs-libraries.m4 +@@ -78,7 +78,15 @@ AM_CONDITIONAL([HAVE_GNU_GETTEXT], + [test "x$XGETTEXT" != "xno" && test "x$MSGCAT" != "xno" && test "x$MSGFMT" != "xno" && test "x$MSGMERGE" != "xno" && test "x$msgfmt_is_gnu" != "xno"]) + + dnl Check for gettext. +-AM_GNU_GETTEXT([external]) ++AC_CHECK_HEADERS([libintl.h]) ++AC_SEARCH_LIBS([dgettext], [intl], [ ++if test "$ac_cv_search_dgettext" != "none required"; then ++ LIBINTL="$ac_cv_search_dgettext" ++ LTLIBINTL="$ac_cv_search_dgettext" ++fi ++]) ++AC_SUBST([LIBINTL]) ++AC_SUBST([LTLIBINTL]) + + dnl Check for PCRE2 (required) + PKG_CHECK_MODULES([PCRE2], [libpcre2-8], [], [ +diff --git a/m4/host-cpu-c-abi.m4 b/m4/host-cpu-c-abi.m4 +deleted file mode 100644 +index 6ca7721a..00000000 +--- a/m4/host-cpu-c-abi.m4 ++++ /dev/null +@@ -1,532 +0,0 @@ +-# host-cpu-c-abi.m4 +-# serial 20 +-dnl Copyright (C) 2002-2025 Free Software Foundation, Inc. +-dnl This file is free software; the Free Software Foundation +-dnl gives unlimited permission to copy and/or distribute it, +-dnl with or without modifications, as long as this notice is preserved. +-dnl This file is offered as-is, without any warranty. +- +-dnl From Bruno Haible and Sam Steingold. +- +-dnl Sets the HOST_CPU variable to the canonical name of the CPU. +-dnl Sets the HOST_CPU_C_ABI variable to the canonical name of the CPU with its +-dnl C language ABI (application binary interface). +-dnl Also defines __${HOST_CPU}__ and __${HOST_CPU_C_ABI}__ as C macros in +-dnl config.h. +-dnl +-dnl This canonical name can be used to select a particular assembly language +-dnl source file that will interoperate with C code on the given host. +-dnl +-dnl For example: +-dnl * 'i386' and 'sparc' are different canonical names, because code for i386 +-dnl will not run on SPARC CPUs and vice versa. They have different +-dnl instruction sets. +-dnl * 'sparc' and 'sparc64' are different canonical names, because code for +-dnl 'sparc' and code for 'sparc64' cannot be linked together: 'sparc' code +-dnl contains 32-bit instructions, whereas 'sparc64' code contains 64-bit +-dnl instructions. A process on a SPARC CPU can be in 32-bit mode or in 64-bit +-dnl mode, but not both. +-dnl * 'mips' and 'mipsn32' are different canonical names, because they use +-dnl different argument passing and return conventions for C functions, and +-dnl although the instruction set of 'mips' is a large subset of the +-dnl instruction set of 'mipsn32'. +-dnl * 'mipsn32' and 'mips64' are different canonical names, because they use +-dnl different sizes for the C types like 'int' and 'void *', and although +-dnl the instruction sets of 'mipsn32' and 'mips64' are the same. +-dnl * The same canonical name is used for different endiannesses. You can +-dnl determine the endianness through preprocessor symbols: +-dnl - 'arm': test __ARMEL__. +-dnl - 'mips', 'mipsn32', 'mips64': test _MIPSEB vs. _MIPSEL. +-dnl - 'powerpc64': test __BIG_ENDIAN__ vs. __LITTLE_ENDIAN__. +-dnl * The same name 'i386' is used for CPUs of type i386, i486, i586 +-dnl (Pentium), AMD K7, Pentium II, Pentium IV, etc., because +-dnl - Instructions that do not exist on all of these CPUs (cmpxchg, +-dnl MMX, SSE, SSE2, 3DNow! etc.) are not frequently used. If your +-dnl assembly language source files use such instructions, you will +-dnl need to make the distinction. +-dnl - Speed of execution of the common instruction set is reasonable across +-dnl the entire family of CPUs. If you have assembly language source files +-dnl that are optimized for particular CPU types (like GNU gmp has), you +-dnl will need to make the distinction. +-dnl See . +-AC_DEFUN([gl_HOST_CPU_C_ABI], +-[ +- AC_REQUIRE([AC_CANONICAL_HOST]) +- AC_REQUIRE([gl_C_ASM]) +- AC_CACHE_CHECK([host CPU and C ABI], [gl_cv_host_cpu_c_abi], +- [case "$host_cpu" in +- +-changequote(,)dnl +- i[34567]86 ) +-changequote([,])dnl +- gl_cv_host_cpu_c_abi=i386 +- ;; +- +- x86_64 ) +- # On x86_64 systems, the C compiler may be generating code in one of +- # these ABIs: +- # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64. +- # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64 +- # with native Windows (mingw, MSVC). +- # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32. +- # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386. +- AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#if (defined __x86_64__ || defined __amd64__ \ +- || defined _M_X64 || defined _M_AMD64) +- int ok; +- #else +- error fail +- #endif +- ]])], +- [AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#if defined __ILP32__ || defined _ILP32 +- int ok; +- #else +- error fail +- #endif +- ]])], +- [gl_cv_host_cpu_c_abi=x86_64-x32], +- [gl_cv_host_cpu_c_abi=x86_64])], +- [gl_cv_host_cpu_c_abi=i386]) +- ;; +- +-changequote(,)dnl +- alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] ) +-changequote([,])dnl +- gl_cv_host_cpu_c_abi=alpha +- ;; +- +- arm* | aarch64 ) +- # Assume arm with EABI. +- # On arm64 systems, the C compiler may be generating code in one of +- # these ABIs: +- # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64. +- # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32. +- # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf. +- AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#ifdef __aarch64__ +- int ok; +- #else +- error fail +- #endif +- ]])], +- [AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#if defined __ILP32__ || defined _ILP32 +- int ok; +- #else +- error fail +- #endif +- ]])], +- [gl_cv_host_cpu_c_abi=arm64-ilp32], +- [gl_cv_host_cpu_c_abi=arm64])], +- [# Don't distinguish little-endian and big-endian arm, since they +- # don't require different machine code for simple operations and +- # since the user can distinguish them through the preprocessor +- # defines __ARMEL__ vs. __ARMEB__. +- # But distinguish arm which passes floating-point arguments and +- # return values in integer registers (r0, r1, ...) - this is +- # gcc -mfloat-abi=soft or gcc -mfloat-abi=softfp - from arm which +- # passes them in float registers (s0, s1, ...) and double registers +- # (d0, d1, ...) - this is gcc -mfloat-abi=hard. GCC 4.6 or newer +- # sets the preprocessor defines __ARM_PCS (for the first case) and +- # __ARM_PCS_VFP (for the second case), but older GCC does not. +- echo 'double ddd; void func (double dd) { ddd = dd; }' > conftest.c +- # Look for a reference to the register d0 in the .s file. +- AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c) >/dev/null 2>&1 +- if LC_ALL=C grep 'd0,' conftest.$gl_asmext >/dev/null; then +- gl_cv_host_cpu_c_abi=armhf +- else +- gl_cv_host_cpu_c_abi=arm +- fi +- rm -fr conftest* +- ]) +- ;; +- +- hppa1.0 | hppa1.1 | hppa2.0* | hppa64 ) +- # On hppa, the C compiler may be generating 32-bit code or 64-bit +- # code. In the latter case, it defines _LP64 and __LP64__. +- AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#ifdef __LP64__ +- int ok; +- #else +- error fail +- #endif +- ]])], +- [gl_cv_host_cpu_c_abi=hppa64], +- [gl_cv_host_cpu_c_abi=hppa]) +- ;; +- +- ia64* ) +- # On ia64 on HP-UX, the C compiler may be generating 64-bit code or +- # 32-bit code. In the latter case, it defines _ILP32. +- AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#ifdef _ILP32 +- int ok; +- #else +- error fail +- #endif +- ]])], +- [gl_cv_host_cpu_c_abi=ia64-ilp32], +- [gl_cv_host_cpu_c_abi=ia64]) +- ;; +- +- mips* ) +- # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this +- # at 32. +- AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64) +- int ok; +- #else +- error fail +- #endif +- ]])], +- [gl_cv_host_cpu_c_abi=mips64], +- [# In the n32 ABI, _ABIN32 is defined, _ABIO32 is not defined (but +- # may later get defined by ), and _MIPS_SIM == _ABIN32. +- # In the 32 ABI, _ABIO32 is defined, _ABIN32 is not defined (but +- # may later get defined by ), and _MIPS_SIM == _ABIO32. +- AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#if (_MIPS_SIM == _ABIN32) +- int ok; +- #else +- error fail +- #endif +- ]])], +- [gl_cv_host_cpu_c_abi=mipsn32], +- [gl_cv_host_cpu_c_abi=mips])]) +- ;; +- +- powerpc* ) +- # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD. +- # No need to distinguish them here; the caller may distinguish +- # them based on the OS. +- # On powerpc64 systems, the C compiler may still be generating +- # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may +- # be generating 64-bit code. +- AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#if defined __powerpc64__ || defined __LP64__ +- int ok; +- #else +- error fail +- #endif +- ]])], +- [# On powerpc64, there are two ABIs on Linux: The AIX compatible +- # one and the ELFv2 one. The latter defines _CALL_ELF=2. +- AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#if defined _CALL_ELF && _CALL_ELF == 2 +- int ok; +- #else +- error fail +- #endif +- ]])], +- [gl_cv_host_cpu_c_abi=powerpc64-elfv2], +- [gl_cv_host_cpu_c_abi=powerpc64]) +- ], +- [gl_cv_host_cpu_c_abi=powerpc]) +- ;; +- +- rs6000 ) +- gl_cv_host_cpu_c_abi=powerpc +- ;; +- +- riscv32 | riscv64 ) +- # There are 2 architectures (with variants): rv32* and rv64*. +- AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#if __riscv_xlen == 64 +- int ok; +- #else +- error fail +- #endif +- ]])], +- [cpu=riscv64], +- [cpu=riscv32]) +- # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d. +- # Size of 'long' and 'void *': +- AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#if defined __LP64__ +- int ok; +- #else +- error fail +- #endif +- ]])], +- [main_abi=lp64], +- [main_abi=ilp32]) +- # Float ABIs: +- # __riscv_float_abi_double: +- # 'float' and 'double' are passed in floating-point registers. +- # __riscv_float_abi_single: +- # 'float' are passed in floating-point registers. +- # __riscv_float_abi_soft: +- # No values are passed in floating-point registers. +- AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#if defined __riscv_float_abi_double +- int ok; +- #else +- error fail +- #endif +- ]])], +- [float_abi=d], +- [AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#if defined __riscv_float_abi_single +- int ok; +- #else +- error fail +- #endif +- ]])], +- [float_abi=f], +- [float_abi='']) +- ]) +- gl_cv_host_cpu_c_abi="${cpu}-${main_abi}${float_abi}" +- ;; +- +- s390* ) +- # On s390x, the C compiler may be generating 64-bit (= s390x) code +- # or 31-bit (= s390) code. +- AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#if defined __LP64__ || defined __s390x__ +- int ok; +- #else +- error fail +- #endif +- ]])], +- [gl_cv_host_cpu_c_abi=s390x], +- [gl_cv_host_cpu_c_abi=s390]) +- ;; +- +- sparc | sparc64 ) +- # UltraSPARCs running Linux have `uname -m` = "sparc64", but the +- # C compiler still generates 32-bit code. +- AC_COMPILE_IFELSE( +- [AC_LANG_SOURCE( +- [[#if defined __sparcv9 || defined __arch64__ +- int ok; +- #else +- error fail +- #endif +- ]])], +- [gl_cv_host_cpu_c_abi=sparc64], +- [gl_cv_host_cpu_c_abi=sparc]) +- ;; +- +- *) +- gl_cv_host_cpu_c_abi="$host_cpu" +- ;; +- esac +- ]) +- +- dnl In most cases, $HOST_CPU and $HOST_CPU_C_ABI are the same. +- HOST_CPU=`echo "$gl_cv_host_cpu_c_abi" | sed -e 's/-.*//'` +- HOST_CPU_C_ABI="$gl_cv_host_cpu_c_abi" +- AC_SUBST([HOST_CPU]) +- AC_SUBST([HOST_CPU_C_ABI]) +- +- # This was +- # AC_DEFINE_UNQUOTED([__${HOST_CPU}__]) +- # AC_DEFINE_UNQUOTED([__${HOST_CPU_C_ABI}__]) +- # earlier, but KAI C++ 3.2d doesn't like this. +- sed -e 's/-/_/g' >> confdefs.h <. +-dnl Don't make changes that are incompatible with that documentation! +- +-AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +-[ +- dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. +- AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) +- AC_REQUIRE([AC_LIB_RPATH]) +- +- dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV +- dnl accordingly. +- AC_LIB_LINKFLAGS_BODY([iconv]) +-]) +- +-AC_DEFUN([AM_ICONV_LINK], +-[ +- dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and +- dnl those with the standalone portable GNU libiconv installed). +- AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles +- +- dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV +- dnl accordingly. +- AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) +- +- dnl Add $INCICONV to CPPFLAGS before performing the following checks, +- dnl because if the user has installed libiconv and not disabled its use +- dnl via --without-libiconv-prefix, he wants to use it. The first +- dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed. +- gl_saved_CPPFLAGS="$CPPFLAGS" +- AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) +- +- AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [ +- am_cv_func_iconv="no, consider installing GNU libiconv" +- am_cv_lib_iconv=no +- AC_LINK_IFELSE( +- [AC_LANG_PROGRAM( +- [[ +-#include +-#include +- ]], +- [[iconv_t cd = iconv_open("",""); +- iconv(cd,NULL,NULL,NULL,NULL); +- iconv_close(cd);]])], +- [am_cv_func_iconv=yes]) +- if test "$am_cv_func_iconv" != yes; then +- gl_saved_LIBS="$LIBS" +- LIBS="$LIBS $LIBICONV" +- AC_LINK_IFELSE( +- [AC_LANG_PROGRAM( +- [[ +-#include +-#include +- ]], +- [[iconv_t cd = iconv_open("",""); +- iconv(cd,NULL,NULL,NULL,NULL); +- iconv_close(cd);]])], +- [am_cv_lib_iconv=yes] +- [am_cv_func_iconv=yes]) +- LIBS="$gl_saved_LIBS" +- fi +- ]) +- if test "$am_cv_func_iconv" = yes; then +- AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ +- dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11, +- dnl Solaris 10, macOS 14.4. +- gl_saved_LIBS="$LIBS" +- if test $am_cv_lib_iconv = yes; then +- LIBS="$LIBS $LIBICONV" +- fi +- am_cv_func_iconv_works=no +- for ac_iconv_const in '' 'const'; do +- AC_RUN_IFELSE( +- [AC_LANG_PROGRAM( +- [[ +-#include +-#include +- +-#ifndef ICONV_CONST +-# define ICONV_CONST $ac_iconv_const +-#endif +- ]], +- [[int result = 0; +- /* Test against AIX 5.1...7.2 bug: Failures are not distinguishable from +- successful returns. This is even documented in +- */ +- { +- iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); +- if (cd_utf8_to_88591 != (iconv_t)(-1)) +- { +- static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */ +- char buf[10]; +- ICONV_CONST char *inptr = input; +- size_t inbytesleft = strlen (input); +- char *outptr = buf; +- size_t outbytesleft = sizeof (buf); +- size_t res = iconv (cd_utf8_to_88591, +- &inptr, &inbytesleft, +- &outptr, &outbytesleft); +- if (res == 0) +- result |= 1; +- iconv_close (cd_utf8_to_88591); +- } +- } +- /* Test against macOS 14.4 bug: Failures are not distinguishable from +- successful returns. +- POSIX:2018 says: "The iconv() function shall ... return the number of +- non-identical conversions performed." +- But here, the conversion always does transliteration (the suffixes +- "//TRANSLIT" and "//IGNORE" have no effect, nor does iconvctl()) and +- does not report when it does a non-identical conversion. */ +- { +- iconv_t cd_utf8_to_88591 = iconv_open ("ISO-8859-1", "UTF-8"); +- if (cd_utf8_to_88591 != (iconv_t)(-1)) +- { +- static ICONV_CONST char input[] = "\305\202"; /* LATIN SMALL LETTER L WITH STROKE */ +- char buf[10]; +- ICONV_CONST char *inptr = input; +- size_t inbytesleft = strlen (input); +- char *outptr = buf; +- size_t outbytesleft = sizeof (buf); +- size_t res = iconv (cd_utf8_to_88591, +- &inptr, &inbytesleft, +- &outptr, &outbytesleft); +- /* Here: +- With glibc, GNU libiconv (including macOS up to 13): res == (size_t)-1, errno == EILSEQ. +- With musl libc, NetBSD 10, Solaris 11: res == 1. +- With macOS 14.4: res == 0, output is "l". */ +- if (res == 0) +- result |= 2; +- iconv_close (cd_utf8_to_88591); +- } +- } +- /* Test against Solaris 10 bug: Failures are not distinguishable from +- successful returns. */ +- { +- iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); +- if (cd_ascii_to_88591 != (iconv_t)(-1)) +- { +- static ICONV_CONST char input[] = "\263"; +- char buf[10]; +- ICONV_CONST char *inptr = input; +- size_t inbytesleft = strlen (input); +- char *outptr = buf; +- size_t outbytesleft = sizeof (buf); +- size_t res = iconv (cd_ascii_to_88591, +- &inptr, &inbytesleft, +- &outptr, &outbytesleft); +- if (res == 0) +- result |= 4; +- iconv_close (cd_ascii_to_88591); +- } +- } +- /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ +- { +- iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); +- if (cd_88591_to_utf8 != (iconv_t)(-1)) +- { +- static ICONV_CONST char input[] = "\304"; +- static char buf[2] = { (char)0xDE, (char)0xAD }; +- ICONV_CONST char *inptr = input; +- size_t inbytesleft = 1; +- char *outptr = buf; +- size_t outbytesleft = 1; +- size_t res = iconv (cd_88591_to_utf8, +- &inptr, &inbytesleft, +- &outptr, &outbytesleft); +- if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) +- result |= 8; +- iconv_close (cd_88591_to_utf8); +- } +- } +-#if 0 /* This bug could be worked around by the caller. */ +- /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ +- { +- iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); +- if (cd_88591_to_utf8 != (iconv_t)(-1)) +- { +- static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; +- char buf[50]; +- ICONV_CONST char *inptr = input; +- size_t inbytesleft = strlen (input); +- char *outptr = buf; +- size_t outbytesleft = sizeof (buf); +- size_t res = iconv (cd_88591_to_utf8, +- &inptr, &inbytesleft, +- &outptr, &outbytesleft); +- if ((int)res > 0) +- result |= 16; +- iconv_close (cd_88591_to_utf8); +- } +- } +-#endif +- /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is +- provided. */ +- { +- /* Try standardized names. */ +- iconv_t cd1 = iconv_open ("UTF-8", "EUC-JP"); +- /* Try IRIX, OSF/1 names. */ +- iconv_t cd2 = iconv_open ("UTF-8", "eucJP"); +- /* Try AIX names. */ +- iconv_t cd3 = iconv_open ("UTF-8", "IBM-eucJP"); +- /* Try HP-UX names. */ +- iconv_t cd4 = iconv_open ("utf8", "eucJP"); +- if (cd1 == (iconv_t)(-1) && cd2 == (iconv_t)(-1) +- && cd3 == (iconv_t)(-1) && cd4 == (iconv_t)(-1)) +- result |= 32; +- if (cd1 != (iconv_t)(-1)) +- iconv_close (cd1); +- if (cd2 != (iconv_t)(-1)) +- iconv_close (cd2); +- if (cd3 != (iconv_t)(-1)) +- iconv_close (cd3); +- if (cd4 != (iconv_t)(-1)) +- iconv_close (cd4); +- } +- return result; +-]])], +- [am_cv_func_iconv_works=yes], , +- [case "$host_os" in +- aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; +- *) am_cv_func_iconv_works="guessing yes" ;; +- esac]) +- test "$am_cv_func_iconv_works" = no || break +- done +- LIBS="$gl_saved_LIBS" +- ]) +- case "$am_cv_func_iconv_works" in +- *no) am_func_iconv=no am_cv_lib_iconv=no ;; +- *) am_func_iconv=yes ;; +- esac +- else +- am_func_iconv=no am_cv_lib_iconv=no +- fi +- if test "$am_func_iconv" = yes; then +- AC_DEFINE([HAVE_ICONV], [1], +- [Define if you have the iconv() function and it works.]) +- fi +- if test "$am_cv_lib_iconv" = yes; then +- AC_MSG_CHECKING([how to link with libiconv]) +- AC_MSG_RESULT([$LIBICONV]) +- else +- dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV +- dnl either. +- CPPFLAGS="$gl_saved_CPPFLAGS" +- LIBICONV= +- LTLIBICONV= +- fi +- AC_SUBST([LIBICONV]) +- AC_SUBST([LTLIBICONV]) +-]) +- +-dnl Define AM_ICONV using AC_DEFUN_ONCE, in order to avoid warnings like +-dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required". +-AC_DEFUN_ONCE([AM_ICONV], +-[ +- AM_ICONV_LINK +- if test "$am_cv_func_iconv" = yes; then +- AC_CACHE_CHECK([whether iconv is compatible with its POSIX signature], +- [gl_cv_iconv_nonconst], +- [AC_COMPILE_IFELSE( +- [AC_LANG_PROGRAM( +- [[ +-#include +-#include +-extern +-#ifdef __cplusplus +-"C" +-#endif +-size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +- ]], +- [[]])], +- [gl_cv_iconv_nonconst=yes], +- [gl_cv_iconv_nonconst=no]) +- ]) +- else +- dnl When compiling GNU libiconv on a system that does not have iconv yet, +- dnl pick the POSIX compliant declaration without 'const'. +- gl_cv_iconv_nonconst=yes +- fi +- if test $gl_cv_iconv_nonconst = yes; then +- iconv_arg1="" +- else +- iconv_arg1="const" +- fi +- AC_DEFINE_UNQUOTED([ICONV_CONST], [$iconv_arg1], +- [Define as const if the declaration of iconv() needs const.]) +- dnl Also substitute ICONV_CONST in the gnulib generated . +- m4_ifdef([gl_ICONV_H_DEFAULTS], +- [AC_REQUIRE([gl_ICONV_H_DEFAULTS]) +- if test $gl_cv_iconv_nonconst != yes; then +- ICONV_CONST="const" +- fi +- ]) +- +- dnl A summary result, for those packages which want to print a summary at the +- dnl end of the configuration. +- if test "$am_func_iconv" = yes; then +- if test -n "$LIBICONV"; then +- am_cv_func_iconv_summary='yes, in libiconv' +- else +- am_cv_func_iconv_summary='yes, in libc' +- fi +- else +- if test "$am_cv_func_iconv" = yes; then +- am_cv_func_iconv_summary='not working, consider installing GNU libiconv' +- else +- am_cv_func_iconv_summary='no, consider installing GNU libiconv' +- fi +- fi +-]) +diff --git a/m4/intlmacosx.m4 b/m4/intlmacosx.m4 +deleted file mode 100644 +index f0920d0f..00000000 +--- a/m4/intlmacosx.m4 ++++ /dev/null +@@ -1,71 +0,0 @@ +-# intlmacosx.m4 +-# serial 10 (gettext-0.23) +-dnl Copyright (C) 2004-2014, 2016, 2019-2025 Free Software Foundation, Inc. +-dnl This file is free software; the Free Software Foundation +-dnl gives unlimited permission to copy and/or distribute it, +-dnl with or without modifications, as long as this notice is preserved. +-dnl This file is offered as-is, without any warranty. +-dnl +-dnl This file can be used in projects which are not available under +-dnl the GNU General Public License or the GNU Lesser General Public +-dnl License but which still want to provide support for the GNU gettext +-dnl functionality. +-dnl Please note that the actual code of the GNU gettext library is covered +-dnl by the GNU Lesser General Public License, and the rest of the GNU +-dnl gettext package is covered by the GNU General Public License. +-dnl They are *not* in the public domain. +- +-dnl Checks for special options needed on Mac OS X. +-dnl Defines INTL_MACOSX_LIBS. +-AC_DEFUN([gt_INTL_MACOSX], +-[ +- dnl Check for API introduced in Mac OS X 10.4. +- AC_CACHE_CHECK([for CFPreferencesCopyAppValue], +- [gt_cv_func_CFPreferencesCopyAppValue], +- [gt_saved_LIBS="$LIBS" +- LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" +- AC_LINK_IFELSE( +- [AC_LANG_PROGRAM( +- [[#include ]], +- [[CFPreferencesCopyAppValue(NULL, NULL)]])], +- [gt_cv_func_CFPreferencesCopyAppValue=yes], +- [gt_cv_func_CFPreferencesCopyAppValue=no]) +- LIBS="$gt_saved_LIBS"]) +- if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then +- AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], +- [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) +- fi +- dnl Don't check for the API introduced in Mac OS X 10.5, CFLocaleCopyCurrent, +- dnl because in macOS 10.13.4 it has the following behaviour: +- dnl When two or more languages are specified in the +- dnl "System Preferences > Language & Region > Preferred Languages" panel, +- dnl it returns en_CC where CC is the territory (even when English is not among +- dnl the preferred languages!). What we want instead is what +- dnl CFLocaleCopyCurrent returned in earlier macOS releases and what +- dnl CFPreferencesCopyAppValue still returns, namely ll_CC where ll is the +- dnl first among the preferred languages and CC is the territory. +- AC_CACHE_CHECK([for CFLocaleCopyPreferredLanguages], [gt_cv_func_CFLocaleCopyPreferredLanguages], +- [gt_saved_LIBS="$LIBS" +- LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" +- AC_LINK_IFELSE( +- [AC_LANG_PROGRAM( +- [[#include ]], +- [[CFLocaleCopyPreferredLanguages();]])], +- [gt_cv_func_CFLocaleCopyPreferredLanguages=yes], +- [gt_cv_func_CFLocaleCopyPreferredLanguages=no]) +- LIBS="$gt_saved_LIBS"]) +- if test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then +- AC_DEFINE([HAVE_CFLOCALECOPYPREFERREDLANGUAGES], [1], +- [Define to 1 if you have the Mac OS X function CFLocaleCopyPreferredLanguages in the CoreFoundation framework.]) +- fi +- INTL_MACOSX_LIBS= +- if test $gt_cv_func_CFPreferencesCopyAppValue = yes \ +- || test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then +- dnl Starting with macOS version 14, CoreFoundation relies on CoreServices, +- dnl and we have to link it in explicitly, otherwise an exception +- dnl NSInvalidArgumentException "unrecognized selector sent to instance" +- dnl occurs. +- INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation -Wl,-framework -Wl,CoreServices" +- fi +- AC_SUBST([INTL_MACOSX_LIBS]) +-]) +diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4 +deleted file mode 100644 +index 3714b9ce..00000000 +--- a/m4/lib-ld.m4 ++++ /dev/null +@@ -1,170 +0,0 @@ +-# lib-ld.m4 +-# serial 13 +-dnl Copyright (C) 1996-2003, 2009-2025 Free Software Foundation, Inc. +-dnl This file is free software; the Free Software Foundation +-dnl gives unlimited permission to copy and/or distribute it, +-dnl with or without modifications, as long as this notice is preserved. +-dnl This file is offered as-is, without any warranty. +- +-dnl Subroutines of libtool.m4, +-dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid +-dnl collision with libtool.m4. +- +-dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no. +-AC_DEFUN([AC_LIB_PROG_LD_GNU], +-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld], +-[# I'd rather use --version here, but apparently some GNU lds only accept -v. +-case `$LD -v 2>&1 /dev/null 2>&1 \ +- && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ +- || PATH_SEPARATOR=';' +- } +-fi +- +-if test -n "$LD"; then +- AC_MSG_CHECKING([for ld]) +-elif test "$GCC" = yes; then +- AC_MSG_CHECKING([for ld used by $CC]) +-elif test "$with_gnu_ld" = yes; then +- AC_MSG_CHECKING([for GNU ld]) +-else +- AC_MSG_CHECKING([for non-GNU ld]) +-fi +-if test -n "$LD"; then +- # Let the user override the test with a path. +- : +-else +- AC_CACHE_VAL([acl_cv_path_LD], +- [ +- acl_cv_path_LD= # Final result of this test +- ac_prog=ld # Program to search in $PATH +- if test "$GCC" = yes; then +- # Check if gcc -print-prog-name=ld gives a path. +- case $host in +- *-*-mingw* | windows*) +- # gcc leaves a trailing carriage return which upsets mingw +- acl_output=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; +- *) +- acl_output=`($CC -print-prog-name=ld) 2>&5` ;; +- esac +- case $acl_output in +- # Accept absolute paths. +- [[\\/]]* | ?:[[\\/]]*) +- re_direlt='/[[^/]][[^/]]*/\.\./' +- # Canonicalize the pathname of ld +- acl_output=`echo "$acl_output" | sed 's%\\\\%/%g'` +- while echo "$acl_output" | grep "$re_direlt" > /dev/null 2>&1; do +- acl_output=`echo $acl_output | sed "s%$re_direlt%/%"` +- done +- # Got the pathname. No search in PATH is needed. +- acl_cv_path_LD="$acl_output" +- ac_prog= +- ;; +- "") +- # If it fails, then pretend we aren't using GCC. +- ;; +- *) +- # If it is relative, then search for the first ld in PATH. +- with_gnu_ld=unknown +- ;; +- esac +- fi +- if test -n "$ac_prog"; then +- # Search for $ac_prog in $PATH. +- acl_saved_IFS="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH; do +- IFS="$acl_saved_IFS" +- test -z "$ac_dir" && ac_dir=. +- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then +- acl_cv_path_LD="$ac_dir/$ac_prog" +- # Check to see if the program is GNU ld. I'd rather use --version, +- # but apparently some variants of GNU ld only accept -v. +- # Break only if it was the GNU/non-GNU ld that we prefer. +- case `"$acl_cv_path_LD" -v 2>&1 conftest.sh +- . ./conftest.sh +- rm -f ./conftest.sh +- acl_cv_rpath=done +- ]) +- wl="$acl_cv_wl" +- acl_libext="$acl_cv_libext" +- acl_shlibext="$acl_cv_shlibext" +- acl_libname_spec="$acl_cv_libname_spec" +- acl_library_names_spec="$acl_cv_library_names_spec" +- acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" +- acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" +- acl_hardcode_direct="$acl_cv_hardcode_direct" +- acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" +- dnl Determine whether the user wants rpath handling at all. +- AC_ARG_ENABLE([rpath], +- [ --disable-rpath do not hardcode runtime library paths], +- :, enable_rpath=yes) +-]) +- +-dnl AC_LIB_FROMPACKAGE(name, package) +-dnl declares that libname comes from the given package. The configure file +-dnl will then not have a --with-libname-prefix option but a +-dnl --with-package-prefix option. Several libraries can come from the same +-dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar +-dnl macro call that searches for libname. +-AC_DEFUN([AC_LIB_FROMPACKAGE], +-[ +- pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], +- [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) +- define([acl_frompackage_]NAME, [$2]) +- popdef([NAME]) +- pushdef([PACK],[$2]) +- pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], +- [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) +- define([acl_libsinpackage_]PACKUP, +- m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[[, ]]],)[lib$1]) +- popdef([PACKUP]) +- popdef([PACK]) +-]) +- +-dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +-dnl the libraries corresponding to explicit and implicit dependencies. +-dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +-dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found +-dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +-AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +-[ +- AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) +- pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], +- [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) +- pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) +- pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], +- [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) +- pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) +- dnl By default, look in $includedir and $libdir. +- use_additional=yes +- AC_LIB_WITH_FINAL_PREFIX([ +- eval additional_includedir=\"$includedir\" +- eval additional_libdir=\"$libdir\" +- eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\" +- eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\" +- ]) +- AC_ARG_WITH(PACK[-prefix], +-[[ --with-]]PACK[[-prefix[=DIR] search for ]]PACKLIBS[[ in DIR/include and DIR/lib +- --without-]]PACK[[-prefix don't search for ]]PACKLIBS[[ in includedir and libdir]], +-[ +- if test "X$withval" = "Xno"; then +- use_additional=no +- else +- if test "X$withval" = "X"; then +- AC_LIB_WITH_FINAL_PREFIX([ +- eval additional_includedir=\"$includedir\" +- eval additional_libdir=\"$libdir\" +- eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\" +- eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\" +- ]) +- else +- additional_includedir="$withval/include" +- additional_libdir="$withval/$acl_libdirstem" +- additional_libdir2="$withval/$acl_libdirstem2" +- additional_libdir3="$withval/$acl_libdirstem3" +- fi +- fi +-]) +- if test "X$additional_libdir2" = "X$additional_libdir"; then +- additional_libdir2= +- fi +- if test "X$additional_libdir3" = "X$additional_libdir"; then +- additional_libdir3= +- fi +- dnl Search the library and its dependencies in $additional_libdir and +- dnl $LDFLAGS. Use breadth-first search. +- LIB[]NAME= +- LTLIB[]NAME= +- INC[]NAME= +- LIB[]NAME[]_PREFIX= +- dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been +- dnl computed. So it has to be reset here. +- HAVE_LIB[]NAME= +- rpathdirs= +- ltrpathdirs= +- names_already_handled= +- names_next_round='$1 $2' +- while test -n "$names_next_round"; do +- names_this_round="$names_next_round" +- names_next_round= +- for name in $names_this_round; do +- already_handled= +- for n in $names_already_handled; do +- if test "$n" = "$name"; then +- already_handled=yes +- break +- fi +- done +- if test -z "$already_handled"; then +- names_already_handled="$names_already_handled $name" +- dnl See if it was already located by an earlier AC_LIB_LINKFLAGS +- dnl or AC_LIB_HAVE_LINKFLAGS call. +- uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` +- eval value=\"\$HAVE_LIB$uppername\" +- if test -n "$value"; then +- if test "$value" = yes; then +- eval value=\"\$LIB$uppername\" +- test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" +- eval value=\"\$LTLIB$uppername\" +- test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" +- else +- dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined +- dnl that this library doesn't exist. So just drop it. +- : +- fi +- else +- dnl Search the library lib$name in $additional_libdir and $LDFLAGS +- dnl and the already constructed $LIBNAME/$LTLIBNAME. +- found_dir= +- found_la= +- found_so= +- found_a= +- eval libname=\"$acl_libname_spec\" # typically: libname=lib$name +- if test -n "$acl_shlibext"; then +- shrext=".$acl_shlibext" # typically: shrext=.so +- else +- shrext= +- fi +- if test $use_additional = yes; then +- for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do +- if test "X$found_dir" = "X"; then +- eval dir=\$$additional_libdir_variable +- if test -n "$dir"; then +- dnl The same code as in the loop below: +- dnl First look for a shared library. +- if test -n "$acl_shlibext"; then +- if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then +- found_dir="$dir" +- found_so="$dir/$libname$shrext" +- else +- if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then +- ver=`(cd "$dir" && \ +- for f in "$libname$shrext".*; do echo "$f"; done \ +- | sed -e "s,^$libname$shrext\\\\.,," \ +- | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ +- | sed 1q ) 2>/dev/null` +- if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then +- found_dir="$dir" +- found_so="$dir/$libname$shrext.$ver" +- fi +- else +- eval library_names=\"$acl_library_names_spec\" +- for f in $library_names; do +- if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then +- found_dir="$dir" +- found_so="$dir/$f" +- break +- fi +- done +- fi +- fi +- fi +- dnl Then look for a static library. +- if test "X$found_dir" = "X"; then +- if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then +- found_dir="$dir" +- found_a="$dir/$libname.$acl_libext" +- fi +- fi +- if test "X$found_dir" != "X"; then +- if test -f "$dir/$libname.la"; then +- found_la="$dir/$libname.la" +- fi +- fi +- fi +- fi +- done +- fi +- if test "X$found_dir" = "X"; then +- for x in $LDFLAGS $LTLIB[]NAME; do +- AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) +- case "$x" in +- -L*) +- dir=`echo "X$x" | sed -e 's/^X-L//'` +- dnl First look for a shared library. +- if test -n "$acl_shlibext"; then +- if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then +- found_dir="$dir" +- found_so="$dir/$libname$shrext" +- else +- if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then +- ver=`(cd "$dir" && \ +- for f in "$libname$shrext".*; do echo "$f"; done \ +- | sed -e "s,^$libname$shrext\\\\.,," \ +- | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ +- | sed 1q ) 2>/dev/null` +- if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then +- found_dir="$dir" +- found_so="$dir/$libname$shrext.$ver" +- fi +- else +- eval library_names=\"$acl_library_names_spec\" +- for f in $library_names; do +- if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then +- found_dir="$dir" +- found_so="$dir/$f" +- break +- fi +- done +- fi +- fi +- fi +- dnl Then look for a static library. +- if test "X$found_dir" = "X"; then +- if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then +- found_dir="$dir" +- found_a="$dir/$libname.$acl_libext" +- fi +- fi +- if test "X$found_dir" != "X"; then +- if test -f "$dir/$libname.la"; then +- found_la="$dir/$libname.la" +- fi +- fi +- ;; +- esac +- if test "X$found_dir" != "X"; then +- break +- fi +- done +- fi +- if test "X$found_dir" != "X"; then +- dnl Found the library. +- LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" +- if test "X$found_so" != "X"; then +- dnl Linking with a shared library. We attempt to hardcode its +- dnl directory into the executable's runpath, unless it's the +- dnl standard /usr/lib. +- if test "$enable_rpath" = no \ +- || test "X$found_dir" = "X/usr/$acl_libdirstem" \ +- || test "X$found_dir" = "X/usr/$acl_libdirstem2" \ +- || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then +- dnl No hardcoding is needed. +- LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" +- else +- dnl Use an explicit option to hardcode DIR into the resulting +- dnl binary. +- dnl Potentially add DIR to ltrpathdirs. +- dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. +- haveit= +- for x in $ltrpathdirs; do +- if test "X$x" = "X$found_dir"; then +- haveit=yes +- break +- fi +- done +- if test -z "$haveit"; then +- ltrpathdirs="$ltrpathdirs $found_dir" +- fi +- dnl The hardcoding into $LIBNAME is system dependent. +- if test "$acl_hardcode_direct" = yes; then +- dnl Using DIR/libNAME.so during linking hardcodes DIR into the +- dnl resulting binary. +- LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" +- else +- if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then +- dnl Use an explicit option to hardcode DIR into the resulting +- dnl binary. +- LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" +- dnl Potentially add DIR to rpathdirs. +- dnl The rpathdirs will be appended to $LIBNAME at the end. +- haveit= +- for x in $rpathdirs; do +- if test "X$x" = "X$found_dir"; then +- haveit=yes +- break +- fi +- done +- if test -z "$haveit"; then +- rpathdirs="$rpathdirs $found_dir" +- fi +- else +- dnl Rely on "-L$found_dir". +- dnl But don't add it if it's already contained in the LDFLAGS +- dnl or the already constructed $LIBNAME +- haveit= +- for x in $LDFLAGS $LIB[]NAME; do +- AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) +- if test "X$x" = "X-L$found_dir"; then +- haveit=yes +- break +- fi +- done +- if test -z "$haveit"; then +- LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" +- fi +- if test "$acl_hardcode_minus_L" != no; then +- dnl FIXME: Not sure whether we should use +- dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" +- dnl here. +- LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" +- else +- dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH +- dnl here, because this doesn't fit in flags passed to the +- dnl compiler. So give up. No hardcoding. This affects only +- dnl very old systems. +- dnl FIXME: Not sure whether we should use +- dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" +- dnl here. +- LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" +- fi +- fi +- fi +- fi +- else +- if test "X$found_a" != "X"; then +- dnl Linking with a static library. +- LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" +- else +- dnl We shouldn't come here, but anyway it's good to have a +- dnl fallback. +- LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" +- fi +- fi +- dnl Assume the include files are nearby. +- additional_includedir= +- case "$found_dir" in +- */$acl_libdirstem | */$acl_libdirstem/) +- basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` +- if test "$name" = '$1'; then +- LIB[]NAME[]_PREFIX="$basedir" +- fi +- additional_includedir="$basedir/include" +- ;; +- */$acl_libdirstem2 | */$acl_libdirstem2/) +- basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` +- if test "$name" = '$1'; then +- LIB[]NAME[]_PREFIX="$basedir" +- fi +- additional_includedir="$basedir/include" +- ;; +- */$acl_libdirstem3 | */$acl_libdirstem3/) +- basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'` +- if test "$name" = '$1'; then +- LIB[]NAME[]_PREFIX="$basedir" +- fi +- additional_includedir="$basedir/include" +- ;; +- esac +- if test "X$additional_includedir" != "X"; then +- dnl Potentially add $additional_includedir to $INCNAME. +- dnl But don't add it +- dnl 1. if it's the standard /usr/include, +- dnl 2. if it's /usr/local/include and we are using GCC on Linux, +- dnl 3. if it's already present in $CPPFLAGS or the already +- dnl constructed $INCNAME, +- dnl 4. if it doesn't exist as a directory. +- if test "X$additional_includedir" != "X/usr/include"; then +- haveit= +- if test "X$additional_includedir" = "X/usr/local/include"; then +- if test -n "$GCC"; then +- case $host_os in +- linux* | gnu* | k*bsd*-gnu) haveit=yes;; +- esac +- fi +- fi +- if test -z "$haveit"; then +- for x in $CPPFLAGS $INC[]NAME; do +- AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) +- if test "X$x" = "X-I$additional_includedir"; then +- haveit=yes +- break +- fi +- done +- if test -z "$haveit"; then +- if test -d "$additional_includedir"; then +- dnl Really add $additional_includedir to $INCNAME. +- INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" +- fi +- fi +- fi +- fi +- fi +- dnl Look for dependencies. +- if test -n "$found_la"; then +- dnl Read the .la file. It defines the variables +- dnl dlname, library_names, old_library, dependency_libs, current, +- dnl age, revision, installed, dlopen, dlpreopen, libdir. +- saved_libdir="$libdir" +- case "$found_la" in +- */* | *\\*) . "$found_la" ;; +- *) . "./$found_la" ;; +- esac +- libdir="$saved_libdir" +- dnl We use only dependency_libs. +- for dep in $dependency_libs; do +- case "$dep" in +- -L*) +- dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'` +- dnl Potentially add $dependency_libdir to $LIBNAME and $LTLIBNAME. +- dnl But don't add it +- dnl 1. if it's the standard /usr/lib, +- dnl 2. if it's /usr/local/lib and we are using GCC on Linux, +- dnl 3. if it's already present in $LDFLAGS or the already +- dnl constructed $LIBNAME, +- dnl 4. if it doesn't exist as a directory. +- if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \ +- && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \ +- && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then +- haveit= +- if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \ +- || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \ +- || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then +- if test -n "$GCC"; then +- case $host_os in +- linux* | gnu* | k*bsd*-gnu) haveit=yes;; +- esac +- fi +- fi +- if test -z "$haveit"; then +- haveit= +- for x in $LDFLAGS $LIB[]NAME; do +- AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) +- if test "X$x" = "X-L$dependency_libdir"; then +- haveit=yes +- break +- fi +- done +- if test -z "$haveit"; then +- if test -d "$dependency_libdir"; then +- dnl Really add $dependency_libdir to $LIBNAME. +- LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$dependency_libdir" +- fi +- fi +- haveit= +- for x in $LDFLAGS $LTLIB[]NAME; do +- AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) +- if test "X$x" = "X-L$dependency_libdir"; then +- haveit=yes +- break +- fi +- done +- if test -z "$haveit"; then +- if test -d "$dependency_libdir"; then +- dnl Really add $dependency_libdir to $LTLIBNAME. +- LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$dependency_libdir" +- fi +- fi +- fi +- fi +- ;; +- -R*) +- dir=`echo "X$dep" | sed -e 's/^X-R//'` +- if test "$enable_rpath" != no; then +- dnl Potentially add DIR to rpathdirs. +- dnl The rpathdirs will be appended to $LIBNAME at the end. +- haveit= +- for x in $rpathdirs; do +- if test "X$x" = "X$dir"; then +- haveit=yes +- break +- fi +- done +- if test -z "$haveit"; then +- rpathdirs="$rpathdirs $dir" +- fi +- dnl Potentially add DIR to ltrpathdirs. +- dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. +- haveit= +- for x in $ltrpathdirs; do +- if test "X$x" = "X$dir"; then +- haveit=yes +- break +- fi +- done +- if test -z "$haveit"; then +- ltrpathdirs="$ltrpathdirs $dir" +- fi +- fi +- ;; +- -l*) +- dnl Handle this in the next round. +- dnl But on GNU systems, ignore -lc options, because +- dnl - linking with libc is the default anyway, +- dnl - linking with libc.a may produce an error +- dnl "/usr/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `/usr/lib/libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie" +- dnl or may produce an executable that always crashes, see +- dnl . +- dep=`echo "X$dep" | sed -e 's/^X-l//'` +- if test "X$dep" != Xc \ +- || case $host_os in +- linux* | gnu* | k*bsd*-gnu) false ;; +- *) true ;; +- esac; then +- names_next_round="$names_next_round $dep" +- fi +- ;; +- *.la) +- dnl Handle this in the next round. Throw away the .la's +- dnl directory; it is already contained in a preceding -L +- dnl option. +- names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` +- ;; +- *) +- dnl Most likely an immediate library name. +- LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" +- LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" +- ;; +- esac +- done +- fi +- else +- dnl Didn't find the library; assume it is in the system directories +- dnl known to the linker and runtime loader. (All the system +- dnl directories known to the linker should also be known to the +- dnl runtime loader, otherwise the system is severely misconfigured.) +- LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" +- LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" +- fi +- fi +- fi +- done +- done +- if test "X$rpathdirs" != "X"; then +- if test -n "$acl_hardcode_libdir_separator"; then +- dnl Weird platform: only the last -rpath option counts, the user must +- dnl pass all path elements in one option. We can arrange that for a +- dnl single library, but not when more than one $LIBNAMEs are used. +- alldirs= +- for found_dir in $rpathdirs; do +- alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" +- done +- dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. +- acl_saved_libdir="$libdir" +- libdir="$alldirs" +- eval flag=\"$acl_hardcode_libdir_flag_spec\" +- libdir="$acl_saved_libdir" +- LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" +- else +- dnl The -rpath options are cumulative. +- for found_dir in $rpathdirs; do +- acl_saved_libdir="$libdir" +- libdir="$found_dir" +- eval flag=\"$acl_hardcode_libdir_flag_spec\" +- libdir="$acl_saved_libdir" +- LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" +- done +- fi +- fi +- if test "X$ltrpathdirs" != "X"; then +- dnl When using libtool, the option that works for both libraries and +- dnl executables is -R. The -R options are cumulative. +- for found_dir in $ltrpathdirs; do +- LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" +- done +- fi +- popdef([PACKLIBS]) +- popdef([PACKUP]) +- popdef([PACK]) +- popdef([NAME]) +-]) +- +-dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +-dnl unless already present in VAR. +-dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +-dnl contains two or three consecutive elements that belong together. +-AC_DEFUN([AC_LIB_APPENDTOVAR], +-[ +- for element in [$2]; do +- haveit= +- for x in $[$1]; do +- AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) +- if test "X$x" = "X$element"; then +- haveit=yes +- break +- fi +- done +- if test -z "$haveit"; then +- [$1]="${[$1]}${[$1]:+ }$element" +- fi +- done +-]) +- +-dnl For those cases where a variable contains several -L and -l options +-dnl referring to unknown libraries and directories, this macro determines the +-dnl necessary additional linker options for the runtime path. +-dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) +-dnl sets LDADDVAR to linker options needed together with LIBSVALUE. +-dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, +-dnl otherwise linking without libtool is assumed. +-AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], +-[ +- AC_REQUIRE([AC_LIB_RPATH]) +- AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) +- $1= +- if test "$enable_rpath" != no; then +- if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then +- dnl Use an explicit option to hardcode directories into the resulting +- dnl binary. +- rpathdirs= +- next= +- for opt in $2; do +- if test -n "$next"; then +- dir="$next" +- dnl No need to hardcode the standard /usr/lib. +- if test "X$dir" != "X/usr/$acl_libdirstem" \ +- && test "X$dir" != "X/usr/$acl_libdirstem2" \ +- && test "X$dir" != "X/usr/$acl_libdirstem3"; then +- rpathdirs="$rpathdirs $dir" +- fi +- next= +- else +- case $opt in +- -L) next=yes ;; +- -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` +- dnl No need to hardcode the standard /usr/lib. +- if test "X$dir" != "X/usr/$acl_libdirstem" \ +- && test "X$dir" != "X/usr/$acl_libdirstem2" \ +- && test "X$dir" != "X/usr/$acl_libdirstem3"; then +- rpathdirs="$rpathdirs $dir" +- fi +- next= ;; +- *) next= ;; +- esac +- fi +- done +- if test "X$rpathdirs" != "X"; then +- if test -n ""$3""; then +- dnl libtool is used for linking. Use -R options. +- for dir in $rpathdirs; do +- $1="${$1}${$1:+ }-R$dir" +- done +- else +- dnl The linker is used for linking directly. +- if test -n "$acl_hardcode_libdir_separator"; then +- dnl Weird platform: only the last -rpath option counts, the user +- dnl must pass all path elements in one option. +- alldirs= +- for dir in $rpathdirs; do +- alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" +- done +- acl_saved_libdir="$libdir" +- libdir="$alldirs" +- eval flag=\"$acl_hardcode_libdir_flag_spec\" +- libdir="$acl_saved_libdir" +- $1="$flag" +- else +- dnl The -rpath options are cumulative. +- for dir in $rpathdirs; do +- acl_saved_libdir="$libdir" +- libdir="$dir" +- eval flag=\"$acl_hardcode_libdir_flag_spec\" +- libdir="$acl_saved_libdir" +- $1="${$1}${$1:+ }$flag" +- done +- fi +- fi +- fi +- fi +- fi +- AC_SUBST([$1]) +-]) +diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4 +deleted file mode 100644 +index 29283534..00000000 +--- a/m4/lib-prefix.m4 ++++ /dev/null +@@ -1,334 +0,0 @@ +-# lib-prefix.m4 +-# serial 23 +-dnl Copyright (C) 2001-2005, 2008-2025 Free Software Foundation, Inc. +-dnl This file is free software; the Free Software Foundation +-dnl gives unlimited permission to copy and/or distribute it, +-dnl with or without modifications, as long as this notice is preserved. +-dnl This file is offered as-is, without any warranty. +- +-dnl From Bruno Haible. +- +-dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +-dnl to access previously installed libraries. The basic assumption is that +-dnl a user will want packages to use other packages he previously installed +-dnl with the same --prefix option. +-dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +-dnl libraries, but is otherwise very convenient. +-AC_DEFUN([AC_LIB_PREFIX], +-[ +- AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) +- AC_REQUIRE([AC_PROG_CC]) +- AC_REQUIRE([AC_CANONICAL_HOST]) +- AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) +- AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) +- dnl By default, look in $includedir and $libdir. +- use_additional=yes +- AC_LIB_WITH_FINAL_PREFIX([ +- eval additional_includedir=\"$includedir\" +- eval additional_libdir=\"$libdir\" +- ]) +- AC_ARG_WITH([lib-prefix], +-[[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib +- --without-lib-prefix don't search for libraries in includedir and libdir]], +-[ +- if test "X$withval" = "Xno"; then +- use_additional=no +- else +- if test "X$withval" = "X"; then +- AC_LIB_WITH_FINAL_PREFIX([ +- eval additional_includedir=\"$includedir\" +- eval additional_libdir=\"$libdir\" +- ]) +- else +- additional_includedir="$withval/include" +- additional_libdir="$withval/$acl_libdirstem" +- fi +- fi +-]) +- if test $use_additional = yes; then +- dnl Potentially add $additional_includedir to $CPPFLAGS. +- dnl But don't add it +- dnl 1. if it's the standard /usr/include, +- dnl 2. if it's already present in $CPPFLAGS, +- dnl 3. if it's /usr/local/include and we are using GCC on Linux, +- dnl 4. if it doesn't exist as a directory. +- if test "X$additional_includedir" != "X/usr/include"; then +- haveit= +- for x in $CPPFLAGS; do +- AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) +- if test "X$x" = "X-I$additional_includedir"; then +- haveit=yes +- break +- fi +- done +- if test -z "$haveit"; then +- if test "X$additional_includedir" = "X/usr/local/include"; then +- if test -n "$GCC"; then +- case $host_os in +- linux* | gnu* | k*bsd*-gnu) haveit=yes;; +- esac +- fi +- fi +- if test -z "$haveit"; then +- if test -d "$additional_includedir"; then +- dnl Really add $additional_includedir to $CPPFLAGS. +- CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" +- fi +- fi +- fi +- fi +- dnl Potentially add $additional_libdir to $LDFLAGS. +- dnl But don't add it +- dnl 1. if it's the standard /usr/lib, +- dnl 2. if it's already present in $LDFLAGS, +- dnl 3. if it's /usr/local/lib and we are using GCC on Linux, +- dnl 4. if it doesn't exist as a directory. +- if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then +- haveit= +- for x in $LDFLAGS; do +- AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) +- if test "X$x" = "X-L$additional_libdir"; then +- haveit=yes +- break +- fi +- done +- if test -z "$haveit"; then +- if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then +- if test -n "$GCC"; then +- case $host_os in +- linux*) haveit=yes;; +- esac +- fi +- fi +- if test -z "$haveit"; then +- if test -d "$additional_libdir"; then +- dnl Really add $additional_libdir to $LDFLAGS. +- LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" +- fi +- fi +- fi +- fi +- fi +-]) +- +-dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +-dnl acl_final_exec_prefix, containing the values to which $prefix and +-dnl $exec_prefix will expand at the end of the configure script. +-AC_DEFUN([AC_LIB_PREPARE_PREFIX], +-[ +- dnl Unfortunately, prefix and exec_prefix get only finally determined +- dnl at the end of configure. +- if test "X$prefix" = "XNONE"; then +- acl_final_prefix="$ac_default_prefix" +- else +- acl_final_prefix="$prefix" +- fi +- if test "X$exec_prefix" = "XNONE"; then +- acl_final_exec_prefix='${prefix}' +- else +- acl_final_exec_prefix="$exec_prefix" +- fi +- acl_saved_prefix="$prefix" +- prefix="$acl_final_prefix" +- eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" +- prefix="$acl_saved_prefix" +-]) +- +-dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +-dnl variables prefix and exec_prefix bound to the values they will have +-dnl at the end of the configure script. +-AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +-[ +- acl_saved_prefix="$prefix" +- prefix="$acl_final_prefix" +- acl_saved_exec_prefix="$exec_prefix" +- exec_prefix="$acl_final_exec_prefix" +- $1 +- exec_prefix="$acl_saved_exec_prefix" +- prefix="$acl_saved_prefix" +-]) +- +-dnl AC_LIB_PREPARE_MULTILIB creates +-dnl - a function acl_is_expected_elfclass, that tests whether standard input +-dn; has a 32-bit or 64-bit ELF header, depending on the host CPU ABI, +-dnl - 3 variables acl_libdirstem, acl_libdirstem2, acl_libdirstem3, containing +-dnl the basename of the libdir to try in turn, either "lib" or "lib64" or +-dnl "lib/64" or "lib32" or "lib/sparcv9" or "lib/amd64" or similar. +-AC_DEFUN([AC_LIB_PREPARE_MULTILIB], +-[ +- dnl There is no formal standard regarding lib, lib32, and lib64. +- dnl On most glibc systems, the current practice is that on a system supporting +- dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under +- dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. However, on +- dnl Arch Linux based distributions, it's the opposite: 32-bit libraries go +- dnl under $prefix/lib32 and 64-bit libraries go under $prefix/lib. +- dnl We determine the compiler's default mode by looking at the compiler's +- dnl library search path. If at least one of its elements ends in /lib64 or +- dnl points to a directory whose absolute pathname ends in /lib64, we use that +- dnl for 64-bit ABIs. Similarly for 32-bit ABIs. Otherwise we use the default, +- dnl namely "lib". +- dnl On Solaris systems, the current practice is that on a system supporting +- dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under +- dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or +- dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib. +- AC_REQUIRE([AC_CANONICAL_HOST]) +- AC_REQUIRE([gl_HOST_CPU_C_ABI_32BIT]) +- +- AC_CACHE_CHECK([for ELF binary format], [gl_cv_elf], +- [AC_EGREP_CPP([Extensible Linking Format], +- [#if defined __ELF__ || (defined __linux__ && (defined __EDG__ || defined __SUNPRO_C)) +- Extensible Linking Format +- #endif +- ], +- [gl_cv_elf=yes], +- [gl_cv_elf=no]) +- ]) +- if test $gl_cv_elf = yes; then +- # Extract the ELF class of a file (5th byte) in decimal. +- # Cf. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header +- if od -A x < /dev/null >/dev/null 2>/dev/null; then +- # Use POSIX od. +- func_elfclass () +- { +- od -A n -t d1 -j 4 -N 1 +- } +- else +- # Use BSD hexdump. +- func_elfclass () +- { +- dd bs=1 count=1 skip=4 2>/dev/null | hexdump -e '1/1 "%3d "' +- echo +- } +- fi +- # Use 'expr', not 'test', to compare the values of func_elfclass, because on +- # Solaris 11 OpenIndiana and Solaris 11 OmniOS, the result is 001 or 002, +- # not 1 or 2. +-changequote(,)dnl +- case $HOST_CPU_C_ABI_32BIT in +- yes) +- # 32-bit ABI. +- acl_is_expected_elfclass () +- { +- expr "`func_elfclass | sed -e 's/[ ]//g'`" = 1 > /dev/null +- } +- ;; +- no) +- # 64-bit ABI. +- acl_is_expected_elfclass () +- { +- expr "`func_elfclass | sed -e 's/[ ]//g'`" = 2 > /dev/null +- } +- ;; +- *) +- # Unknown. +- acl_is_expected_elfclass () +- { +- : +- } +- ;; +- esac +-changequote([,])dnl +- else +- acl_is_expected_elfclass () +- { +- : +- } +- fi +- +- dnl Allow the user to override the result by setting acl_cv_libdirstems. +- AC_CACHE_CHECK([for the common suffixes of directories in the library search path], +- [acl_cv_libdirstems], +- [dnl Try 'lib' first, because that's the default for libdir in GNU, see +- dnl . +- acl_libdirstem=lib +- acl_libdirstem2= +- acl_libdirstem3= +- case "$host_os" in +- solaris*) +- dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment +- dnl . +- dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link." +- dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the +- dnl symlink is missing, so we set acl_libdirstem2 too. +- if test $HOST_CPU_C_ABI_32BIT = no; then +- acl_libdirstem2=lib/64 +- case "$host_cpu" in +- sparc*) acl_libdirstem3=lib/sparcv9 ;; +- i*86 | x86_64) acl_libdirstem3=lib/amd64 ;; +- esac +- fi +- ;; +- netbsd*) +- dnl On NetBSD/sparc64, there is a 'sparc' subdirectory that contains +- dnl 32-bit libraries. +- if test $HOST_CPU_C_ABI_32BIT != no; then +- case "$host_cpu" in +- sparc*) acl_libdirstem2=lib/sparc ;; +- esac +- fi +- ;; +- *) +- dnl If $CC generates code for a 32-bit ABI, the libraries are +- dnl surely under $prefix/lib or $prefix/lib32, not $prefix/lib64. +- dnl Similarly, if $CC generates code for a 64-bit ABI, the libraries +- dnl are surely under $prefix/lib or $prefix/lib64, not $prefix/lib32. +- dnl Find the compiler's search path. However, non-system compilers +- dnl sometimes have odd library search paths. But we can't simply invoke +- dnl '/usr/bin/gcc -print-search-dirs' because that would not take into +- dnl account the -m32/-m31 or -m64 options from the $CC or $CFLAGS. +- searchpath=`(LC_ALL=C $CC $CPPFLAGS $CFLAGS -print-search-dirs) 2>/dev/null \ +- | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` +- if test $HOST_CPU_C_ABI_32BIT != no; then +- # 32-bit or unknown ABI. +- if test -d /usr/lib32; then +- acl_libdirstem2=lib32 +- fi +- fi +- if test $HOST_CPU_C_ABI_32BIT != yes; then +- # 64-bit or unknown ABI. +- if test -d /usr/lib64; then +- acl_libdirstem3=lib64 +- fi +- fi +- if test -n "$searchpath"; then +- acl_saved_IFS="${IFS= }"; IFS=":" +- for searchdir in $searchpath; do +- if test -d "$searchdir"; then +- case "$searchdir" in +- */lib32/ | */lib32 ) acl_libdirstem2=lib32 ;; +- */lib64/ | */lib64 ) acl_libdirstem3=lib64 ;; +- */../ | */.. ) +- # Better ignore directories of this form. They are misleading. +- ;; +- *) searchdir=`cd "$searchdir" && pwd` +- case "$searchdir" in +- */lib32 ) acl_libdirstem2=lib32 ;; +- */lib64 ) acl_libdirstem3=lib64 ;; +- esac ;; +- esac +- fi +- done +- IFS="$acl_saved_IFS" +- if test $HOST_CPU_C_ABI_32BIT = yes; then +- # 32-bit ABI. +- acl_libdirstem3= +- fi +- if test $HOST_CPU_C_ABI_32BIT = no; then +- # 64-bit ABI. +- acl_libdirstem2= +- fi +- fi +- ;; +- esac +- test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" +- test -n "$acl_libdirstem3" || acl_libdirstem3="$acl_libdirstem" +- acl_cv_libdirstems="$acl_libdirstem,$acl_libdirstem2,$acl_libdirstem3" +- ]) +- dnl Decompose acl_cv_libdirstems into acl_libdirstem, acl_libdirstem2, and +- dnl acl_libdirstem3. +-changequote(,)dnl +- acl_libdirstem=`echo "$acl_cv_libdirstems" | sed -e 's/,.*//'` +- acl_libdirstem2=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,//' -e 's/,.*//'` +- acl_libdirstem3=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,[^,]*,//' -e 's/,.*//'` +-changequote([,])dnl +-]) +diff --git a/m4/nls.m4 b/m4/nls.m4 +deleted file mode 100644 +index c4601415..00000000 +--- a/m4/nls.m4 ++++ /dev/null +@@ -1,33 +0,0 @@ +-# nls.m4 +-# serial 6 (gettext-0.24) +-dnl Copyright (C) 1995-2025 Free Software Foundation, Inc. +-dnl This file is free software; the Free Software Foundation +-dnl gives unlimited permission to copy and/or distribute it, +-dnl with or without modifications, as long as this notice is preserved. +-dnl This file is offered as-is, without any warranty. +-dnl +-dnl This file can be used in projects which are not available under +-dnl the GNU General Public License or the GNU Lesser General Public +-dnl License but which still want to provide support for the GNU gettext +-dnl functionality. +-dnl Please note that the actual code of the GNU gettext library is covered +-dnl by the GNU Lesser General Public License, and the rest of the GNU +-dnl gettext package is covered by the GNU General Public License. +-dnl They are *not* in the public domain. +- +-dnl Authors: +-dnl Ulrich Drepper , 1995-2000. +-dnl Bruno Haible , 2000-2003. +- +-AC_PREREQ([2.50]) +- +-AC_DEFUN([AM_NLS], +-[ +- AC_MSG_CHECKING([whether NLS is requested]) +- dnl Default is enabled NLS +- AC_ARG_ENABLE([nls], +- [ --disable-nls do not use Native Language Support], +- USE_NLS=$enableval, USE_NLS=yes) +- AC_MSG_RESULT([$USE_NLS]) +- AC_SUBST([USE_NLS]) +-]) +diff --git a/m4/po.m4 b/m4/po.m4 +deleted file mode 100644 +index 73e0436b..00000000 +--- a/m4/po.m4 ++++ /dev/null +@@ -1,157 +0,0 @@ +-# po.m4 +-# serial 34 (gettext-0.24) +-dnl Copyright (C) 1995-2024 Free Software Foundation, Inc. +-dnl This file is free software; the Free Software Foundation +-dnl gives unlimited permission to copy and/or distribute it, +-dnl with or without modifications, as long as this notice is preserved. +-dnl This file is offered as-is, without any warranty. +-dnl +-dnl This file can be used in projects which are not available under +-dnl the GNU General Public License or the GNU Lesser General Public +-dnl License but which still want to provide support for the GNU gettext +-dnl functionality. +-dnl Please note that the actual code of the GNU gettext library is covered +-dnl by the GNU Lesser General Public License, and the rest of the GNU +-dnl gettext package is covered by the GNU General Public License. +-dnl They are *not* in the public domain. +- +-dnl Authors: +-dnl Ulrich Drepper , 1995-2000. +-dnl Bruno Haible , 2000-2024. +- +-AC_PREREQ([2.60]) +- +-dnl Checks for all prerequisites of the po subdirectory. +-AC_DEFUN([AM_PO_SUBDIRS], +-[ +- AC_REQUIRE([AC_PROG_MAKE_SET])dnl +- AC_REQUIRE([AC_PROG_INSTALL])dnl +- AC_REQUIRE([AC_PROG_MKDIR_P])dnl +- AC_REQUIRE([AC_PROG_SED])dnl +- AC_REQUIRE([AM_NLS])dnl +- +- dnl Release version of the gettext macros. This is used to ensure that +- dnl the gettext macros and po/Makefile.in.in are in sync. +- AC_SUBST([GETTEXT_MACRO_VERSION], [0.24]) +- +- dnl Perform the following tests also if --disable-nls has been given, +- dnl because they are needed for "make dist" to work. +- +- dnl Search for GNU msgfmt in the PATH. +- dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. +- dnl The second test excludes FreeBSD msgfmt. +- AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, +- [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && +- (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], +- :) +- AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT]) +- +- dnl Test whether it is GNU msgfmt >= 0.15. +-changequote(,)dnl +- case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in +- '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; +- *) GMSGFMT_015=$GMSGFMT ;; +- esac +-changequote([,])dnl +- AC_SUBST([GMSGFMT_015]) +- +- dnl Search for GNU xgettext 0.12 or newer in the PATH. +- dnl The first test excludes Solaris xgettext and early GNU xgettext versions. +- dnl The second test excludes FreeBSD xgettext. +- AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, +- [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && +- (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], +- :) +- dnl Remove leftover from FreeBSD xgettext call. +- rm -f messages.po +- +- dnl Test whether it is GNU xgettext >= 0.15. +-changequote(,)dnl +- case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in +- '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; +- *) XGETTEXT_015=$XGETTEXT ;; +- esac +-changequote([,])dnl +- AC_SUBST([XGETTEXT_015]) +- +- dnl Search for GNU msgmerge 0.11 or newer in the PATH. +- AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, +- [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) +- +- dnl Test whether it is GNU msgmerge >= 0.20. +- if LC_ALL=C $MSGMERGE --help | grep ' --for-msgfmt ' >/dev/null; then +- MSGMERGE_FOR_MSGFMT_OPTION='--for-msgfmt' +- else +- dnl Test whether it is GNU msgmerge >= 0.12. +- if LC_ALL=C $MSGMERGE --help | grep ' --no-fuzzy-matching ' >/dev/null; then +- MSGMERGE_FOR_MSGFMT_OPTION='--no-fuzzy-matching --no-location --quiet' +- else +- dnl With these old versions, $(MSGMERGE) $(MSGMERGE_FOR_MSGFMT_OPTION) is +- dnl slow. But this is not a big problem, as such old gettext versions are +- dnl hardly in use any more. +- MSGMERGE_FOR_MSGFMT_OPTION='--no-location --quiet' +- fi +- fi +- AC_SUBST([MSGMERGE_FOR_MSGFMT_OPTION]) +- +- dnl Support for AM_XGETTEXT_OPTION. +- test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= +- AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) +- +- if test -n "$ALL_LINGUAS"; then +- test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" +- fi +- +- dnl Capture the value of LINGUAS because we need it to compute CATALOGS. +- dnl In the Makefile, call it DESIRED_LINGUAS (because there, LINGUAS denotes +- dnl the set of available translations, given by the developer). +- DESIRED_LINGUAS="${LINGUAS-\$(ALL_LINGUAS)}" +- AC_SUBST([DESIRED_LINGUAS]) +- +- AC_CONFIG_COMMANDS([po-directories], [[ +- for ac_file in $CONFIG_FILES; do +- # Support "outfile[:infile[:infile...]]" +- case "$ac_file" in +- *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; +- esac +- # PO directories have a Makefile.in generated from Makefile.in.in. +- case "$ac_file" in */Makefile.in) +- # Adjust a relative srcdir. +- ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` +- ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'` +- ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` +- # In autoconf-2.13 it is called $ac_given_srcdir. +- # In autoconf-2.50 it is called $srcdir. +- test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" +- # Treat a directory as a PO directory if and only if it has a +- # POTFILES.in file. This allows packages to have multiple PO +- # directories under different names or in different locations. +- if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then +- test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" +- cat "$ac_dir/Makefile.in" > "$ac_dir/Makefile" +- fi +- ;; +- esac +- done]], +- []) +-]) +- +-dnl Postprocesses a Makefile in a directory containing PO files. +-AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], +-[ +- sed -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp" +- mv "$ac_file.tmp" "$ac_file" +-]) +- +-dnl Initializes the accumulator used by AM_XGETTEXT_OPTION. +-AC_DEFUN([AM_XGETTEXT_OPTION_INIT], +-[ +- XGETTEXT_EXTRA_OPTIONS= +-]) +- +-dnl Registers an option to be passed to xgettext in the po subdirectory. +-AC_DEFUN([AM_XGETTEXT_OPTION], +-[ +- AC_REQUIRE([AM_XGETTEXT_OPTION_INIT]) +- XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS $1" +-]) +diff --git a/m4/progtest.m4 b/m4/progtest.m4 +deleted file mode 100644 +index 2671eb85..00000000 +--- a/m4/progtest.m4 ++++ /dev/null +@@ -1,93 +0,0 @@ +-# progtest.m4 +-# serial 10 (gettext-0.24) +-dnl Copyright (C) 1996-2025 Free Software Foundation, Inc. +-dnl This file is free software; the Free Software Foundation +-dnl gives unlimited permission to copy and/or distribute it, +-dnl with or without modifications, as long as this notice is preserved. +-dnl This file is offered as-is, without any warranty. +-dnl +-dnl This file can be used in projects which are not available under +-dnl the GNU General Public License or the GNU Lesser General Public +-dnl License but which still want to provide support for the GNU gettext +-dnl functionality. +-dnl Please note that the actual code of the GNU gettext library is covered +-dnl by the GNU Lesser General Public License, and the rest of the GNU +-dnl gettext package is covered by the GNU General Public License. +-dnl They are *not* in the public domain. +- +-dnl Authors: +-dnl Ulrich Drepper , 1996. +- +-AC_PREREQ([2.53]) +- +-# Search path for a program which passes the given test. +- +-dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +-dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +-AC_DEFUN([AM_PATH_PROG_WITH_TEST], +-[ +-# Prepare PATH_SEPARATOR. +-# The user is always right. +-if test "${PATH_SEPARATOR+set}" != set; then +- # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which +- # contains only /bin. Note that ksh looks also at the FPATH variable, +- # so we have to set that as well for the test. +- PATH_SEPARATOR=: +- (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ +- && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ +- || PATH_SEPARATOR=';' +- } +-fi +- +-# Find out how to test for executable files. Don't use a zero-byte file, +-# as systems may use methods other than mode bits to determine executability. +-cat >conf$$.file <<_ASEOF +-#! /bin/sh +-exit 0 +-_ASEOF +-chmod +x conf$$.file +-if test -x conf$$.file >/dev/null 2>&1; then +- ac_executable_p="test -x" +-else +- ac_executable_p="test -f" +-fi +-rm -f conf$$.file +- +-# Extract the first word of "$2", so it can be a program name with args. +-set dummy $2; ac_word=[$]2 +-AC_MSG_CHECKING([for $ac_word]) +-AC_CACHE_VAL([ac_cv_path_$1], +-[case "[$]$1" in +- [[\\/]]* | ?:[[\\/]]*) +- ac_cv_path_$1="[$]$1" # Let the user override the test with a path. +- ;; +- *) +- gt_saved_IFS="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in m4_if([$5], , $PATH, [$5]); do +- IFS="$gt_saved_IFS" +- test -z "$ac_dir" && ac_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then +- echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD +- if [$3]; then +- ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" +- break 2 +- fi +- fi +- done +- done +- IFS="$gt_saved_IFS" +-dnl If no 4th arg is given, leave the cache variable unset, +-dnl so AC_PATH_PROGS will keep looking. +-m4_if([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +-])dnl +- ;; +-esac])dnl +-$1="$ac_cv_path_$1" +-if test m4_if([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then +- AC_MSG_RESULT([$][$1]) +-else +- AC_MSG_RESULT([no]) +-fi +-AC_SUBST([$1])dnl +-]) diff --git a/0013-docs-Drop-references-to-virtio-win-osinfo-usage.patch b/0013-docs-Drop-references-to-virtio-win-osinfo-usage.patch new file mode 100644 index 0000000..7f70ff6 --- /dev/null +++ b/0013-docs-Drop-references-to-virtio-win-osinfo-usage.patch @@ -0,0 +1,44 @@ +From c80d9e84d1c5c12fd6fb675f99afcf0679a8a585 Mon Sep 17 00:00:00 2001 +From: Cole Robinson +Date: Tue, 10 Feb 2026 08:22:10 -0500 +Subject: [PATCH] docs: Drop references to virtio-win osinfo usage + +Follow on from libguestfs-common commit that dropped this: + +https://github.com/libguestfs/libguestfs-common/commit/22d586fe9 + +Signed-off-by: Cole Robinson +(cherry picked from commit 2ddfe18ccd7df423a86790b0505623660fc1ffe3) +--- + docs/virt-v2v.pod | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod +index f751f4e7..258fe937 100644 +--- a/docs/virt-v2v.pod ++++ b/docs/virt-v2v.pod +@@ -1344,9 +1344,9 @@ below. + Windows Drivers are installed from the ISO or directory pointed + to by the "VIRTIO_WIN" environment variable if present. + If the "VIRTIO_WIN" environment variable is absent +- (which is the recommended setting), then libosinfo is +- consulted first, for driver files that are locally +- available on the conversion host. ++ (which is the recommended setting), then drivers are ++ searched for in /usr/share/virtio-win, as installed ++ by the virtio-win RPM. + + + =head2 RHEL 4: SELinux relabel appears to hang forever +@@ -1877,11 +1877,6 @@ succeeds first: + + =over 4 + +-=item C +- +-Load osinfo data from the default paths, and attempt to find drivers via +-libosinfo lookup. This is the preferred method. +- + =item F + + The ISO containing virtio drivers for Windows. diff --git a/0014-docs-update-virtio-win-exploded-tree-docs.patch b/0014-docs-update-virtio-win-exploded-tree-docs.patch new file mode 100644 index 0000000..7c71707 --- /dev/null +++ b/0014-docs-update-virtio-win-exploded-tree-docs.patch @@ -0,0 +1,30 @@ +From 61a9ba9a9140573ec2964a6338e76c57c84bbf0a Mon Sep 17 00:00:00 2001 +From: Cole Robinson +Date: Tue, 10 Feb 2026 08:26:41 -0500 +Subject: [PATCH] docs: update virtio-win exploded tree docs + +The directory in /usr/share/virtio-win is not out of date these +days and hasn't been for years. See: + +https://github.com/libguestfs/libguestfs-common/commit/4be37c277 + +Signed-off-by: Cole Robinson +(cherry picked from commit f10924cdf2f438d0e939efdc6081b8b644a2131a) +--- + docs/virt-v2v.pod | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod +index 258fe937..04764832 100644 +--- a/docs/virt-v2v.pod ++++ b/docs/virt-v2v.pod +@@ -1883,8 +1883,7 @@ The ISO containing virtio drivers for Windows. + + =item F + +-The exploded tree of virtio drivers for Windows. This is +-usually incomplete, hence the least preferred method. ++The exploded tree of virtio drivers for Windows. + + =back + diff --git a/0015-ocaml-link.sh.in-pass-explicit-guestfs-search-path.patch b/0015-ocaml-link.sh.in-pass-explicit-guestfs-search-path.patch new file mode 100644 index 0000000..d87e6e3 --- /dev/null +++ b/0015-ocaml-link.sh.in-pass-explicit-guestfs-search-path.patch @@ -0,0 +1,54 @@ +From fbd10145df6d6b903f476895c4b205a0c261e454 Mon Sep 17 00:00:00 2001 +From: Cole Robinson +Date: Tue, 10 Feb 2026 11:42:34 -0500 +Subject: [PATCH] ocaml-link.sh.in: pass explicit guestfs search path + +Without this, if we use `libguestfs/run` while `ocaml-libguestfs-*` +host packages are installed, we get mismatched search path warnings +like these, and then linking fails: + + findlib: [WARNING] Package guestfs has multiple definitions in /tmp/libguestfs.git/ocaml/guestfs/META, /usr/lib64/ocaml/guestfs/META + findlib: [WARNING] Interface guestfs.cmi occurs in several directories: /usr/lib64/ocaml/guestfs, /tmp/libguestfs.git/ocaml/guestfs + +This change avoids the last warning. There's still lots of spew +about `multiple definitions` but it seems harmless. + +Signed-off-by: Cole Robinson +(cherry picked from commit 123c3211dfb4fb8949fbdc3967ec51e9eda34a6c) +--- + ocaml-link.sh.in | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +diff --git a/ocaml-link.sh.in b/ocaml-link.sh.in +index 4148e8f9..d3c44d10 100755 +--- a/ocaml-link.sh.in ++++ b/ocaml-link.sh.in +@@ -41,18 +41,26 @@ while true ; do + esac + done + ++# Without this, if we use `libguestfs/run` while `ocaml-libguestfs-*` ++# host packages are installed, we get mismatched search path warnings ++# like these, and then linking fails: ++# ++# findlib: [WARNING] Package guestfs has multiple definitions in /tmp/libguestfs.git/ocaml/guestfs/META, /usr/lib64/ocaml/guestfs/META ++# findlib: [WARNING] Interface guestfs.cmi occurs in several directories: /usr/lib64/ocaml/guestfs, /tmp/libguestfs.git/ocaml/guestfs ++guestfs_path=$(@OCAMLFIND@ query guestfs 2>/dev/null) ++ + # Integration with silent rules of automake: print the full command + # line option in verbose mode. + if [ x"${V:-@AM_DEFAULT_VERBOSITY@}" = x1 ]; then + echo "$@" \ + @OCAML_RUNTIME_VARIANT_PIC_OPTION@ \ +- -I +guestfs \ ++ -I "$guestfs_path" \ + -linkpkg \ + -cclib "'@LDFLAGS@ $cclib'" + fi + # NB -cclib must come last. + exec "$@" \ + @OCAML_RUNTIME_VARIANT_PIC_OPTION@ \ +- -I +guestfs \ ++ -I "$guestfs_path" \ + -linkpkg \ + -cclib "@LDFLAGS@ $cclib" diff --git a/0016-output-introduce-disk_name-helper.patch b/0016-output-introduce-disk_name-helper.patch new file mode 100644 index 0000000..a4da432 --- /dev/null +++ b/0016-output-introduce-disk_name-helper.patch @@ -0,0 +1,85 @@ +From 2723d30596546e92141f45bd302cf895d6233495 Mon Sep 17 00:00:00 2001 +From: Susant Sahani +Date: Tue, 10 Feb 2026 15:15:21 +0530 +Subject: [PATCH] output: introduce disk_name helper + +Refactor the places where we create "name-sdX" names to use a common +helper function. + +Signed-off-by: Richard W.M. Jones +Signed-off-by: Susant Sahani +(cherry picked from commit a4b76ca9b5e01e807d39c0a2ba1fe515b854ef82) +--- + output/output.ml | 7 +++++-- + output/output.mli | 4 ++++ + output/output_libvirt.ml | 2 +- + output/output_openstack.ml | 2 +- + 4 files changed, 11 insertions(+), 4 deletions(-) + +diff --git a/output/output.ml b/output/output.ml +index 7e096278..919a48a4 100644 +--- a/output/output.ml ++++ b/output/output.ml +@@ -150,8 +150,11 @@ let output_to_local_file ?name + ignore (waitpid [] pid) + ) + ++let disk_name name i = ++ sprintf "%s-sd%s" name (drive_name i) ++ + let disk_path os name i = +- let outdisk = sprintf "%s/%s-sd%s" os name (drive_name i) in ++ let outdisk = sprintf "%s/%s" os (disk_name name i) in + absolute_path outdisk + + let create_local_output_disks dir +@@ -214,7 +217,7 @@ let create_local_output_disks dir + let uris = + List.mapi ( + fun i _ -> +- let export = sprintf "%s-sd%s" output_name (drive_name i) in ++ let export = disk_name output_name i in + NBD_URI.Unix (socket, Some export) + ) input_disks in + +diff --git a/output/output.mli b/output/output.mli +index fa79bfe1..d63a5d72 100644 +--- a/output/output.mli ++++ b/output/output.mli +@@ -121,6 +121,10 @@ val output_to_local_file : ?name:string -> + (such as unmounting a host filesystem or removing a host device) + depends on the NBD server releasing resources. *) + ++val disk_name : string -> int -> string ++(** Return the disk name for the i'th disk, ++ eg. 0 => name-sda. *) ++ + val disk_path : string -> string -> int -> string + (** For [-o disk|qemu], return the output disk name of the i'th disk, + eg. 0 => /path/to/name-sda. *) +diff --git a/output/output_libvirt.ml b/output/output_libvirt.ml +index 9560d2d3..708de3e0 100644 +--- a/output/output_libvirt.ml ++++ b/output/output_libvirt.ml +@@ -189,7 +189,7 @@ module Libvirt_ = struct + let doc = + create_libvirt_xml ~pool:pool_name source inspect target_meta + target_features domcaps_features +- (fun i -> output_name ^ "-sd" ^ (drive_name i)) ++ (disk_name output_name) + output_format output_name in + + let tmpfile, chan = Filename.open_temp_file "v2vlibvirt" ".xml" in +diff --git a/output/output_openstack.ml b/output/output_openstack.ml +index 88a39c68..dd04052e 100644 +--- a/output/output_openstack.ml ++++ b/output/output_openstack.ml +@@ -322,7 +322,7 @@ The os-* parameters and environment variables are optional. + * something related to the guest name. Cinder volume + * names do not need to be unique. + *) +- let name = sprintf "%s-sd%s" output_name (drive_name i) in ++ let name = disk_name output_name i in + + (* Create the cinder volume. *) + let id = create_cinder_volume name description size in diff --git a/0017-output-Replace-in-VM-names-with-_.patch b/0017-output-Replace-in-VM-names-with-_.patch new file mode 100644 index 0000000..ef25df7 --- /dev/null +++ b/0017-output-Replace-in-VM-names-with-_.patch @@ -0,0 +1,71 @@ +From 8edb5356b40b28f26e3c7f891cf47018e67d4903 Mon Sep 17 00:00:00 2001 +From: Susant Sahani +Date: Tue, 10 Feb 2026 15:15:21 +0530 +Subject: [PATCH] output: Replace '/' in VM names with '_' + +Add Utils.sanitize_slash function which replaces '/' with '_' in VM +names, and use that in the new disk_name function. + +For example, if the VM name is "foo/bar" then the new generated name +will be "foo_bar-sda". You can use -on option to choose an output +name instead of relying on this. + +Fixes: https://issues.redhat.com/browse/RHEL-136479 +Signed-off-by: Susant Sahani +Signed-off-by: Richard W.M. Jones +(cherry picked from commit 25161d37484f6f3431446cae7eabef4054752c65) +--- + lib/utils.ml | 3 +++ + lib/utils.mli | 4 ++++ + output/output.ml | 1 + + output/output.mli | 2 +- + 4 files changed, 9 insertions(+), 1 deletion(-) + +diff --git a/lib/utils.ml b/lib/utils.ml +index 9da6737c..15af5b1a 100644 +--- a/lib/utils.ml ++++ b/lib/utils.ml +@@ -289,3 +289,6 @@ let name_from_disk disk = + if name = "" then + error (f_"invalid input filename (%s)") disk; + name ++ ++let sanitize_slash = ++ String.map (fun c -> if c = '/' then '_' else c) +diff --git a/lib/utils.mli b/lib/utils.mli +index c976a582..40bed0b9 100644 +--- a/lib/utils.mli ++++ b/lib/utils.mli +@@ -108,3 +108,7 @@ val name_from_disk : string -> string + (** Take a disk name and derive from it a suitable source name. + + Used in particular by [-i disk], [-i ova] and [-i vmx] modes. *) ++ ++val sanitize_slash : string -> string ++(** Replace '/' with '_' in guest names for filesystem paths and ++ libvirt domain names. *) +diff --git a/output/output.ml b/output/output.ml +index 919a48a4..ff4b12b1 100644 +--- a/output/output.ml ++++ b/output/output.ml +@@ -151,6 +151,7 @@ let output_to_local_file ?name + ) + + let disk_name name i = ++ let name = Utils.sanitize_slash name in + sprintf "%s-sd%s" name (drive_name i) + + let disk_path os name i = +diff --git a/output/output.mli b/output/output.mli +index d63a5d72..3f953010 100644 +--- a/output/output.mli ++++ b/output/output.mli +@@ -122,7 +122,7 @@ val output_to_local_file : ?name:string -> + depends on the NBD server releasing resources. *) + + val disk_name : string -> int -> string +-(** Return the disk name for the i'th disk, ++(** Return the sanitized disk name for the i'th disk, + eg. 0 => name-sda. *) + + val disk_path : string -> string -> int -> string diff --git a/0018-RHEL-Remove-input-from-Xen.patch b/0018-RHEL-Remove-input-from-Xen.patch deleted file mode 100644 index e36b981..0000000 --- a/0018-RHEL-Remove-input-from-Xen.patch +++ /dev/null @@ -1,543 +0,0 @@ -From ef4fb3f73251ee72eb2c2c2e1f20a4392dc8a299 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Mon, 8 Jul 2024 09:35:54 +0100 -Subject: [PATCH] RHEL: Remove input from Xen - -Originally this bug was to remove input from RHEL 5 Xen only. This -change actually removes all conversions from Xen as in RHEL 9 we only -supported RHEL 5 Xen. - -Fixes: https://issues.redhat.com/browse/RHEL-37687 ---- - docs/Makefile.am | 14 ---- - docs/virt-v2v-input-xen.pod | 154 ------------------------------------ - docs/virt-v2v.pod | 50 ++---------- - input/Makefile.am | 2 - - input/input_xen_ssh.ml | 136 ------------------------------- - input/input_xen_ssh.mli | 21 ----- - input/select_input.ml | 4 - - v2v/v2v.ml | 1 - - 8 files changed, 5 insertions(+), 377 deletions(-) - delete mode 100644 docs/virt-v2v-input-xen.pod - delete mode 100644 input/input_xen_ssh.ml - delete mode 100644 input/input_xen_ssh.mli - -diff --git a/docs/Makefile.am b/docs/Makefile.am -index 14b0b074..aa899304 100644 ---- a/docs/Makefile.am -+++ b/docs/Makefile.am -@@ -23,7 +23,6 @@ EXTRA_DIST = \ - virt-v2v-hacking.pod \ - virt-v2v-in-place.pod \ - virt-v2v-input-vmware.pod \ -- virt-v2v-input-xen.pod \ - virt-v2v-inspector.pod \ - virt-v2v-open.pod \ - virt-v2v-output-local.pod \ -@@ -45,7 +44,6 @@ man_MANS = \ - virt-v2v-hacking.1 \ - virt-v2v-in-place.1 \ - virt-v2v-input-vmware.1 \ -- virt-v2v-input-xen.1 \ - virt-v2v-inspector.1 \ - virt-v2v-open.1 \ - virt-v2v-output-local.1 \ -@@ -64,7 +62,6 @@ noinst_DATA = \ - $(top_builddir)/website/virt-v2v-hacking.1.html \ - $(top_builddir)/website/virt-v2v-in-place.1.html \ - $(top_builddir)/website/virt-v2v-input-vmware.1.html \ -- $(top_builddir)/website/virt-v2v-input-xen.1.html \ - $(top_builddir)/website/virt-v2v-inspector.1.html \ - $(top_builddir)/website/virt-v2v-open.1.html \ - $(top_builddir)/website/virt-v2v-output-local.1.html \ -@@ -125,17 +122,6 @@ stamp-virt-v2v-input-vmware.pod: virt-v2v-input-vmware.pod - $< - touch $@ - --virt-v2v-input-xen.1 $(top_builddir)/website/virt-v2v-input-xen.1.html: stamp-virt-v2v-input-xen.pod -- --stamp-virt-v2v-input-xen.pod: virt-v2v-input-xen.pod -- $(PODWRAPPER) \ -- --man virt-v2v-input-xen.1 \ -- --html $(top_builddir)/website/virt-v2v-input-xen.1.html \ -- --license GPLv2+ \ -- --warning safe \ -- $< -- touch $@ -- - virt-v2v-inspector.1 $(top_builddir)/website/virt-v2v-inspector.1.html: stamp-virt-v2v-inspector.pod - - stamp-virt-v2v-inspector.pod: virt-v2v-inspector.pod -diff --git a/docs/virt-v2v-input-xen.pod b/docs/virt-v2v-input-xen.pod -deleted file mode 100644 -index 0417e89f..00000000 ---- a/docs/virt-v2v-input-xen.pod -+++ /dev/null -@@ -1,154 +0,0 @@ --=head1 NAME -- --virt-v2v-input-xen - Using virt-v2v to convert guests from Xen -- --=head1 SYNOPSIS -- -- virt-v2v -ic 'xen+ssh://root@xen.example.com' -- -ip passwordfile -- GUEST_NAME [-o* options] -- --=head1 DESCRIPTION -- --This page documents how to use L to convert guests from --RHEL 5 Xen, or SLES and OpenSUSE Xen hosts. -- --=head1 INPUT FROM XEN -- --=head2 SSH authentication -- --You can use SSH password authentication, by supplying the name of a --file containing the password to the I<-ip> option (note this option --does I take the password directly). You may need to adjust --F on the Xen server to set --C. -- --If you are not using password authentication, an alternative is to use --ssh-agent, and add your ssh public key to --F (on the Xen host). After doing this, --you should check that passwordless access works from the virt-v2v --server to the Xen host. For example: -- -- $ ssh root@xen.example.com -- [ logs straight into the shell, no password is requested ] -- --Note that support for non-interactive authentication via the I<-ip> --option is incomplete. Some operations remain that still require the --user to enter the password manually. Therefore ssh-agent is recommended --over the I<-ip> option. See L. -- --With some modern ssh implementations, legacy crypto algorithms required --to interoperate with RHEL 5 sshd are disabled. To enable them, you may --need to add the following C stanza to your F<~/.ssh/config>: -- -- Host xen.example.com -- KexAlgorithms +diffie-hellman-group14-sha1 -- MACs +hmac-sha1 -- HostKeyAlgorithms +ssh-rsa -- PubkeyAcceptedKeyTypes +ssh-rsa -- PubkeyAcceptedAlgorithms +ssh-rsa -- --(C and C have --identical meaning; the former is the old option name, the latter is the --new one. Virt-v2v uses both C and C when converting a guest --from Xen, and on some operating systems, C and C may not --both accept the same option variant.) -- --When connecting to RHEL 5 sshd from RHEL 9, the SHA1 algorithm's use in --signatures has to be re-enabled at the OpenSSL level, in addition to the --above SSH configuration. Create a file called F<$HOME/openssl-sha1.cnf> --with the following contents: -- -- .include /etc/ssl/openssl.cnf -- [openssl_init] -- alg_section = evp_properties -- [evp_properties] -- rh-allow-sha1-signatures = yes -- --and export the following variable into the environment of the --C process: -- -- OPENSSL_CONF=$HOME/openssl-sha1.cnf -- --Note that the C environment variable will only take effect --if the libvirt client library used by virt-v2v is at least version --8.6.0. -- --=head2 Test libvirt connection to remote Xen host -- --Use the L command to list the guests on the remote Xen host: -- -- $ virsh -c xen+ssh://root@xen.example.com list --all -- Id Name State -- ---------------------------------------------------- -- 0 Domain-0 running -- - rhel49-x86_64-pv shut off -- --You should also try dumping the metadata from any guest on your --server, like this: -- -- $ virsh -c xen+ssh://root@xen.example.com dumpxml rhel49-x86_64-pv -- -- rhel49-x86_64-pv -- [...] -- -- --B. Fix your libvirt configuration or the remote server --before continuing. -- --B, then the --conversion will fail. See L --below for a workaround. -- --=head2 Importing a guest -- --To import a particular guest from a Xen server, do: -- -- $ virt-v2v -ic 'xen+ssh://root@xen.example.com' \ -- rhel49-x86_64-pv \ -- -o local -os /var/tmp -- --where C is the name of the guest (which must be shut --down). -- --In this case the output flags are set to write the converted guest to --a temporary directory as this is just an example, but you can also --write to libvirt or any other supported target. -- --=head2 Xen or ssh conversions from block devices -- --Currently virt-v2v cannot directly access a Xen guest (or any guest --located remotely over ssh) if that guest’s disks are located on host --block devices. -- --To tell if a Xen guest uses host block devices, look at the guest XML. --You will see: -- -- -- ... -- -- --where C, C and C are all --indications that the disk is located on a host block device. -- --This happens because the qemu ssh block driver that we use to access --remote disks uses the ssh sftp protocol, and this protocol cannot --correctly detect the size of host block devices. -- --The workaround is to copy the block device from the remote Xen --server to a regular local file, copy the libvirt guest XML, --adjust the C element to point to the local file, and use --C<-i libvirtxml> mode instead. -- --=head1 SEE ALSO -- --L. -- --=head1 AUTHOR -- --Richard W.M. Jones -- --=head1 COPYRIGHT -- --Copyright (C) 2009-2025 Red Hat Inc. -diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod -index 35886561..8e31fd0b 100644 ---- a/docs/virt-v2v.pod -+++ b/docs/virt-v2v.pod -@@ -12,7 +12,7 @@ virt-v2v - Convert a guest to use KVM - =head1 DESCRIPTION - - Virt-v2v converts a single guest from a foreign hypervisor to run on --KVM. It can read Linux and Windows guests running on VMware, Xen, -+KVM. It can read Linux and Windows guests running on VMware, - Hyper-V and some other hypervisors, and convert them to KVM managed by - libvirt, OpenStack, oVirt, or several other targets. It can modify - the guest to make it bootable on KVM and install virtio drivers so it -@@ -59,8 +59,6 @@ management systems, guests. - - L — Input from VMware. - --L — Input from Xen. -- - L — Output to local files or local libvirt. - - L — Output to oVirt -@@ -189,10 +187,6 @@ This is only supported for: - - =item * - --L -- --=item * -- - L - when using the SSH transport method - -@@ -304,12 +298,10 @@ hypervisor. See L. - Specify a libvirt connection URI to use when reading the guest. This - is only used when S>. - --Only local libvirt connections, VMware vCenter connections, or RHEL 5 --Xen remote connections can be used. Other remote libvirt connections --will not work in general. -+Only local libvirt connections or VMware vCenter connections. -+Other remote libvirt connections will not work in general. - --See also L, --L. -+See also L. - - =item B<-if> format - -@@ -883,7 +875,7 @@ bandwidth. Virt-v2v should be able to copy guest data at gigabit - ethernet speeds or greater. - - Ensure that the network connections between servers (conversion --server, NFS server, vCenter, Xen) are as fast and as low latency as -+server, NFS server, vCenter) are as fast and as low latency as - possible. - - =head2 Disk space -@@ -1182,38 +1174,6 @@ changes to the Windows Registry and filesystem. - - =head1 NOTES - --=head2 Xen paravirtualized guests -- --Older versions of virt-v2v could turn a Xen paravirtualized (PV) guest --into a KVM guest by installing a new kernel. This version of virt-v2v --does I attempt to install any new kernels. Instead it will give --you an error if there are I Xen PV kernels available. -- --Therefore before conversion you should check that a regular kernel is --installed. For some older Linux distributions, this means installing --a kernel from the table below: -- -- RHEL 4 i686 with > 10GB of RAM: install 'kernel-hugemem' -- i686 SMP: install 'kernel-smp' -- other i686: install 'kernel' -- x86-64 SMP with > 8 CPUs: install 'kernel-largesmp' -- x86-64 SMP: install 'kernel-smp' -- other x86-64: install 'kernel' -- -- RHEL 5 i686: install 'kernel-PAE' -- x86-64: install 'kernel' -- -- SLES 10 i586 with > 10GB of RAM: install 'kernel-bigsmp' -- i586 SMP: install 'kernel-smp' -- other i586: install 'kernel-default' -- x86-64 SMP: install 'kernel-smp' -- other x86-64: install 'kernel-default' -- -- SLES 11+ i586: install 'kernel-pae' -- x86-64: install 'kernel-default' -- -- Windows (Does not apply, as there is no Xen PV Windows kernel) -- - =head2 Enabling virtio - - "Virtio" is the name for a set of drivers which make disk (block -diff --git a/input/Makefile.am b/input/Makefile.am -index d5e77f76..98ea5223 100644 ---- a/input/Makefile.am -+++ b/input/Makefile.am -@@ -29,7 +29,6 @@ SOURCES_MLI = \ - input_vcenter_https.mli \ - input_vddk.mli \ - input_vmx.mli \ -- input_xen_ssh.mli \ - name_from_disk.mli \ - nbdkit_curl.mli \ - nbdkit_ssh.mli \ -@@ -60,7 +59,6 @@ SOURCES_ML = \ - input_vcenter_https.ml \ - input_vddk.ml \ - input_vmx.ml \ -- input_xen_ssh.ml \ - select_input.ml - - # We pretend that we're building a C library. automake handles the -diff --git a/input/input_xen_ssh.ml b/input/input_xen_ssh.ml -deleted file mode 100644 -index 45864cfe..00000000 ---- a/input/input_xen_ssh.ml -+++ /dev/null -@@ -1,136 +0,0 @@ --(* helper-v2v-input -- * Copyright (C) 2009-2025 Red Hat Inc. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- *) -- --open Printf --open Unix -- --open Std_utils --open Tools_utils --open Common_gettext.Gettext -- --open Types --open Utils -- --open Parse_libvirt_xml --open Input -- --module XenSSH = struct -- let to_string options args = -- let xs = args in -- let xs = -- match options.input_conn with -- | Some ic -> ("-ic " ^ ic) :: xs -- | None -> xs in -- let xs = "-i libvirt" :: xs in -- String.concat " " xs -- -- let query_input_options () = -- printf (f_"No input options can be used in this mode.\n") -- -- let setup dir options args = -- if options.input_options <> [] then -- error (f_"no -io (input options) are allowed here"); -- -- if not options.read_only then -- error (f_"in-place mode does not work with Xen over SSH source"); -- -- (* Get the guest name. *) -- let guest = -- match args with -- | [arg] -> arg -- | _ -> -- error (f_"-i libvirt: expecting a libvirt guest name \ -- on the command line") in -- -- (* -ic must be set. *) -- let input_conn = -- match options.input_conn with -- | Some ic -> ic -- | None -> -- error (f_"-i libvirt: expecting -ic parameter for \ -- Xen over SSH connection") in -- -- let uri = -- try Xml.parse_uri input_conn -- with Invalid_argument msg -> -- error (f_"could not parse '-ic %s'. Original error message was: %s") -- input_conn msg in -- -- (* Connect to the hypervisor. *) -- let conn = -- let auth = Libvirt_utils.auth_for_password_file -- ?password_file:options.input_password () in -- Libvirt.Connect.connect_auth ~name:input_conn auth in -- -- (* Parse the libvirt XML. *) -- let source, disks, _ = parse_libvirt_domain conn guest in -- -- let server = -- match uri.Xml.uri_server with -- | Some server -> server -- | None -> -- error (f_"‘-ic %s’ URL does not contain a host name field") -- input_conn in -- -- let port = -- match uri.uri_port with -- | 0 | 22 -> None -- | i -> Some (string_of_int i) in -- -- let user = uri.uri_user in -- -- let password = -- match options.input_password with -- | None -> None -- | Some ip -> Some (Nbdkit_ssh.PasswordFile ip) in -- -- (* Create an nbdkit instance for each disk. *) -- let uris = -- List.mapi ( -- fun i { d_format = format; d_type } -> -- let socket = sprintf "%s/in%d" dir i in -- On_exit.unlink socket; -- -- (match d_type with -- | NBD _ | HTTP _ -> (* These should never happen? *) -- assert false -- -- | BlockDev _ -> -- (* Conversion from a remote block device over SSH isn't -- * supported because OpenSSH sftp server doesn't know how -- * to get the size of a block device. Therefore we disallow -- * this and refer users to the manual. -- *) -- error (f_"input from xen over ssh does not support disks stored \ -- on remote block devices. See virt-v2v-input-xen(1) \ -- section \"Xen or ssh conversions from block devices\".") -- -- | LocalFile path -> -- let cor = dir // "convert" in -- let bandwidth = options.bandwidth in -- let nbdkit = Nbdkit_ssh.create_ssh ?bandwidth ~cor ?password -- ?port ~server ?user path in -- let _, pid = Nbdkit.run_unix socket nbdkit in -- On_exit.kill pid -- ); -- -- NBD_URI.Unix (socket, None) -- ) disks in -- -- source, uris --end -diff --git a/input/input_xen_ssh.mli b/input/input_xen_ssh.mli -deleted file mode 100644 -index 339309b8..00000000 ---- a/input/input_xen_ssh.mli -+++ /dev/null -@@ -1,21 +0,0 @@ --(* virt-v2v -- * Copyright (C) 2009-2025 Red Hat Inc. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- *) -- --(** Input from Xen over SSH *) -- --module XenSSH : Input.INPUT -diff --git a/input/select_input.ml b/input/select_input.ml -index a5eb1433..bbf0180f 100644 ---- a/input/select_input.ml -+++ b/input/select_input.ml -@@ -90,10 +90,6 @@ let select_input ?(allow_remote = true) input_mode input_conn input_transport = - | Some server, Some ("esx"|"gsx"|"vpx"), Some Input.VDDK, true -> - (module Input_vddk.VDDK) - -- (* Xen over SSH *) -- | Some server, Some "xen+ssh", _, true -> -- (module Input_xen_ssh.XenSSH) -- - (* Old virt-v2v also supported qemu+ssh://. However I am - * deliberately not supporting this in new virt-v2v. Don't - * use virt-v2v if a guest already runs on KVM. -diff --git a/v2v/v2v.ml b/v2v/v2v.ml -index c780ab1d..1811f9e6 100644 ---- a/v2v/v2v.ml -+++ b/v2v/v2v.ml -@@ -335,7 +335,6 @@ read the man page virt-v2v(1). - pr "virt-v2v-2.0\n"; - pr "libguestfs-rewrite\n"; - pr "vcenter-https\n"; -- pr "xen-ssh\n"; - pr "vddk\n"; - pr "colours-option\n"; - pr "vdsm-compat-option\n"; diff --git a/0018-output-sanitize-guest-names-in-metadata-file-paths.patch b/0018-output-sanitize-guest-names-in-metadata-file-paths.patch new file mode 100644 index 0000000..8108b88 --- /dev/null +++ b/0018-output-sanitize-guest-names-in-metadata-file-paths.patch @@ -0,0 +1,55 @@ +From b0e084027f528bbc42bd4c5a19c6ec441518044a Mon Sep 17 00:00:00 2001 +From: Susant Sahani +Date: Tue, 10 Feb 2026 15:15:27 +0530 +Subject: [PATCH] output: sanitize guest names in metadata file paths + +Use sanitize_slash for metadata filenames to avoid '/' in paths. + +Fixes: https://issues.redhat.com/browse/RHEL-136479 +Signed-off-by: Susant Sahani +(cherry picked from commit e02563cfcb0022cdd3a044c6a8e459eeb2c5abf6) +--- + output/output_disk.ml | 2 +- + output/output_kubevirt.ml | 2 +- + output/output_qemu.ml | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/output/output_disk.ml b/output/output_disk.ml +index af0a3fac..dc43d637 100644 +--- a/output/output_disk.ml ++++ b/output/output_disk.ml +@@ -105,7 +105,7 @@ module Disk = struct + (disk_path output_storage output_name) + output_format output_name in + +- let file = output_storage // output_name ^ ".xml" in ++ let file = output_storage // (sanitize_slash output_name) ^ ".xml" in + with_open_out file (fun chan -> DOM.doc_to_chan chan doc); + + if verbose () then ( +diff --git a/output/output_kubevirt.ml b/output/output_kubevirt.ml +index 8a5ab56d..8b011436 100644 +--- a/output/output_kubevirt.ml ++++ b/output/output_kubevirt.ml +@@ -146,7 +146,7 @@ module Kubevirt = struct + let doc = create_kubevirt_yaml source inspect target_meta disk_path + output_format output_name in + +- let file = output_storage // output_name ^ ".yaml" in ++ let file = output_storage // (sanitize_slash output_name) ^ ".yaml" in + with_open_out file (fun chan -> YAML.doc_to_chan chan doc); + + if verbose () then ( +diff --git a/output/output_qemu.ml b/output/output_qemu.ml +index 63299423..b9090d86 100644 +--- a/output/output_qemu.ml ++++ b/output/output_qemu.ml +@@ -111,7 +111,7 @@ module QEMU = struct + (* Start the shell script. Write it to a temporary file + * which we rename at the end. + *) +- let file = output_storage // output_name ^ ".sh" in ++ let file = output_storage // (sanitize_slash output_name) ^ ".sh" in + let tmpfile = file ^ ".tmp" in + On_exit.unlink tmpfile; + diff --git a/0019-RHEL-Remove-o-glance.patch b/0019-RHEL-Remove-o-glance.patch deleted file mode 100644 index f6f1815..0000000 --- a/0019-RHEL-Remove-o-glance.patch +++ /dev/null @@ -1,239 +0,0 @@ -From 5c5d4163dfa7cbdd10450d677a85aeaf87e1a14b Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Wed, 30 Jun 2021 11:15:52 +0100 -Subject: [PATCH] RHEL: Remove -o glance - -Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1977539 ---- - docs/virt-v2v-output-openstack.pod | 54 ++---------------------------- - docs/virt-v2v.pod | 20 ----------- - output/output_glance.mli | 2 +- - output/select_output.ml | 5 --- - output/select_output.mli | 1 - - tests/test-o-glance.sh | 3 ++ - v2v/v2v.ml | 2 -- - 7 files changed, 6 insertions(+), 81 deletions(-) - -diff --git a/docs/virt-v2v-output-openstack.pod b/docs/virt-v2v-output-openstack.pod -index 9bef76ea..04595816 100644 ---- a/docs/virt-v2v-output-openstack.pod -+++ b/docs/virt-v2v-output-openstack.pod -@@ -10,13 +10,10 @@ virt-v2v-output-openstack - Using virt-v2v to convert guests to OpenStack - [-oo verify-server-certificate=false] - [-oo os-username=admin] [-oo os-*=*] - -- virt-v2v [-i* options] -o glance -- - =head1 DESCRIPTION - - This page documents how to use L to convert guests to run --on OpenStack. There are two output modes you can select, but only --I<-o openstack> should be used normally. -+on OpenStack. - - =over 4 - -@@ -27,15 +24,6 @@ Full description: L - This is the modern method for uploading to OpenStack via the REST API. - Guests can be directly converted into Cinder volumes. - --=item B<-o glance> -- --Full description: L -- --This is the old method for uploading to Glance. Unfortunately Glance --is not well suited to storing converted guests (since virt-v2v deals --with "pets" not templated "cattle"), so this method is not recommended --unless you really know what you are doing. -- - =back - - =head1 OUTPUT TO OPENSTACK -@@ -176,48 +164,10 @@ no Cinder volume type is used. - The following options are B supported with OpenStack: I<-oa>, - I<-of>. - --=head1 OUTPUT TO GLANCE -- --Note this is a legacy option. In most cases you should use --L instead. -- --To output to OpenStack Glance, use the I<-o glance> option. -- --This runs the L CLI program which must be installed on the --virt-v2v conversion host. For authentication to work, you will need --to set C environment variables. See --L above. -- --Virt-v2v adds metadata for the guest to Glance, describing such things --as the guest operating system and what drivers it requires. The --command C will display the metadata as "Property" --fields such as C and C. -- --=head2 Glance and sparseness -- --Glance image upload doesn't appear to correctly handle sparseness. --For this reason, using qcow2 will be faster and use less space on the --Glance server. Use the virt-v2v S> option. -- --=head2 Glance and multiple disks -- --If the guest has a single disk, then the name of the disk in Glance --will be the name of the guest. You can control this using the I<-on> --option. -- --Glance doesn't have a concept of associating multiple disks with a --single guest, and Nova doesn't allow you to boot a guest from multiple --Glance disks either. If the guest has multiple disks, then the first --(assumed to be the system disk) will have the name of the guest, and --the second and subsequent data disks will be called --C-disk2>, C-disk3> etc. It may be best to --leave the system disk in Glance, and import the data disks to Cinder. -- - =head1 SEE ALSO - - L, --L, --L. -+L. - - =head1 AUTHOR - -diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod -index 8e31fd0b..fde60a8c 100644 ---- a/docs/virt-v2v.pod -+++ b/docs/virt-v2v.pod -@@ -439,14 +439,6 @@ See L below. - - This is the same as I<-o local>. - --=item B<-o> B -- --This is a legacy option. You should probably use I<-o openstack> --instead. -- --Set the output method to OpenStack Glance. In this mode the converted --guest is uploaded to Glance. See L. -- - =item B<-o> B - - Set the output method to I. B (or F). - --=item I<-o glance> -- --This temporarily places a full copy of the output disks in --C<$VIRT_V2V_TMPDIR> (or F). -- - =item I<-o local> - - =item I<-o qemu> -@@ -1053,13 +1040,6 @@ See also L. - Because of how Cinder volumes are presented as F block devices, - using I<-o openstack> normally requires that virt-v2v is run as root. - --=item Writing to Glance -- --This does I need root (in fact it probably won’t work), but may --require either a special user and/or for you to source a script that --sets authentication environment variables. Consult the Glance --documentation. -- - =item Writing to block devices - - This normally requires root. See the next section. -diff --git a/output/output_glance.mli b/output/output_glance.mli -index 83d67576..7ab1503c 100644 ---- a/output/output_glance.mli -+++ b/output/output_glance.mli -@@ -18,4 +18,4 @@ - - (** [-o glance] output mode. *) - --module Glance : Output.OUTPUT -+(*module Glance : Output.OUTPUT*) -diff --git a/output/select_output.ml b/output/select_output.ml -index ab4bfe4d..b1f7d0ab 100644 ---- a/output/select_output.ml -+++ b/output/select_output.ml -@@ -21,7 +21,6 @@ open Common_gettext.Gettext - - type output_mode = - | Disk -- | Glance - | Kubevirt - | Libvirt - | Null -@@ -33,7 +32,6 @@ type output_mode = - - let output_modes = [ - Disk; -- Glance; - Kubevirt; - Libvirt; - Null; -@@ -46,7 +44,6 @@ let output_modes = [ - - let string_of_output_mode = function - | Disk -> "disk" -- | Glance -> "glance" - | Kubevirt -> "kubevirt" - | Libvirt -> "libvirt" - | Null -> "null" -@@ -57,7 +54,6 @@ let string_of_output_mode = function - | VDSM -> "vdsm" - - let output_mode_of_string = function -- | "glance" -> Glance - | "kubevirt" -> Kubevirt - | "libvirt" -> Libvirt - | "disk" | "local" -> Disk -@@ -75,7 +71,6 @@ let select_output = function - | Some Disk -> (module Output_disk.Disk) - | Some Null -> (module Output_null.Null) - | Some QEmu -> (module Output_qemu.QEMU) -- | Some Glance -> (module Output_glance.Glance) - | Some Kubevirt -> (module Output_kubevirt.Kubevirt) - | Some Openstack -> (module Output_openstack.Openstack) - | Some OVirt_Upload -> (module Output_ovirt_upload.OVirtUpload) -diff --git a/output/select_output.mli b/output/select_output.mli -index a509a1db..093c9b9a 100644 ---- a/output/select_output.mli -+++ b/output/select_output.mli -@@ -18,7 +18,6 @@ - - type output_mode = - | Disk -- | Glance - | Kubevirt - | Libvirt - | Null -diff --git a/tests/test-o-glance.sh b/tests/test-o-glance.sh -index 9e32d2bf..632579ee 100755 ---- a/tests/test-o-glance.sh -+++ b/tests/test-o-glance.sh -@@ -20,6 +20,9 @@ - - set -e - -+# Feature is disabled in RHEL 9. -+exit 77 -+ - source ./functions.sh - set -e - set -x -diff --git a/v2v/v2v.ml b/v2v/v2v.ml -index 1811f9e6..5d3a9dbb 100644 ---- a/v2v/v2v.ml -+++ b/v2v/v2v.ml -@@ -267,8 +267,6 @@ virt-v2v -i libvirtxml guest-domain.xml -o local -os /var/tmp - - virt-v2v -i disk disk.img -o local -os /var/tmp - --virt-v2v -i disk disk.img -o glance -- - There is a companion front-end called \"virt-p2v\" which comes as an - ISO or CD image that can be booted on physical machines. - diff --git a/0019-output-sanitize-VM-names-in-libvirt-XML.patch b/0019-output-sanitize-VM-names-in-libvirt-XML.patch new file mode 100644 index 0000000..7a340cb --- /dev/null +++ b/0019-output-sanitize-VM-names-in-libvirt-XML.patch @@ -0,0 +1,27 @@ +From 3f5a9ac841adc8996a74e32659aed4c3fc831c6c Mon Sep 17 00:00:00 2001 +From: Susant Sahani +Date: Tue, 10 Feb 2026 15:15:31 +0530 +Subject: [PATCH] output: sanitize VM names in libvirt XML + +Prevent domain creation failures when VM names contain '/' characters. + +Fixes: https://issues.redhat.com/browse/RHEL-136479 +Signed-off-by: Susant Sahani +(cherry picked from commit 1e68923593a7121943f09e67a6b78b902bfeeceb) +--- + output/create_libvirt_xml.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/output/create_libvirt_xml.ml b/output/create_libvirt_xml.ml +index e4199efe..7471ee5a 100644 +--- a/output/create_libvirt_xml.ml ++++ b/output/create_libvirt_xml.ml +@@ -51,7 +51,7 @@ let create_libvirt_xml ?pool source inspect + + List.push_back_list body [ + Comment generated_by; +- e "name" [] [PCData output_name]; ++ e "name" [] [PCData (Utils.sanitize_slash output_name)]; + ]; + + (match source.s_genid with diff --git a/0012-RHEL-Fixes-for-libguestfs-winsupport.patch b/0020-RHEL-Fixes-for-libguestfs-winsupport.patch similarity index 82% rename from 0012-RHEL-Fixes-for-libguestfs-winsupport.patch rename to 0020-RHEL-Fixes-for-libguestfs-winsupport.patch index 39aee3b..71e3e07 100644 --- a/0012-RHEL-Fixes-for-libguestfs-winsupport.patch +++ b/0020-RHEL-Fixes-for-libguestfs-winsupport.patch @@ -1,4 +1,4 @@ -From 2cdab0acc99796d9e885697c6d9e50255bb3956b Mon Sep 17 00:00:00 2001 +From 5bb9b83c288b0c4bdac081e123f2fa54c840a6ca Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Sun, 30 Aug 2015 03:21:57 -0400 Subject: [PATCH] RHEL: Fixes for libguestfs-winsupport. @@ -19,22 +19,22 @@ https://bugzilla.redhat.com/show_bug.cgi?id=2187961#c1 7 files changed, 40 insertions(+), 5 deletions(-) diff --git a/convert/convert.ml b/convert/convert.ml -index ff82ad54..45d48a95 100644 +index e3fd41b8..eb51e9b9 100644 --- a/convert/convert.ml +++ b/convert/convert.ml -@@ -53,6 +53,7 @@ let rec convert input_disks options source = +@@ -55,6 +55,7 @@ let rec convert input_disks options source = message (f_"Opening the source"); let g = open_guestfs ~identifier:"v2v" () in + g#set_program "virt-v2v"; - g#set_memsize (g#get_memsize () * 2); - (* Setting the number of vCPUs allows parallel mkinitrd, but make - * sure this is not too large because each vCPU consumes guest RAM. + let memsize = + match options.memsize with + | None -> diff --git a/test-data/phony-guests/make-windows-img.sh b/test-data/phony-guests/make-windows-img.sh -index b52d2522..8d036ee6 100755 +index 5b3f7912..137bae2f 100755 --- a/test-data/phony-guests/make-windows-img.sh +++ b/test-data/phony-guests/make-windows-img.sh -@@ -49,6 +49,7 @@ fi +@@ -78,6 +78,7 @@ fi # Create a disk image. guestfish < "$script" :> "$expected" @@ -76,7 +76,7 @@ index e66d2647..38d05de5 100755 firstboot_dir="/Program Files/Guestfs/Firstboot" mktest "is-dir \"$firstboot_dir\"" true mktest "is-file \"$firstboot_dir/firstboot.bat\"" true -@@ -101,7 +107,7 @@ for drv in netkvm vioscsi viostor; do +@@ -100,7 +106,7 @@ for drv in netkvm vioscsi viostor; do done done @@ -86,10 +86,10 @@ index e66d2647..38d05de5 100755 # Test the base image remained untouched diff --git a/tests/test-virtio-win-iso.sh b/tests/test-virtio-win-iso.sh -index ccc42550..cd92db92 100755 +index 1ee343fd..0216a39b 100755 --- a/tests/test-virtio-win-iso.sh +++ b/tests/test-virtio-win-iso.sh -@@ -82,6 +82,12 @@ mktest () +@@ -80,6 +80,12 @@ mktest () :> "$script" :> "$expected" @@ -102,7 +102,7 @@ index ccc42550..cd92db92 100755 firstboot_dir="/Program Files/Guestfs/Firstboot" mktest "is-dir \"$firstboot_dir\"" true mktest "is-file \"$firstboot_dir/firstboot.bat\"" true -@@ -94,5 +100,5 @@ for drv in netkvm vioscsi viostor; do +@@ -92,5 +98,5 @@ for drv in netkvm vioscsi viostor; do done done @@ -110,10 +110,10 @@ index ccc42550..cd92db92 100755 +guestfish --ro -a "$d/windows-sda" < "$script" > "$response" diff -u "$expected" "$response" diff --git a/tests/test-windows-conversion.sh b/tests/test-windows-conversion.sh -index bfe04904..eeddcb86 100755 +index db688ddf..74f28bbb 100755 --- a/tests/test-windows-conversion.sh +++ b/tests/test-windows-conversion.sh -@@ -76,6 +76,12 @@ mktest () +@@ -74,6 +74,12 @@ mktest () :> "$script" :> "$expected" @@ -126,7 +126,7 @@ index bfe04904..eeddcb86 100755 firstboot_dir="/Program Files/Guestfs/Firstboot" mktest "is-dir \"$firstboot_dir\"" true mktest "is-file \"$firstboot_dir/firstboot.bat\"" true -@@ -83,7 +89,7 @@ mktest "is-dir \"$firstboot_dir/scripts\"" true +@@ -81,7 +87,7 @@ mktest "is-dir \"$firstboot_dir/scripts\"" true virtio_dir="/Windows/Drivers/VirtIO" mktest "ls \"$virtio_dir\"" "$(cat test-windows-conversion-ls.txt)" @@ -136,10 +136,10 @@ index bfe04904..eeddcb86 100755 # We also update the Registry several times, for firstboot, and (ONLY diff --git a/tests/test-windows-phony.sh b/tests/test-windows-phony.sh -index fa5f6a17..3f5dfe5e 100755 +index 22c0fb9e..96420ff9 100755 --- a/tests/test-windows-phony.sh +++ b/tests/test-windows-phony.sh -@@ -71,6 +71,17 @@ mktest () +@@ -69,6 +69,17 @@ mktest () :> "$script" :> "$expected" @@ -157,7 +157,7 @@ index fa5f6a17..3f5dfe5e 100755 firstboot_dir="/Program Files/Guestfs/Firstboot" mktest "is-dir \"$firstboot_dir\"" true mktest "is-file \"$firstboot_dir/firstboot.bat\"" true -@@ -80,7 +91,7 @@ mktest "ls \"$virtio_dir\"" "$(cat test-phony-$guestname-ls.txt)" +@@ -78,7 +89,7 @@ mktest "ls \"$virtio_dir\"" "$(cat test-phony-$guestname-ls.txt)" osinfo_name="${guestname%-32}" mktest "inspect-get-osinfo /dev/sda2" "$osinfo_name" diff --git a/0021-RHEL-Remove-block-driver-option.patch b/0021-RHEL-Remove-block-driver-option.patch deleted file mode 100644 index 08bc1c9..0000000 --- a/0021-RHEL-Remove-block-driver-option.patch +++ /dev/null @@ -1,157 +0,0 @@ -From 0c2aebab2d1c3cf7a02c16dd6a5af4ae55a69995 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Fri, 28 Apr 2023 12:28:19 +0100 -Subject: [PATCH] RHEL: Remove --block-driver option - -Go back to the old default of always installing virtio-blk drivers in -Windows guests. - -Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2190387 ---- - docs/virt-v2v-in-place.pod | 10 ---------- - docs/virt-v2v.pod | 10 ---------- - in-place/in_place.ml | 11 +---------- - tests/Makefile.am | 1 - - v2v/v2v.ml | 11 +---------- - 5 files changed, 2 insertions(+), 41 deletions(-) - -diff --git a/docs/virt-v2v-in-place.pod b/docs/virt-v2v-in-place.pod -index 6c02a99c..3d0d1b28 100644 ---- a/docs/virt-v2v-in-place.pod -+++ b/docs/virt-v2v-in-place.pod -@@ -72,16 +72,6 @@ Display help. - - See I<--network> below. - --=item B<--block-driver> B -- --=item B<--block-driver> B -- --When choosing a block driver for Windows guests, prefer C or --C. The default is C. -- --Note this has no effect for Linux guests at the moment. That may be --added in future. -- - =item B<--colors> - - =item B<--colours> -diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod -index fde60a8c..0e68de10 100644 ---- a/docs/virt-v2v.pod -+++ b/docs/virt-v2v.pod -@@ -212,16 +212,6 @@ The options are silently ignored for other input methods. - - See I<--network> below. - --=item B<--block-driver> B -- --=item B<--block-driver> B -- --When choosing a block driver for Windows guests, prefer C or --C. The default is C. -- --Note this has no effect for Linux guests at the moment. That may be --added in future. -- - =item B<--colors> - - =item B<--colours> -diff --git a/in-place/in_place.ml b/in-place/in_place.ml -index 604a662d..a91ee39d 100644 ---- a/in-place/in_place.ml -+++ b/in-place/in_place.ml -@@ -49,7 +49,6 @@ let rec main () = - - let bandwidth = ref None in - let bandwidth_file = ref None in -- let block_driver = ref None in - let input_conn = ref None in - let input_format = ref None in - let input_password = ref None in -@@ -162,8 +161,6 @@ let rec main () = - let argspec = [ - [ S 'b'; L"bridge" ], Getopt.String ("in:out", add_bridge), - s_"Map bridge ‘in’ to ‘out’"; -- [ L"block-driver" ], Getopt.String ("driver", set_string_option_once "--block-driver" block_driver), -- s_"Prefer 'virtio-blk' or 'virtio-scsi'"; - [ S 'i' ], Getopt.String (input_modes, set_input_mode), - s_"Set input mode (default: libvirt)"; - [ M"ic" ], Getopt.String ("uri", set_string_option_once "-ic" input_conn), -@@ -230,12 +227,6 @@ read the man page virt-v2v-in-place(1). - - (* Dereference the arguments. *) - let args = List.rev !args in -- let block_driver = -- match !block_driver with -- | None | Some "virtio-blk" -> Virtio_blk -- | Some "virtio-scsi" -> Virtio_SCSI -- | Some driver -> -- error (f_"unknown block driver ‘--block-driver %s’") driver in - let customize_ops = get_customize_ops () in - let input_conn = !input_conn in - let input_mode = !input_mode in -@@ -298,7 +289,7 @@ read the man page virt-v2v-in-place(1). - - (* Get the conversion options. *) - let conv_options = { -- Convert.block_driver = block_driver; -+ Convert.block_driver = Virtio_blk; - keep_serial_console = true; - ks = opthandle.ks; - network_map; -diff --git a/tests/Makefile.am b/tests/Makefile.am -index f9c748ed..c0aa8498 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -57,7 +57,6 @@ TESTS_ENVIRONMENT = $(top_builddir)/run --test - - TESTS = \ - test-bad-networks-and-bridges.sh \ -- test-block-driver.sh \ - test-cdrom.sh \ - test-checksum-bad.sh \ - test-checksum-good-qcow2.sh \ -diff --git a/v2v/v2v.ml b/v2v/v2v.ml -index 5d3a9dbb..2e8071db 100644 ---- a/v2v/v2v.ml -+++ b/v2v/v2v.ml -@@ -48,7 +48,6 @@ let rec main () = - - let bandwidth = ref None in - let bandwidth_file = ref None in -- let block_driver = ref None in - let input_conn = ref None in - let input_format = ref None in - let input_password = ref None in -@@ -201,8 +200,6 @@ let rec main () = - s_"Set bandwidth dynamically from file"; - [ S 'b'; L"bridge" ], Getopt.String ("in:out", add_bridge), - s_"Map bridge ‘in’ to ‘out’"; -- [ L"block-driver" ], Getopt.String ("driver", set_string_option_once "--block-driver" block_driver), -- s_"Prefer 'virtio-blk' or 'virtio-scsi'"; - [ S 'i' ], Getopt.String (input_modes, set_input_mode), - s_"Set input mode (default: libvirt)"; - [ M"ic" ], Getopt.String ("uri", set_string_option_once "-ic" input_conn), -@@ -295,12 +292,6 @@ read the man page virt-v2v(1). - - (* Dereference the arguments. *) - let args = List.rev !args in -- let block_driver = -- match !block_driver with -- | None | Some "virtio-blk" -> Virtio_blk -- | Some "virtio-scsi" -> Virtio_SCSI -- | Some driver -> -- error (f_"unknown block driver ‘--block-driver %s’") driver in - let customize_ops = get_customize_ops () in - let input_conn = !input_conn in - let input_mode = !input_mode in -@@ -413,7 +404,7 @@ read the man page virt-v2v(1). - - (* Get the conversion options. *) - let conv_options = { -- Convert.block_driver = block_driver; -+ Convert.block_driver = Virtio_blk; - keep_serial_console = not remove_serial_console; - ks = opthandle.ks; - network_map; diff --git a/0013-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch b/0021-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch similarity index 87% rename from 0013-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch rename to 0021-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch index 4442811..8bf91a6 100644 --- a/0013-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch +++ b/0021-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch @@ -1,4 +1,4 @@ -From de879aad4bd0d17e884d571da3348965a9d02756 Mon Sep 17 00:00:00 2001 +From 38516e4b16f2148db9d16c352e4bec6c9235e52a Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Sun, 28 Sep 2014 19:14:43 +0100 Subject: [PATCH] RHEL: v2v: Select correct qemu binary for -o qemu mode @@ -16,10 +16,10 @@ support cases. 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/output/output_qemu.ml b/output/output_qemu.ml -index 47a6f4ff..909b6e10 100644 +index b9090d86..b17ac518 100644 --- a/output/output_qemu.ml +++ b/output/output_qemu.ml -@@ -164,7 +164,7 @@ module QEMU = struct +@@ -165,7 +165,7 @@ module QEMU = struct * module deals with shell and qemu comma quoting. *) let cmd = Qemuopts.create () in diff --git a/0022-RHEL-Remove-o-ovirt-o-ovirt-upload-and-o-vdsm-modes.patch b/0022-RHEL-Remove-o-ovirt-o-ovirt-upload-and-o-vdsm-modes.patch deleted file mode 100644 index a87f086..0000000 --- a/0022-RHEL-Remove-o-ovirt-o-ovirt-upload-and-o-vdsm-modes.patch +++ /dev/null @@ -1,4712 +0,0 @@ -From 089fcc5c95211ba3100a622326cba2da859141ce Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Mon, 8 Jul 2024 09:56:54 +0100 -Subject: [PATCH] RHEL: Remove -o ovirt, -o ovirt-upload and -o vdsm modes - -Fixes: https://issues.redhat.com/browse/RHEL-36712 ---- - docs/Makefile.am | 14 - - docs/virt-v2v-output-ovirt.pod | 231 -------- - docs/virt-v2v.pod | 201 +------ - output/Makefile.am | 43 +- - output/output_ovirt.ml | 319 ----------- - output/output_ovirt.mli | 21 - - output/output_ovirt_upload.ml | 514 ----------------- - output/output_ovirt_upload.mli | 21 - - output/output_ovirt_upload_cancel_source.mli | 19 - - .../output_ovirt_upload_createvm_source.mli | 19 - - .../output_ovirt_upload_finalize_source.mli | 19 - - output/output_ovirt_upload_plugin_source.mli | 19 - - .../output_ovirt_upload_precheck_source.mli | 19 - - .../output_ovirt_upload_transfer_source.mli | 19 - - output/output_ovirt_upload_vmcheck_source.mli | 19 - - output/output_vdsm.ml | 239 -------- - output/output_vdsm.mli | 21 - - output/ovirt-upload-cancel.py | 96 ---- - output/ovirt-upload-createvm.py | 137 ----- - output/ovirt-upload-finalize.py | 174 ------ - output/ovirt-upload-plugin.py | 525 ------------------ - output/ovirt-upload-precheck.py | 135 ----- - output/ovirt-upload-transfer.py | 298 ---------- - output/ovirt-upload-vmcheck.py | 72 --- - output/select_output.ml | 16 - - output/select_output.mli | 3 - - tests/Makefile.am | 15 - - tests/test-o-ovirt-upload-module/imageio.py | 71 --- - .../ovirtsdk4/__init__.py | 150 ----- - .../ovirtsdk4/types.py | 184 ------ - tests/test-o-ovirt-upload-oo-query.sh | 41 -- - tests/test-o-ovirt-upload.sh | 74 --- - tests/test-o-ovirt.ovf.expected | 113 ---- - tests/test-o-ovirt.sh | 87 --- - tests/test-o-vdsm-oo-query.sh | 41 -- - tests/test-o-vdsm-options.ovf.expected | 113 ---- - tests/test-o-vdsm-options.sh | 96 ---- - v2v/v2v.ml | 5 - - 38 files changed, 4 insertions(+), 4199 deletions(-) - delete mode 100644 docs/virt-v2v-output-ovirt.pod - delete mode 100644 output/output_ovirt.ml - delete mode 100644 output/output_ovirt.mli - delete mode 100644 output/output_ovirt_upload.ml - delete mode 100644 output/output_ovirt_upload.mli - delete mode 100644 output/output_ovirt_upload_cancel_source.mli - delete mode 100644 output/output_ovirt_upload_createvm_source.mli - delete mode 100644 output/output_ovirt_upload_finalize_source.mli - delete mode 100644 output/output_ovirt_upload_plugin_source.mli - delete mode 100644 output/output_ovirt_upload_precheck_source.mli - delete mode 100644 output/output_ovirt_upload_transfer_source.mli - delete mode 100644 output/output_ovirt_upload_vmcheck_source.mli - delete mode 100644 output/output_vdsm.ml - delete mode 100644 output/output_vdsm.mli - delete mode 100644 output/ovirt-upload-cancel.py - delete mode 100644 output/ovirt-upload-createvm.py - delete mode 100644 output/ovirt-upload-finalize.py - delete mode 100644 output/ovirt-upload-plugin.py - delete mode 100644 output/ovirt-upload-precheck.py - delete mode 100644 output/ovirt-upload-transfer.py - delete mode 100644 output/ovirt-upload-vmcheck.py - delete mode 100755 tests/test-o-ovirt-upload-module/imageio.py - delete mode 100644 tests/test-o-ovirt-upload-module/ovirtsdk4/__init__.py - delete mode 100644 tests/test-o-ovirt-upload-module/ovirtsdk4/types.py - delete mode 100755 tests/test-o-ovirt-upload-oo-query.sh - delete mode 100755 tests/test-o-ovirt-upload.sh - delete mode 100644 tests/test-o-ovirt.ovf.expected - delete mode 100755 tests/test-o-ovirt.sh - delete mode 100755 tests/test-o-vdsm-oo-query.sh - delete mode 100644 tests/test-o-vdsm-options.ovf.expected - delete mode 100755 tests/test-o-vdsm-options.sh - -diff --git a/docs/Makefile.am b/docs/Makefile.am -index aa899304..9639b352 100644 ---- a/docs/Makefile.am -+++ b/docs/Makefile.am -@@ -27,7 +27,6 @@ EXTRA_DIST = \ - virt-v2v-open.pod \ - virt-v2v-output-local.pod \ - virt-v2v-output-openstack.pod \ -- virt-v2v-output-ovirt.pod \ - virt-v2v-release-notes-1.42.pod \ - virt-v2v-release-notes-2.0.pod \ - virt-v2v-release-notes-2.2.pod \ -@@ -48,7 +47,6 @@ man_MANS = \ - virt-v2v-open.1 \ - virt-v2v-output-local.1 \ - virt-v2v-output-openstack.1 \ -- virt-v2v-output-ovirt.1 \ - virt-v2v-release-notes-1.42.1 \ - virt-v2v-release-notes-2.0.1 \ - virt-v2v-release-notes-2.2.1 \ -@@ -66,7 +64,6 @@ noinst_DATA = \ - $(top_builddir)/website/virt-v2v-open.1.html \ - $(top_builddir)/website/virt-v2v-output-local.1.html \ - $(top_builddir)/website/virt-v2v-output-openstack.1.html \ -- $(top_builddir)/website/virt-v2v-output-ovirt.1.html \ - $(top_builddir)/website/virt-v2v-release-notes-1.42.1.html \ - $(top_builddir)/website/virt-v2v-release-notes-2.0.1.html \ - $(top_builddir)/website/virt-v2v-release-notes-2.2.1.html \ -@@ -168,17 +165,6 @@ stamp-virt-v2v-output-openstack.pod: virt-v2v-output-openstack.pod - $< - touch $@ - --virt-v2v-output-ovirt.1 $(top_builddir)/website/virt-v2v-output-ovirt.1.html: stamp-virt-v2v-output-ovirt.pod -- --stamp-virt-v2v-output-ovirt.pod: virt-v2v-output-ovirt.pod -- $(PODWRAPPER) \ -- --man virt-v2v-output-ovirt.1 \ -- --html $(top_builddir)/website/virt-v2v-output-ovirt.1.html \ -- --license GPLv2+ \ -- --warning safe \ -- $< -- touch $@ -- - virt-v2v-release-notes-1.42.1 $(top_builddir)/website/virt-v2v-release-notes-1.42.1.html: stamp-virt-v2v-release-notes-1.42.pod - - stamp-virt-v2v-release-notes-1.42.pod: virt-v2v-release-notes-1.42.pod -diff --git a/docs/virt-v2v-output-ovirt.pod b/docs/virt-v2v-output-ovirt.pod -deleted file mode 100644 -index 6ba04ad0..00000000 ---- a/docs/virt-v2v-output-ovirt.pod -+++ /dev/null -@@ -1,231 +0,0 @@ --=head1 NAME -- --virt-v2v-output-ovirt - Using virt-v2v to convert guests to oVirt -- --=head1 SYNOPSIS -- -- virt-v2v [-i* options] -o ovirt-upload [-oc ENGINE_URL] -os STORAGE -- [-op PASSWORD] [-of raw] -- [-oo ovirt-cafile=FILE] -- [-oo ovirt-cluster=CLUSTER] -- [-oo ovirt-proxy] -- [-oo ovirt-disk-uuid=UUID ...] -- [-oo ovirt-verifypeer] -- -- virt-v2v [-i* options] -o ovirt -os [esd:/path|/path] -- -- virt-v2v [-i* options] -o vdsm -- [-oo vdsm-image-uuid=UUID] -- [-oo vdsm-vol-uuid=UUID] -- [-oo vdsm-vm-uuid=UUID] -- [-oo vdsm-ovf-output=DIR] -- --=head1 DESCRIPTION -- --This page documents how to use L to convert guests to an --oVirt management instance. There are three output modes that you can --select, but only I<-o ovirt-upload> should be used normally, the other --two are deprecated: -- --=over 4 -- --=item B<-o ovirt-upload> B<-os> STORAGE -- --Full description: L -- --This is the modern method for uploading to oVirt via the REST API. It --requires oVirt E 4.2. -- --=item B<-o ovirt> B<-os> esd:/path -- --=item B<-o ovirt> B<-os> /path -- --Full description: L -- --This is the old method for uploading to oVirt via the Export Storage --Domain (ESD). The ESD can either be accessed over NFS (using the --I<-os esd:/path> form) or if you have already NFS-mounted it somewhere --specify the path to the mountpoint as I<-os /path>. -- --The Export Storage Domain was deprecated in oVirt 4, and so we expect --that this method will stop working at some point in the future. -- --=item B<-o vdsm> -- --This is the old method used internally by the oVirt user interface. --It is never intended to be used directly by end users. -- --=back -- --=head1 OUTPUT TO OVIRT -- --This new method to upload guests to oVirt directly via the REST API --requires oVirt E 4.2. -- --You need to specify I<-o ovirt-upload> as well as the following extra --parameters: -- --=over 4 -- --=item I<-oc> C -- --The URL of the REST API which is usually the server name with --C appended, but might be different if you installed --oVirt Engine on a different path. -- --You can optionally add a username and port number to the URL. If the --username is not specified then virt-v2v defaults to using --C which is the typical superuser account for oVirt --instances. -- --=item I<-of raw> -- --Currently you must use I<-of raw> and you cannot use I<-oa preallocated>. -- --These restrictions will be loosened in a future version. -- --=item I<-op> F -- --A file containing a password to be used when connecting to the oVirt --engine. Note the file should contain the whole password, B, and for security the file should have mode --C<0600> so that others cannot read it. -- --=item I<-os> C -- --The storage domain. -- --=item I<-oo ovirt-cafile=>F -- --The F file (Certificate Authority), copied from --F on the oVirt engine. -- --If I<-oo ovirt-verifypeer> is enabled then this option can --be used to control which CA is used to verify the client’s --identity. If this option is not used then the system’s --global trust store is used. -- --=item I<-oo ovirt-cluster=>C -- --Set the oVirt Cluster Name. If not given it uses C. -- --=item I<-oo ovirt-disk-uuid=>C -- --This option can used to manually specify UUIDs for the disks when --creating the virtual machine. If not specified, the oVirt engine will --generate random UUIDs for the disks. Please note that: -- --=over 4 -- --=item * -- --you B pass as many I<-oo ovirt-disk-uuid=UUID> options as the --amount of disks in the guest -- --=item * -- --the specified UUIDs must not conflict with the UUIDs of existing disks -- --=back -- --=item I<-oo ovirt-proxy> -- --Proxy the upload through oVirt Engine. This is slower than uploading --directly to the oVirt node but may be necessary if you do not have --direct network access to the nodes. -- --=item I<-oo ovirt-verifypeer> -- --Verify the oVirt server’s identity by checking the server‘s --certificate against the Certificate Authority. -- --=back -- --=head1 OUTPUT TO EXPORT STORAGE DOMAIN -- --This section only applies to the I<-o ovirt> output mode. If you use --virt-v2v from the oVirt user interface, then behind the scenes the --import is managed by VDSM using the I<-o vdsm> output mode (which end --users should not try to use directly). -- --You have to specify I<-o ovirt> and an I<-os> option that points to the --oVirt Export Storage Domain. You can either specify the NFS server --and mountpoint, eg. S>, or you can --mount that first and point to the directory where it is mounted, --eg. S>. Be careful not to point to the Data Storage --Domain by accident as that will not work. -- --On successful completion virt-v2v will have written the new guest to --the Export Storage Domain, but it will not yet be ready to run. It --must be imported into oVirt using the UI before it can be used. -- --In oVirt E 2.2 this is done from the Storage tab. Select the --export domain the guest was written to. A pane will appear underneath --the storage domain list displaying several tabs, one of which is "VM --Import". The converted guest will be listed here. Select the --appropriate guest an click "Import". See the oVirt documentation for --additional details. -- --If you export several guests, then you can import them all at the same --time through the UI. -- --=head2 Testing oVirt conversions -- --If you do not have an oVirt instance to test against, then you can --test conversions by creating a directory structure which looks enough --like a oVirt Export Storage Domain to trick virt-v2v: -- -- uuid=`uuidgen` -- mkdir /tmp/ovirt -- mkdir /tmp/ovirt/$uuid -- mkdir /tmp/ovirt/$uuid/images -- mkdir /tmp/ovirt/$uuid/master -- mkdir /tmp/ovirt/$uuid/master/vms -- touch /tmp/ovirt/$uuid/dom_md -- virt-v2v [...] -o ovirt -os /tmp/ovirt -- --=head2 Debugging oVirt import failures -- --When you export to the oVirt Export Storage Domain, and then import --that guest through the oVirt UI, you may encounter an import failure. --Diagnosing these failures is infuriatingly difficult as the UI --generally hides the true reason for the failure. -- --There are several log files of interest: -- --=over 4 -- --=item F -- --In oVirt E 4.1.0, VDSM preserves the virt-v2v log file for --30 days in this directory. -- --This directory is found on the host which performed the conversion. --The host can be selected in the import dialog, or can be found under --the C tab in oVirt administration. -- --=item F -- --As above, this file is present on the host which performed the --conversion. It contains detailed error messages from low-level --operations executed by VDSM, and is useful if the error was not caused --by virt-v2v, but by VDSM. -- --=item F -- --This log file is stored on the oVirt server. It contains more detail --for any errors caused by the oVirt GUI. -- --=back -- --=head1 SEE ALSO -- --L. -- --=head1 AUTHOR -- --Richard W.M. Jones -- --=head1 COPYRIGHT -- --Copyright (C) 2009-2025 Red Hat Inc. -diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod -index 0e68de10..b63da9f3 100644 ---- a/docs/virt-v2v.pod -+++ b/docs/virt-v2v.pod -@@ -14,9 +14,9 @@ virt-v2v - Convert a guest to use KVM - Virt-v2v converts a single guest from a foreign hypervisor to run on - KVM. It can read Linux and Windows guests running on VMware, - Hyper-V and some other hypervisors, and convert them to KVM managed by --libvirt, OpenStack, oVirt, or several other targets. It can modify --the guest to make it bootable on KVM and install virtio drivers so it --will run quickly. -+libvirt, OpenStack or several -+other targets. It can modify the guest to make it bootable on KVM and -+install virtio drivers so it will run quickly. - - There is also a companion front-end called L which comes - as an ISO, CD or PXE image that can be booted on physical machines to -@@ -61,8 +61,6 @@ L — Input from VMware. - - L — Output to local files or local libvirt. - --L — Output to oVirt -- - L — Output to OpenStack. - - L — Release notes for 1.42 release. -@@ -94,21 +92,6 @@ disks to F. - - For more information see L. - --=head2 Convert from VMware to oVirt -- --This is the same as the previous example, except you want to send the --guest to an oVirt Data Domain using the oVirt REST API. Guest network --interface(s) are connected to the target network called C. -- -- virt-v2v -ic vpx://vcenter.example.com/Datacenter/esxi vmware_guest \ -- -o ovirt-upload -oc https://ovirt-engine.example.com/ovirt-engine/api \ -- -os ovirt-data -op /tmp/ovirt-admin-password -of raw \ -- -oo ovirt-cafile=/tmp/ca.pem --bridge ovirtmgmt -- --In this case the host running virt-v2v acts as a B. -- --For more information see L. -- - =head2 Convert from ESXi hypervisor over SSH to local libvirt - - You have an ESXi hypervisor called C with SSH access -@@ -490,26 +473,6 @@ no metadata is written. - - Set the output method to OpenStack. See L. - --=item B<-o> B -- --Set the output method to I. -- --The converted guest is written to an oVirt Export Storage Domain. The --I<-os> parameter must also be used to specify the location of the --Export Storage Domain. Note this does not actually import the guest --into oVirt. You have to do that manually later using the UI. -- --See L. -- --=item B<-o> B -- --Set the output method to I. -- --The converted guest is written directly to an oVirt Data Domain. This --is a faster method than I<-o ovirt>, but requires oVirt E 4.2. -- --See L. -- - =item B<-o> B - - Set the output method to I. -@@ -518,15 +481,6 @@ This is similar to I<-o local>, except that a shell script is written - which you can use to boot the guest in qemu. The converted disks and - shell script are written to the directory specified by I<-os>. - --=item B<-o> B -- --Set the output method to I. -- --This mode is similar to I<-o ovirt>, but the full path to the --data domain must be given: --Fdata-center-uuidE/Edata-domain-uuidE>. --This mode is only used when virt-v2v runs under VDSM control. -- - =item B<-oa> B - - =item B<-oa> B -@@ -594,117 +548,11 @@ For I<-o openstack> (L) only, set optional - OpenStack authentication. For example I<-oo os-username=>NAME is - equivalent to C. - --=item B<-oo ovirt-cafile=>F -- --For I<-o ovirt-upload> (L) only, the --F file (Certificate Authority), copied from --F on the oVirt engine. -- --=item B<-oo ovirt-cluster=>C -- --For I<-o ovirt-upload> (L) only, set the --oVirt Cluster Name. If not given it uses C. -- --=item B<-oo ovirt-proxy> -- --For I<-o ovirt-upload> (L) only, proxy the --upload through oVirt Engine. This is slower than uploading directly --to the oVirt node but may be necessary if you do not have direct --network access to the nodes. -- --=item B<-oo ovirt-verifypeer> -- --For I<-o ovirt-upload> (L) only, verify the --oVirt server’s identity by checking the server‘s certificate against --the Certificate Authority. -- - =item B<-oo server-id=>C - - For I<-o openstack> (L) only, set the name - of the conversion appliance where virt-v2v is running. - --=item B<-oo vdsm-compat=0.10> -- --=item B<-oo vdsm-compat=1.1> -- --If I<-o vdsm> and the output format is qcow2, then we add the qcow2 --I option to the output file for compatibility with RHEL 6 --(see L). -- --If I<-oo vdsm-compat=1.1> is used then modern qcow2 (I) --files are generated instead. -- --Currently I<-oo vdsm-compat=0.10> is the default, but this will change --to I<-oo vdsm-compat=1.1> in a future version of virt-v2v (when we can --assume that everyone is using a modern version of qemu). -- --B output>. All other output --modes (including I<-o ovirt>) generate modern qcow2 I --files, always. -- --If this option is available, then C will appear in --the I<--machine-readable> output. -- --=item B<-oo vdsm-image-uuid=>UUID -- --=item B<-oo vdsm-vol-uuid=>UUID -- --=item B<-oo vdsm-vm-uuid=>UUID -- --=item B<-oo vdsm-ovf-output=>DIR -- --Normally the oVirt output mode chooses random UUIDs for the target --guest. However VDSM needs to control the UUIDs and passes these --parameters when virt-v2v runs under VDSM control. The parameters --control: -- --=over 4 -- --=item * -- --the image directory of each guest disk (I<-oo vdsm-image-uuid>) (this --option is passed once for each guest disk) -- --=item * -- --UUIDs for each guest disk (I<-oo vdsm-vol-uuid>) (this option --is passed once for each guest disk) -- --=item * -- --the OVF file name (I<-oo vdsm-vm-uuid>). -- --=item * -- --the OVF output directory (default current directory) (I<-oo vdsm-ovf-output>). -- --=back -- --The format of UUIDs is: C<12345678-1234-1234-1234-123456789abc> (each --hex digit can be C<0-9> or C), conforming to S. -- --These options can only be used with I<-o vdsm>. -- --=item B<-oo vdsm-ovf-flavour=>flavour -- --This option controls the format of the OVF generated at the end of conversion. --Currently there are two possible flavours: -- --=over 4 -- --=item ovirtexp -- --The OVF format used in oVirt export storage domain. -- --=item ovirt -- --The OVF format understood by oVirt REST API. -- --=back -- --For backward compatibility the default is I, but this may change in --the future. -- - =item B<-oo verify-server-certificate> - - =item B<-oo verify-server-certificate=>C -@@ -730,28 +578,6 @@ For I<-o libvirt>, this is a libvirt directory pool - For I<-o local> and I<-o qemu>, this is a directory name. - The directory must exist. - --For I<-o ovirt-upload>, this is the name of the destination Storage --Domain. -- --For I<-o openstack>, this is the optional Cinder volume type. -- --For I<-o ovirt>, this can be an NFS path of the Export Storage Domain --of the form ChostE:EpathE>, eg: -- -- ovirt-storage.example.com:/ovirt/export -- --The NFS export must be mountable and writable by the user and host --running virt-v2v, since the virt-v2v program has to actually mount it --when it runs. So you probably have to run virt-v2v as C. -- --B You can mount the Export Storage Domain yourself, and point --I<-os> to the mountpoint. Note that virt-v2v will still need to write --to this remote directory, so virt-v2v will still need to run as --C. -- --You will get an error if virt-v2v is unable to mount/write to the --Export Storage Domain. -- - =item B<--parallel> N - - Enable parallel copying if the guest has multiple disks. I is the -@@ -991,26 +817,6 @@ require either root or a special user: - - =over 4 - --=item Mounting the Export Storage Domain -- --When using I<-o ovirt -os server:/esd> virt-v2v has to have sufficient --privileges to NFS mount the Export Storage Domain from C. -- --You can avoid needing root here by mounting it yourself before running --virt-v2v, and passing I<-os /mountpoint> instead, but first of all --read the next S
-- --=item Writing to the Export Storage Domain as 36:36 -- --oVirt cannot read files and directories from the Export Storage --Domain unless they have UID:GID 36:36. You will see VM import --problems if the UID:GID is not correct. -- --When you run virt-v2v I<-o ovirt> as root, virt-v2v attempts to create --files and directories with the correct ownership. If you run virt-v2v --as non-root, it will probably still work, but you will need to --manually change ownership after virt-v2v has finished. -- - =item Writing to libvirt - - When using I<-o libvirt>, you may need to run virt-v2v as root so that -@@ -1557,7 +1363,6 @@ virt-v2v binary. Typical output looks like this: - virt-v2v - libguestfs-rewrite - colours-option -- vdsm-compat-option - input:disk - [...] - output:local -diff --git a/output/Makefile.am b/output/Makefile.am -index 9e1ceabf..c2ee1b3b 100644 ---- a/output/Makefile.am -+++ b/output/Makefile.am -@@ -17,14 +17,7 @@ - - include $(top_srcdir)/subdir-rules.mk - --BUILT_SOURCES = \ -- output_ovirt_upload_cancel_source.ml \ -- output_ovirt_upload_createvm_source.ml \ -- output_ovirt_upload_finalize_source.ml \ -- output_ovirt_upload_plugin_source.ml \ -- output_ovirt_upload_precheck_source.ml \ -- output_ovirt_upload_transfer_source.ml \ -- output_ovirt_upload_vmcheck_source.ml -+BUILT_SOURCES = - - EXTRA_DIST = \ - $(SOURCES_MLI) \ -@@ -32,13 +25,6 @@ EXTRA_DIST = \ - $(SOURCES_C) \ - $(BUILT_SOURCES) \ - embed.sh \ -- ovirt-upload-cancel.py \ -- ovirt-upload-createvm.py \ -- ovirt-upload-finalize.py \ -- ovirt-upload-plugin.py \ -- ovirt-upload-precheck.py \ -- ovirt-upload-transfer.py \ -- ovirt-upload-vmcheck.py \ - test-python-syntax.sh - - SOURCES_MLI = \ -@@ -63,7 +49,6 @@ SOURCES_MLI = \ - output_ovirt_upload_transfer_source.mli \ - output_ovirt_upload_vmcheck_source.mli \ - output_qemu.mli \ -- output_vdsm.mli \ - python_script.mli \ - qemuopts.mli \ - select_output.mli -@@ -75,13 +60,6 @@ SOURCES_ML = \ - create_kubevirt_yaml.ml \ - qemuopts.ml \ - openstack_image_properties.ml \ -- output_ovirt_upload_cancel_source.ml \ -- output_ovirt_upload_createvm_source.ml \ -- output_ovirt_upload_finalize_source.ml \ -- output_ovirt_upload_plugin_source.ml \ -- output_ovirt_upload_precheck_source.ml \ -- output_ovirt_upload_transfer_source.ml \ -- output_ovirt_upload_vmcheck_source.ml \ - output.ml \ - output_disk.ml \ - output_glance.ml \ -@@ -90,30 +68,11 @@ SOURCES_ML = \ - output_null.ml \ - output_openstack.ml \ - output_qemu.ml \ -- output_ovirt.ml \ -- output_ovirt_upload.ml \ -- output_vdsm.ml \ - select_output.ml - - SOURCES_C = \ - qemuopts-c.c - --# These files are generated and contain *.py embedded as an OCaml string. --output_ovirt_upload_cancel_source.ml: $(srcdir)/ovirt-upload-cancel.py -- $(srcdir)/embed.sh code $^ $@ --output_ovirt_upload_createvm_source.ml: $(srcdir)/ovirt-upload-createvm.py -- $(srcdir)/embed.sh code $^ $@ --output_ovirt_upload_finalize_source.ml: $(srcdir)/ovirt-upload-finalize.py -- $(srcdir)/embed.sh code $^ $@ --output_ovirt_upload_plugin_source.ml: $(srcdir)/ovirt-upload-plugin.py -- $(srcdir)/embed.sh code $^ $@ --output_ovirt_upload_precheck_source.ml: $(srcdir)/ovirt-upload-precheck.py -- $(srcdir)/embed.sh code $^ $@ --output_ovirt_upload_transfer_source.ml: $(srcdir)/ovirt-upload-transfer.py -- $(srcdir)/embed.sh code $^ $@ --output_ovirt_upload_vmcheck_source.ml: $(srcdir)/ovirt-upload-vmcheck.py -- $(srcdir)/embed.sh code $^ $@ -- - # We pretend that we're building a C library. automake handles the - # compilation of the C sources for us. At the end we take the C - # objects and OCaml objects and link them into the OCaml library. -diff --git a/output/output_ovirt.ml b/output/output_ovirt.ml -deleted file mode 100644 -index 0f0f4c36..00000000 ---- a/output/output_ovirt.ml -+++ /dev/null -@@ -1,319 +0,0 @@ --(* virt-v2v -- * Copyright (C) 2009-2025 Red Hat Inc. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- *) -- --open Printf --open Unix -- --open Std_utils --open Tools_utils --open Unix_utils --open Common_gettext.Gettext -- --open Types --open Utils -- --open Output -- --module OVirt = struct -- type poptions = Types.output_allocation * string * string * string -- -- type t = string * string * string * string list * string list * int64 list -- -- let to_string options = "-o ovirt" -- -- let query_output_options () = -- printf (f_"No output options can be used in this mode.\n") -- -- let parse_options options source = -- if options.output_options <> [] then -- error (f_"no -oo (output options) are allowed here"); -- if options.output_password <> None then -- error_option_cannot_be_used_in_output_mode "ovirt" "-op"; -- -- (* -os must be set, but at this point we cannot check it. *) -- let output_storage = -- match options.output_storage with -- | None -> error (f_"-o ovirt: -os option was not specified") -- | Some d -> d in -- -- let output_name = Option.value ~default:source.s_name options.output_name in -- -- (options.output_alloc, options.output_format, output_name, output_storage) -- -- let rec setup dir options source input_disks = -- error_if_disk_count_gt input_disks 23; -- let input_sizes = get_disk_sizes input_disks in -- let output_alloc, output_format, output_name, output_storage = options in -- -- (* UID:GID required for files and directories when writing to ESD. *) -- let uid = 36 and gid = 36 in -- -- (* Create a UID-switching handle. If we're not root, create a dummy -- * one because we cannot switch UIDs. -- *) -- let running_as_root = geteuid () = 0 in -- let changeuid_t = -- if running_as_root then -- Changeuid.create ~uid ~gid () -- else -- Changeuid.create () in -- -- let esd_mp, esd_uuid = -- mount_and_check_storage_domain (s_"Export Storage Domain") -- output_storage in -- debug "ovirt: ESD mountpoint: %s\novirt: ESD UUID: %s" esd_mp esd_uuid; -- -- (* See if we can write files as UID:GID 36:36. *) -- let () = -- let testfile = esd_mp // esd_uuid // String.random8 () in -- Changeuid.make_file changeuid_t testfile ""; -- let stat = stat testfile in -- Changeuid.unlink changeuid_t testfile; -- let actual_uid = stat.st_uid and actual_gid = stat.st_gid in -- debug "ovirt: actual UID:GID of new files is %d:%d" actual_uid actual_gid; -- if uid <> actual_uid || gid <> actual_gid then ( -- if running_as_root then -- warning (f_"cannot write files to the NFS server as %d:%d, \ -- even though we appear to be running as root. This \ -- probably means the NFS client or idmapd is not \ -- configured properly.\n\nYou will have to chown \ -- the files that virt-v2v creates after the run, \ -- otherwise oVirt will not be able to import the VM.") -- uid gid -- else -- warning (f_"cannot write files to the NFS server as %d:%d. \ -- You might want to stop virt-v2v (^C) and rerun it \ -- as root.") uid gid -- ) in -- -- (* Create unique UUIDs for everything *) -- let vm_uuid = uuidgen () in -- (* Generate random image and volume UUIDs for each target disk. *) -- let image_uuids = List.map (fun _ -> uuidgen ()) input_disks in -- let vol_uuids = List.map (fun _ -> uuidgen ()) input_disks in -- -- (* We need to create the target image director(ies) so there's a place -- * for the main program to copy the images to. However if image -- * conversion fails for any reason then we delete this directory. -- *) -- let images_dir = esd_mp // esd_uuid // "images" in -- List.iter ( -- fun image_uuid -> -- let d = images_dir // image_uuid in -- Changeuid.mkdir changeuid_t d 0o755 -- ) image_uuids; -- On_exit.f ( -- fun () -> -- (* virt-v2v writes v2vdir/done on success only. *) -- let success = Sys.file_exists (dir // "done") in -- if not success then ( -- List.iter ( -- fun image_uuid -> -- let d = images_dir // image_uuid in -- let cmd = sprintf "rm -rf %s" (quote d) in -- Changeuid.command changeuid_t cmd -- ) image_uuids -- ) -- ); -- -- (* The final directory structure should look like this: -- * ///images/ -- * / # first disk -- * /.meta # first disk -- * / # second disk -- * /.meta # second disk -- * / # etc -- * /.meta # -- *) -- -- (* Generate the randomly named target files (just the names). -- * The main code is what generates the files themselves. -- *) -- let filenames = -- List.map ( -- fun (image_uuid, vol_uuid) -> -- let filename = images_dir // image_uuid // vol_uuid in -- debug "ovirt: disk: %s" filename; -- filename -- ) (List.combine image_uuids vol_uuids) in -- -- (* Generate the .meta file associated with each volume. *) -- let metas = -- Create_ovf.create_meta_files output_alloc output_format -- esd_uuid image_uuids input_sizes in -- List.iter ( -- fun (filename, meta) -> -- let meta_filename = filename ^ ".meta" in -- Changeuid.make_file changeuid_t meta_filename meta -- ) (List.combine filenames metas); -- -- (* Set up the NBD servers. *) -- let uris = -- List.mapi ( -- fun i (size, filename) -> -- let socket = sprintf "%s/out%d" dir i in -- On_exit.unlink socket; -- -- (* Create the actual output disk. *) -- let changeuid f = -- Changeuid.func changeuid_t ( -- fun () -> -- (* Run the command to create the file. *) -- f (); -- (* Make the file sufficiently writable so that possibly root, -- * or root squashed nbdkit will definitely be able to open it. -- * An example of how root squashing nonsense makes everyone -- * less secure. -- *) -- chmod filename 0o666 -- ) -- in -- -- (* We have to wait for the NBD server to exit rather than just -- * killing it, otherwise it races with unmounting. See: -- * https://bugzilla.redhat.com/show_bug.cgi?id=1953286#c26 -- *) -- let on_exit_kill = Output.KillAndWait in -- -- output_to_local_file ~changeuid ~on_exit_kill -- output_alloc output_format filename size socket; -- -- NBD_URI.Unix (socket, None) -- ) (List.combine input_sizes filenames) in -- -- (* Save parameters since we need them during finalization. *) -- let t = esd_mp, esd_uuid, vm_uuid, image_uuids, vol_uuids, input_sizes in -- t, uris -- -- and mount_and_check_storage_domain domain_class os = -- (* The user can either specify -os nfs:/export, or a local directory -- * which is assumed to be the already-mounted NFS export. -- *) -- match String.split ":/" os with -- | mp, "" -> (* Already mounted directory. *) -- check_storage_domain domain_class os mp -- | server, export -> -- let export = "/" ^ export in -- -- (* Create a mountpoint. Default mode is too restrictive for us -- * when we need to write into the directory as 36:36. -- *) -- let mp = Mkdtemp.temp_dir "v2v." in -- chmod mp 0o755; -- -- (* Try mounting it. *) -- let cmd = [ "mount"; sprintf "%s:%s" server export; mp ] in -- if run_command cmd <> 0 then -- error (f_"mount command failed, see earlier errors.\n\nThis probably \ -- means you didn't specify the right %s path [-os %s], or \ -- else you need to rerun virt-v2v as root.") domain_class os; -- -- (* Make sure it is unmounted at exit, as late as possible (prio=9999) *) -- On_exit.f ~prio:9999 ( -- fun () -> -- let cmd = [ "umount"; mp ] in -- ignore (run_command cmd); -- try rmdir mp with _ -> () -- ); -- -- check_storage_domain domain_class os mp -- -- and check_storage_domain domain_class os mp = -- (* Typical SD mountpoint looks like this: -- * $ ls /tmp/mnt -- * 39b6af0e-1d64-40c2-97e4-4f094f1919c7 __DIRECT_IO_TEST__ lost+found -- * $ ls /tmp/mnt/39b6af0e-1d64-40c2-97e4-4f094f1919c7 -- * dom_md images master -- * We expect exactly one of those magic UUIDs. -- *) -- let entries = -- try Sys.readdir mp -- with Sys_error msg -> -- error (f_"could not read the %s specified by the '-os %s' \ -- parameter on the command line. Is it really an \ -- OVirt %s? The original error is: %s") -- domain_class os domain_class msg in -- let entries = Array.to_list entries in -- let uuids = List.filter ( -- fun entry -> -- String.length entry = 36 && -- entry.[8] = '-' && entry.[13] = '-' && entry.[18] = '-' && -- entry.[23] = '-' -- ) entries in -- let uuid = -- match uuids with -- | [uuid] -> uuid -- | [] -> -- error (f_"there are no UUIDs in the %s (%s). Is it really an \ -- OVirt %s?") domain_class os domain_class -- | _::_ -> -- error (f_"there are multiple UUIDs in the %s (%s). This is \ -- unexpected, and may be a bug in virt-v2v or OVirt.") -- domain_class os in -- -- (* Check that the domain has been attached to a Data Center by -- * checking that the master/vms directory exists. -- *) -- let () = -- let master_vms_dir = mp // uuid // "master" // "vms" in -- if not (is_directory master_vms_dir) then -- error (f_"%s does not exist or is not a directory.\n\nMost likely \ -- cause: Either the %s (%s) has not been attached to any \ -- Data Center, or the path %s is not an %s at all.\n\n\ -- You have to attach the %s to a Data Center using the \ -- oVirt user interface first.\n\nIf you don’t \ -- know what the %s mount point should be then you can \ -- also find this out through the oVirt user interface.") -- master_vms_dir domain_class os os -- domain_class domain_class domain_class in -- -- (* Looks good, so return the SD mountpoint and UUID. *) -- (mp, uuid) -- -- let finalize dir options t output_disks source inspect target_meta = -- let output_alloc, output_format, output_name, output_storage = options in -- let esd_mp, esd_uuid, vm_uuid, image_uuids, vol_uuids, sizes = t in -- -- (* UID:GID required for files and directories when writing to ESD. *) -- let uid = 36 and gid = 36 in -- -- (* Create a UID-switching handle. If we're not root, create a dummy -- * one because we cannot switch UIDs. -- *) -- let running_as_root = geteuid () = 0 in -- let changeuid_t = -- if running_as_root then -- Changeuid.create ~uid ~gid () -- else -- Changeuid.create () in -- -- (* Create the metadata. *) -- let ovf = -- Create_ovf.create_ovf source inspect target_meta sizes -- output_alloc output_format output_name esd_uuid image_uuids vol_uuids -- ~need_actual_sizes:true output_disks vm_uuid -- Create_ovf.OVirtExportStorageDomain in -- -- (* Write it to the metadata file. *) -- let dir = esd_mp // esd_uuid // "master" // "vms" // vm_uuid in -- Changeuid.mkdir changeuid_t dir 0o755; -- let file = dir // vm_uuid ^ ".ovf" in -- Changeuid.output changeuid_t file (fun chan -> DOM.doc_to_chan chan ovf) -- -- let request_size = None --end -diff --git a/output/output_ovirt.mli b/output/output_ovirt.mli -deleted file mode 100644 -index 29e66059..00000000 ---- a/output/output_ovirt.mli -+++ /dev/null -@@ -1,21 +0,0 @@ --(* virt-v2v -- * Copyright (C) 2009-2025 Red Hat Inc. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- *) -- --(** [-o ovirt] output mode. *) -- --module OVirt : Output.OUTPUT -diff --git a/output/output_ovirt_upload.ml b/output/output_ovirt_upload.ml -deleted file mode 100644 -index e7577edb..00000000 ---- a/output/output_ovirt_upload.ml -+++ /dev/null -@@ -1,514 +0,0 @@ --(* virt-v2v -- * Copyright (C) 2009-2025 Red Hat Inc. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- *) -- --open Printf --open Unix -- --open Std_utils --open Tools_utils --open Common_gettext.Gettext -- --open Types --open Utils -- --open Output -- --module OVirtUpload = struct -- type poptions = string * string * string * string * string * -- string option * string option * bool * bool * -- string list option -- -- type t = int64 list * string list * string list * -- Python_script.script * Python_script.script * -- JSON.field list * string option * string option * -- string option * string * int list ref -- -- let to_string options = -- "-o ovirt-upload" ^ -- (match options.output_conn with -- | Some oc -> " -oc " ^ oc -- | None -> "") ^ -- (match options.output_storage with -- | Some os -> " -os " ^ os -- | None -> "") -- -- let query_output_options () = -- printf (f_"Output options (-oo) which can be used with -o ovirt-upload: -- -- -oo ovirt-cafile=CA.PEM Set ‘ca.pem’ certificate bundle filename. -- -oo ovirt-cluster=CLUSTERNAME Set oVirt cluster name. -- -oo ovirt-proxy Connect via oVirt Engine proxy (default: false). -- -oo ovirt-verifypeer[=true|false] Verify server identity (default: false). -- --You can override the UUIDs of the disks, instead of using autogenerated UUIDs --after their uploads (if you do, you must supply one for each disk): -- -- -oo ovirt-disk-uuid=UUID Disk UUID --") -- -- let rec parse_options options source = -- let output_conn = -- match options.output_conn with -- | None -> -- error (f_"-o ovirt-upload: use ‘-oc’ to point to the oVirt \ -- server REST API URL, which is usually \ -- https://servername/ovirt-engine/api") -- | Some oc -> oc in -- (* In theory we could make the password optional in future. *) -- let output_password = -- match options.output_password with -- | None -> -- error (f_"-o ovirt-upload: output password file was not specified, \ -- use ‘-op’ to point to a file which contains the password \ -- used to connect to the oVirt server") -- | Some op -> op in -- let output_storage = -- match options.output_storage with -- | None -> -- error (f_"-o ovirt-upload: output storage was not specified, \ -- use ‘-os’"); -- | Some os -> os in -- -- let ovirt_cafile = ref None in -- let ovirt_cluster = ref None in -- let ovirt_direct = ref true in -- let ovirt_verifypeer = ref false in -- let ovirt_disk_uuids = ref None in -- -- List.iter ( -- function -- | ("ovirt-cafile"|"rhv-cafile"), v -> -- if !ovirt_cafile <> None then -- error (f_"-o ovirt-upload: -oo ovirt-cafile set more than once"); -- ovirt_cafile := Some v -- | ("ovirt-cluster"|"rhv-cluster"), v -> -- if !ovirt_cluster <> None then -- error (f_"-o ovirt-upload: -oo ovirt-cluster set more than once"); -- ovirt_cluster := Some v -- | ("ovirt-direct"|"rhv-direct"), "" -> ovirt_direct := true -- | ("ovirt-direct"|"rhv-direct"), v -> ovirt_direct := bool_of_string v -- | ("ovirt-proxy"|"rhv-proxy"), "" -> ovirt_direct := false -- | ("ovirt-proxy"|"rhv-proxy"), v -> ovirt_direct := not (bool_of_string v) -- | ("ovirt-verifypeer"|"rhv-verifypeer"), "" -> ovirt_verifypeer := true -- | ("ovirt-verifypeer"|"rhv-verifypeer"), v -> -- ovirt_verifypeer := bool_of_string v -- | ("ovirt-disk-uuid"|"rhv-disk-uuid"), v -> -- if not (is_nonnil_uuid v) then -- error (f_"-o ovirt-upload: invalid UUID for -oo ovirt-disk-uuid"); -- ovirt_disk_uuids := -- Some (v :: (Option.value ~default:[] !ovirt_disk_uuids)) -- | k, _ -> -- error (f_"-o ovirt-upload: unknown output option ‘-oo %s’") k -- ) options.output_options; -- -- let ovirt_cafile = !ovirt_cafile in -- let ovirt_cluster = !ovirt_cluster in -- let ovirt_direct = !ovirt_direct in -- let ovirt_verifypeer = !ovirt_verifypeer in -- let ovirt_disk_uuids = Option.map List.rev !ovirt_disk_uuids in -- -- let output_name = Option.value ~default:source.s_name options.output_name in -- -- (output_conn, options.output_format, -- output_password, output_name, output_storage, -- ovirt_cafile, ovirt_cluster, ovirt_direct, -- ovirt_verifypeer, ovirt_disk_uuids) -- -- and is_nonnil_uuid uuid = -- let nil_uuid = "00000000-0000-0000-0000-000000000000" in -- let rex_uuid = lazy ( -- let hex = "[a-fA-F0-9]" in -- let str = sprintf "^%s{8}-%s{4}-%s{4}-%s{4}-%s{12}$" -- hex hex hex hex hex in -- PCRE.compile str -- ) in -- if uuid = nil_uuid then false -- else PCRE.matches (Lazy.force rex_uuid) uuid -- -- let rec setup dir options source input_disks = -- error_if_disk_count_gt input_disks 23; -- let input_sizes = get_disk_sizes input_disks in -- let output_conn, output_format, -- output_password, output_name, output_storage, -- ovirt_cafile, ovirt_cluster, ovirt_direct, -- ovirt_verifypeer, ovirt_disk_uuids = options in -- -- (* Check that the 'ovirtsdk4' Python module is available. *) -- let error_unless_ovirtsdk4_module_available () = -- let res = run_command [ Python_script.python; "-c"; -- "import ovirtsdk4" ] in -- if res <> 0 then -- error (f_"the Python module ‘ovirtsdk4’ could not be loaded, \ -- is it installed? See previous messages for problems.") -- in -- -- (* Check that nbdkit is available and new enough. *) -- let error_unless_nbdkit_working () = -- if not (Nbdkit.is_installed ()) then -- error (f_"nbdkit is not installed or not working. It is required \ -- to use ‘-o ovirt-upload’. See the virt-v2v-output-ovirt(1) \ -- manual.") -- in -- -- (* Check that the python3 plugin is installed and working -- * and can load the plugin script. -- *) -- let error_unless_nbdkit_python_plugin_working plugin_script = -- let cmd = sprintf "nbdkit python %s --dump-plugin >/dev/null" -- (quote (Python_script.path plugin_script)) in -- debug "%s" cmd; -- if Sys.command cmd <> 0 then -- error (f_"nbdkit python plugin is not installed or not working. \ -- It is required if you want to use ‘-o ovirt-upload’. -- --See also the virt-v2v-output-ovirt(1) manual."); -- in -- -- (* Check that nbdkit was compiled with SELinux support (for the -- * --selinux-label option). -- *) -- let error_unless_nbdkit_compiled_with_selinux () = -- if have_selinux then ( -- let config = Nbdkit.config () in -- let selinux = try List.assoc "selinux" config with Not_found -> "no" in -- if selinux = "no" then -- error (f_"nbdkit was compiled without SELinux support. You will \ -- have to recompile nbdkit with libselinux-devel installed, \ -- or else set SELinux to Permissive mode while doing the \ -- conversion.") -- ) -- in -- -- Python_script.error_unless_python_interpreter_found (); -- error_unless_ovirtsdk4_module_available (); -- error_unless_nbdkit_working (); -- error_unless_nbdkit_compiled_with_selinux (); -- -- (* Python code. *) -- let precheck_script = -- Python_script.create ~name:"ovirt-upload-precheck.py" -- Output_ovirt_upload_precheck_source.code in -- let vmcheck_script = -- Python_script.create ~name:"ovirt-upload-vmcheck.py" -- Output_ovirt_upload_vmcheck_source.code in -- let plugin_script = -- Python_script.create ~name:"ovirt-upload-plugin.py" -- Output_ovirt_upload_plugin_source.code in -- let transfer_script = -- Python_script.create ~name:"ovirt-upload-transfer.py" -- Output_ovirt_upload_transfer_source.code in -- let finalize_script = -- Python_script.create ~name:"ovirt-upload-finalize.py" -- Output_ovirt_upload_finalize_source.code in -- let cancel_script = -- Python_script.create ~name:"ovirt-upload-cancel.py" -- Output_ovirt_upload_cancel_source.code in -- let createvm_script = -- Python_script.create ~name:"ovirt-upload-createvm.py" -- Output_ovirt_upload_createvm_source.code in -- -- error_unless_nbdkit_python_plugin_working plugin_script; -- -- (* JSON parameters which are invariant between disks. *) -- let json_params = [ -- "verbose", JSON.Bool (verbose ()); -- -- "output_conn", JSON.String output_conn; -- "output_password", JSON.String output_password; -- "output_storage", JSON.String output_storage; -- "ovirt_cafile", json_optstring ovirt_cafile; -- "ovirt_cluster", -- JSON.String (Option.value ~default:"Default" ovirt_cluster); -- "ovirt_direct", JSON.Bool ovirt_direct; -- -- (* The 'Insecure' flag seems to be a number with various possible -- * meanings, however we just set it to True/False. -- * -- * https://github.com/oVirt/ovirt-engine-sdk/blob/19aa7070b80e60a4cfd910448287aecf9083acbe/sdk/lib/ovirtsdk4/__init__.py#L395 -- *) -- "insecure", JSON.Bool (not ovirt_verifypeer); -- ] in -- -- (* nbdkit command line which is invariant between disks. *) -- let cmd = Nbdkit.create "python" in -- Nbdkit.add_arg cmd "script" (Python_script.path plugin_script); -- -- (* Match number of parallel coroutines in qemu-img *) -- Nbdkit.set_threads cmd 8; -- -- (* Python code prechecks. *) -- let json_params = match ovirt_disk_uuids with -- | None -> json_params -- | Some uuids -> -- let ids = List.map (fun uuid -> JSON.String uuid) uuids in -- ("ovirt_disk_uuids", JSON.List ids) :: json_params -- in -- let precheck_json = dir // "v2vprecheck.json" in -- let fd = Unix.openfile precheck_json [O_WRONLY; O_CREAT; O_TRUNC] 0o600 in -- if Python_script.run_command ~stdout_fd:fd -- precheck_script json_params [] <> 0 then -- error (f_"failed server prechecks, see earlier errors"); -- if verbose () then -- debug "precheck output before parsing: %s" -- (read_whole_file precheck_json); -- let json = JSON_parser.json_parser_tree_parse_file precheck_json in -- debug "precheck output parsed as: %s" -- (JSON.string_of_doc ~fmt:JSON.Indented ["", json]); -- let ovirt_storagedomain_uuid = -- Some (JSON_parser.object_get_string "ovirt_storagedomain_uuid" json) in -- let ovirt_cluster_uuid = -- Some (JSON_parser.object_get_string "ovirt_cluster_uuid" json) in -- let ovirt_cluster_cpu_architecture = -- Some (JSON_parser.object_get_string "ovirt_cluster_cpu_architecture" json) in -- -- (* If the disk UUIDs were not provided, then generate them. -- * This is simpler than letting oVirt generate them and trying -- * to read them back from oVirt. -- *) -- let disk_uuids = -- match ovirt_disk_uuids with -- | Some uuids -> -- let nr_disks = List.length input_disks in -- if List.length uuids <> nr_disks then -- error (f_"the number of ‘-oo ovirt-disk-uuid’ parameters passed on \ -- the command line has to match the number of guest \ -- disk images (for this guest: %d)") nr_disks; -- uuids -- | None -> List.map (fun _ -> uuidgen ()) input_disks in -- -- (* This will accumulate the list of transfer IDs from the transfer -- * script. -- *) -- let transfer_ids = ref [] in -- -- let ovirt_cluster_name = -- match List.assoc "ovirt_cluster" json_params with -- | JSON.String s -> s -- | _ -> assert false in -- -- let json_params = -- ("output_name", JSON.String output_name) :: json_params in -- -- (* Check that the VM does not exist. This can't run in #precheck because -- * we need to know the name of the virtual machine. -- *) -- if Python_script.run_command vmcheck_script json_params [] <> 0 then -- error (f_"failed vmchecks, see earlier errors"); -- -- (* Cancel the transfer and delete disks. -- * -- * This ignores errors since the only time we are doing this is on -- * the failure path. -- *) -- let cancel transfer_ids disk_uuids = -- let ids = List.map (fun id -> JSON.String id) transfer_ids in -- let json_params = ("transfer_ids", JSON.List ids) :: json_params in -- let ids = List.map (fun uuid -> JSON.String uuid) disk_uuids in -- let json_params = ("disk_uuids", JSON.List ids) :: json_params in -- ignore (Python_script.run_command cancel_script json_params []) -- in -- -- (* Set up an at-exit handler to perform some cleanups. -- * - Kill nbdkit PIDs (only before finalization). -- * - Delete the orphan disks (only on conversion failure). -- *) -- let nbdkit_pids = ref [] in -- On_exit.f ( -- fun () -> -- (* Kill the nbdkit PIDs. *) -- List.iter ( -- fun pid -> -- try kill pid Sys.sigterm -- with exn -> debug "%s" (Printexc.to_string exn) -- ) !nbdkit_pids; -- nbdkit_pids := []; -- -- (* virt-v2v writes v2vdir/done on success only. *) -- let success = Sys.file_exists (dir // "done") in -- if not success then ( -- if disk_uuids <> [] then -- cancel !transfer_ids disk_uuids -- ) -- ); -- -- (* Create an nbdkit instance for each disk and set the -- * target URI to point to the NBD socket. -- *) -- let uris = -- List.mapi ( -- fun i (size, uuid) -> -- let socket = sprintf "%s/out%d" dir i in -- On_exit.unlink socket; -- -- let disk_name = sprintf "%s-%03d" output_name i in -- let json_params = -- ("disk_name", JSON.String disk_name) :: json_params in -- -- let disk_format = -- match output_format with -- | "raw" as fmt -> fmt -- | "qcow2" as fmt -> fmt -- | _ -> -- error (f_"ovirt-upload: -of %s: Only output format ‘raw’ \ -- or ‘qcow2’ \ -- is supported. If the input is in a different format \ -- then force one of these output formats by adding \ -- either ‘-of raw’ or ‘-of qcow2’ on the command line.") -- output_format in -- let json_params = -- ("disk_format", JSON.String disk_format) :: json_params in -- -- let json_params = -- ("disk_size", JSON.Int size) :: json_params in -- -- let json_params = -- ("disk_uuid", JSON.String uuid) :: json_params in -- -- (* Write the JSON parameters to a file. *) -- let json_param_file = dir // sprintf "out.params%d.json" i in -- with_open_out -- json_param_file -- (fun chan -> output_string chan (JSON.string_of_doc json_params)); -- -- (* Start the transfer. *) -- let transfer_json = dir // sprintf "v2vtransfer%d.json" i in -- let fd = -- Unix.openfile transfer_json [O_WRONLY; O_CREAT; O_TRUNC] 0o600 in -- if Python_script.run_command ~stdout_fd:fd -- transfer_script json_params [] <> 0 then -- error (f_"failed to start transfer, see earlier errors"); -- if verbose () then -- debug "transfer output before parsing: %s" -- (read_whole_file transfer_json); -- let json = JSON_parser.json_parser_tree_parse_file transfer_json in -- debug "transfer output parsed as: %s" -- (JSON.string_of_doc ~fmt:JSON.Indented ["", json]); -- let destination_url = -- JSON_parser.object_get_string "destination_url" json in -- let transfer_id = -- JSON_parser.object_get_string "transfer_id" json in -- List.push_back transfer_ids transfer_id; -- let is_ovirt_host = -- JSON_parser.object_get_bool "is_ovirt_host" json in -- -- (* Create the nbdkit instance. *) -- Nbdkit.add_arg cmd "size" (Int64.to_string size); -- Nbdkit.add_arg cmd "url" destination_url; -- Option.iter (Nbdkit.add_arg cmd "cafile") ovirt_cafile; -- if not ovirt_verifypeer then -- Nbdkit.add_arg cmd "insecure" "true"; -- if is_ovirt_host then -- Nbdkit.add_arg cmd "is_ovirt_host" "true"; -- let _, pid = Nbdkit.run_unix socket cmd in -- List.push_front pid nbdkit_pids; -- -- NBD_URI.Unix (socket, None) -- ) (List.combine input_sizes disk_uuids) in -- -- (* Stash some data we will need during finalization. *) -- let t = (input_sizes : int64 list), disk_uuids, !transfer_ids, -- finalize_script, createvm_script, json_params, -- ovirt_storagedomain_uuid, ovirt_cluster_uuid, -- ovirt_cluster_cpu_architecture, ovirt_cluster_name, nbdkit_pids in -- -- t, uris -- -- and json_optstring = function -- | Some s -> JSON.String s -- | None -> JSON.Null -- -- let finalize dir options t output_disks source inspect target_meta = -- let output_conn, output_format, -- output_password, output_name, output_storage, -- ovirt_cafile, ovirt_cluster, ovirt_direct, -- ovirt_verifypeer, ovirt_disk_uuids = options in -- let input_sizes, disk_uuids, transfer_ids, -- finalize_script, createvm_script, json_params, -- ovirt_storagedomain_uuid, ovirt_cluster_uuid, -- ovirt_cluster_cpu_architecture, ovirt_cluster_name, -- nbdkit_pids = t in -- -- (* Check the cluster CPU arch matches what we derived about the -- * guest during conversion. -- *) -- (match ovirt_cluster_cpu_architecture with -- | None -> assert false -- | Some arch -> -- if arch <> target_meta.guestcaps.gcaps_arch then -- error (f_"the cluster ‘%s’ does not support the architecture %s \ -- but %s") -- ovirt_cluster_name target_meta.guestcaps.gcaps_arch arch -- ); -- -- (* We must kill all our nbdkit instances before finalizing the -- * transfer. See: -- * https://listman.redhat.com/archives/libguestfs/2022-February/msg00111.html -- * -- * We want to fail here if the kill fails because nbdkit -- * died already, as that would be unexpected. -- *) -- let () = -- let pids = !nbdkit_pids in -- List.iter (fun pid -> kill pid Sys.sigterm) pids; -- List.iter (fun pid -> ignore (waitpid [] pid)) pids; -- nbdkit_pids := [] (* Don't kill them again in the On_exit handler. *) in -- -- (* Finalize all the transfers. *) -- let json_params = -- let ids = List.map (fun id -> JSON.String id) transfer_ids in -- let json_params = ("transfer_ids", JSON.List ids) :: json_params in -- let ids = List.map (fun uuid -> JSON.String uuid) disk_uuids in -- let json_params = ("disk_uuids", JSON.List ids) :: json_params in -- json_params in -- if Python_script.run_command finalize_script json_params [] <> 0 then -- error (f_"failed to finalize the transfers, see earlier errors"); -- -- (* The storage domain UUID. *) -- let sd_uuid = -- match ovirt_storagedomain_uuid with -- | None -> assert false -- | Some uuid -> uuid in -- -- (* The volume and VM UUIDs are made up. *) -- let vol_uuids = List.map (fun _ -> uuidgen ()) input_sizes -- and vm_uuid = uuidgen () in -- -- (* Create the metadata. *) -- let ovf = -- Create_ovf.create_ovf source inspect target_meta input_sizes -- Sparse output_format output_name -- sd_uuid disk_uuids vol_uuids output_disks vm_uuid OVirt in -- let ovf = DOM.doc_to_string ovf in -- -- let json_params = -- match ovirt_cluster_uuid with -- | None -> assert false -- | Some uuid -> ("ovirt_cluster_uuid", JSON.String uuid) :: json_params in -- -- let ovf_file = dir // "vm.ovf" in -- with_open_out ovf_file (fun chan -> output_string chan ovf); -- if Python_script.run_command createvm_script json_params [ovf_file] <> 0 -- then -- error (f_"failed to create virtual machine, see earlier errors") -- -- (* The imageio server has high overhead per request. Using 4 MiB -- * request size is 1.8x times faster compared with nbdcopy default -- * request size (256k). -- *) -- let request_size = Some (4*1024*1024) --end -diff --git a/output/output_ovirt_upload.mli b/output/output_ovirt_upload.mli -deleted file mode 100644 -index 06daca34..00000000 ---- a/output/output_ovirt_upload.mli -+++ /dev/null -@@ -1,21 +0,0 @@ --(* virt-v2v -- * Copyright (C) 2009-2025 Red Hat Inc. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- *) -- --(** [-o ovirt-upload] output mode. *) -- --module OVirtUpload : Output.OUTPUT -diff --git a/output/output_ovirt_upload_cancel_source.mli b/output/output_ovirt_upload_cancel_source.mli -deleted file mode 100644 -index aa33bc54..00000000 ---- a/output/output_ovirt_upload_cancel_source.mli -+++ /dev/null -@@ -1,19 +0,0 @@ --(* virt-v2v -- * Copyright (C) 2019 Red Hat Inc. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- *) -- --val code : string -diff --git a/output/output_ovirt_upload_createvm_source.mli b/output/output_ovirt_upload_createvm_source.mli -deleted file mode 100644 -index c1bafa15..00000000 ---- a/output/output_ovirt_upload_createvm_source.mli -+++ /dev/null -@@ -1,19 +0,0 @@ --(* virt-v2v -- * Copyright (C) 2018 Red Hat Inc. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- *) -- --val code : string -diff --git a/output/output_ovirt_upload_finalize_source.mli b/output/output_ovirt_upload_finalize_source.mli -deleted file mode 100644 -index aa33bc54..00000000 ---- a/output/output_ovirt_upload_finalize_source.mli -+++ /dev/null -@@ -1,19 +0,0 @@ --(* virt-v2v -- * Copyright (C) 2019 Red Hat Inc. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- *) -- --val code : string -diff --git a/output/output_ovirt_upload_plugin_source.mli b/output/output_ovirt_upload_plugin_source.mli -deleted file mode 100644 -index c1bafa15..00000000 ---- a/output/output_ovirt_upload_plugin_source.mli -+++ /dev/null -@@ -1,19 +0,0 @@ --(* virt-v2v -- * Copyright (C) 2018 Red Hat Inc. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- *) -- --val code : string -diff --git a/output/output_ovirt_upload_precheck_source.mli b/output/output_ovirt_upload_precheck_source.mli -deleted file mode 100644 -index aa33bc54..00000000 ---- a/output/output_ovirt_upload_precheck_source.mli -+++ /dev/null -@@ -1,19 +0,0 @@ --(* virt-v2v -- * Copyright (C) 2019 Red Hat Inc. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- *) -- --val code : string -diff --git a/output/output_ovirt_upload_transfer_source.mli b/output/output_ovirt_upload_transfer_source.mli -deleted file mode 100644 -index aa33bc54..00000000 ---- a/output/output_ovirt_upload_transfer_source.mli -+++ /dev/null -@@ -1,19 +0,0 @@ --(* virt-v2v -- * Copyright (C) 2019 Red Hat Inc. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- *) -- --val code : string -diff --git a/output/output_ovirt_upload_vmcheck_source.mli b/output/output_ovirt_upload_vmcheck_source.mli -deleted file mode 100644 -index c1bafa15..00000000 ---- a/output/output_ovirt_upload_vmcheck_source.mli -+++ /dev/null -@@ -1,19 +0,0 @@ --(* virt-v2v -- * Copyright (C) 2018 Red Hat Inc. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- *) -- --val code : string -diff --git a/output/output_vdsm.ml b/output/output_vdsm.ml -deleted file mode 100644 -index db12e0b1..00000000 ---- a/output/output_vdsm.ml -+++ /dev/null -@@ -1,239 +0,0 @@ --(* virt-v2v -- * Copyright (C) 2009-2025 Red Hat Inc. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- *) -- --open Printf --open Unix -- --open Std_utils --open Tools_utils --open Common_gettext.Gettext -- --open Types --open Utils -- --open Output -- --module VDSM = struct -- type poptions = Types.output_allocation * string * string * string * -- string list * string list * string * string * -- string * Create_ovf.ovf_flavour -- -- type t = string * string * int64 list -- -- let to_string options = "-o vdsm" -- -- let query_output_options () = -- let ovf_flavours_str = String.concat "|" Create_ovf.ovf_flavours in -- -- printf (f_"Output options (-oo) which can be used with -o vdsm: -- -- -oo vdsm-compat=0.10|1.1 Write qcow2 with compat=0.10|1.1 -- (default: 0.10) -- -oo vdsm-vm-uuid=UUID VM UUID (required) -- -oo vdsm-ovf-output=DIR OVF metadata directory (required) -- -oo vdsm-ovf-flavour=%s -- Set the type of generated OVF (default: ovirtexp) -- --For each disk you must supply one of each of these options: -- -- -oo vdsm-image-uuid=UUID Image directory UUID -- -oo vdsm-vol-uuid=UUID Disk volume UUID --") ovf_flavours_str -- -- let parse_options options source = -- if options.output_password <> None then -- error_option_cannot_be_used_in_output_mode "vdsm" "-op"; -- -- let vm_uuid = ref None in -- let ovf_output = ref None in (* default "." *) -- let compat = ref "0.10" in -- let ovf_flavour = ref Create_ovf.OVirtExportStorageDomain in -- let image_uuids = ref [] in -- let vol_uuids = ref [] in -- -- List.iter ( -- function -- | "vdsm-compat", "0.10" -> compat := "0.10" -- | "vdsm-compat", "1.1" -> compat := "1.1" -- | "vdsm-compat", v -> -- error (f_"-o vdsm: unknown vdsm-compat level ‘%s’") v -- | "vdsm-vm-uuid", v -> -- if !vm_uuid <> None then -- error (f_"-o vdsm: -oo vdsm-vm-uuid set more than once"); -- vm_uuid := Some v; -- | "vdsm-ovf-output", v -> -- if !ovf_output <> None then -- error (f_"-o vdsm: -oo vdsm-ovf-output set more than once"); -- ovf_output := Some v; -- | "vdsm-ovf-flavour", v -> -- ovf_flavour := Create_ovf.ovf_flavour_of_string v -- | "vdsm-image-uuid", v -> -- List.push_front v image_uuids -- | "vdsm-vol-uuid", v -> -- List.push_front v vol_uuids -- | k, _ -> -- error (f_"-o vdsm: unknown output option ‘-oo %s’") k -- ) options.output_options; -- -- let compat = !compat in -- let image_uuids = List.rev !image_uuids in -- let vol_uuids = List.rev !vol_uuids in -- if image_uuids = [] || vol_uuids = [] then -- error (f_"-o vdsm: either -oo vdsm-vol-uuid or \ -- -oo vdsm-vm-uuid was not specified"); -- let vm_uuid = -- match !vm_uuid with -- | None -> -- error (f_"-o vdsm: -oo vdsm-image-uuid was not specified") -- | Some uuid -> uuid in -- let ovf_output = Option.value ~default:"." !ovf_output in -- let ovf_flavour = !ovf_flavour in -- -- (* -os must be set, but at this point we cannot check it. *) -- let output_storage = -- match options.output_storage with -- | None -> error (f_"-o vdsm: -os option was not specified") -- | Some d when not (is_directory d) -> -- error (f_"-os %s: output directory does not exist \ -- or is not a directory") d -- | Some d -> d in -- -- let output_name = Option.value ~default:source.s_name options.output_name in -- -- (options.output_alloc, options.output_format, -- output_name, output_storage, -- image_uuids, vol_uuids, vm_uuid, ovf_output, -- compat, ovf_flavour) -- -- let setup dir options source input_disks = -- error_if_disk_count_gt input_disks 23; -- let input_sizes = get_disk_sizes input_disks in -- let output_alloc, output_format, -- output_name, output_storage, -- image_uuids, vol_uuids, vm_uuid, ovf_output, -- compat, ovf_flavour = options in -- -- if List.length image_uuids <> List.length input_disks || -- List.length vol_uuids <> List.length input_disks then -- error (f_"the number of ‘-oo vdsm-image-uuid’ and ‘-oo vdsm-vol-uuid’ \ -- parameters passed on the command line has to match the \ -- number of guest disk images (for this guest: %d)") -- (List.length input_disks); -- -- let dd_mp, dd_uuid = -- let fields = -- String.nsplit "/" output_storage in (* ... "data-center" "UUID" *) -- let fields = List.rev fields in (* "UUID" "data-center" ... *) -- let fields = List.drop_while ((=) "") fields in -- match fields with -- | uuid :: rest when String.length uuid = 36 -> -- let mp = String.concat "/" (List.rev rest) in -- mp, uuid -- | _ -> -- error (f_"vdsm: invalid -os parameter \ -- does not contain a valid UUID: %s") -- output_storage in -- -- debug "VDSM: DD mountpoint: %s\nVDSM: DD UUID: %s" dd_mp dd_uuid; -- -- (* Note that VDSM has to create all these directories. *) -- let images_dir = dd_mp // dd_uuid // "images" in -- List.iter ( -- fun image_uuid -> -- let d = images_dir // image_uuid in -- if not (is_directory d) then -- error (f_"image directory (%s) does not exist or is not a directory") -- d -- ) image_uuids; -- -- (* Note that VDSM has to create this directory too. *) -- if not (is_directory ovf_output) then -- error (f_"OVF (metadata) directory (%s) does not exist or \ -- is not a directory") -- ovf_output; -- -- debug "VDSM: OVF (metadata) directory: %s" ovf_output; -- -- (* The final directory structure should look like this: -- * ///images/ -- * / # first disk -- * /.meta # first disk -- * / # second disk -- * /.meta # second disk -- * / # etc -- * /.meta # -- *) -- -- (* Create the target filenames. *) -- let filenames = -- List.map ( -- fun (image_uuid, vol_uuid) -> -- let filename = images_dir // image_uuid // vol_uuid in -- debug "VDSM: disk: %s" filename; -- filename -- ) (List.combine image_uuids vol_uuids) in -- -- (* Generate the .meta files associated with each volume. *) -- let metas = -- Create_ovf.create_meta_files output_alloc output_format -- dd_uuid image_uuids input_sizes in -- List.iter ( -- fun (filename, meta) -> -- let meta_filename = filename ^ ".meta" in -- with_open_out meta_filename (fun chan -> output_string chan meta) -- ) (List.combine filenames metas); -- -- (* Set up the NBD servers. *) -- let uris = -- List.mapi ( -- fun i (size, filename) -> -- let socket = sprintf "%s/out%d" dir i in -- On_exit.unlink socket; -- -- (* Create the actual output disk. *) -- output_to_local_file output_alloc output_format filename size socket; -- -- NBD_URI.Unix (socket, None) -- ) (List.combine input_sizes filenames) in -- -- (* Save parameters since we need them during finalization. *) -- let t = dd_mp, dd_uuid, input_sizes in -- t, uris -- -- let finalize dir options t output_disks source inspect target_meta = -- let output_alloc, output_format, -- output_name, output_storage, -- image_uuids, vol_uuids, vm_uuid, ovf_output, -- compat, ovf_flavour = options in -- let dd_mp, dd_uuid, sizes = t in -- -- (* Create the metadata. *) -- let ovf = Create_ovf.create_ovf source inspect target_meta sizes -- output_alloc output_format output_name dd_uuid -- image_uuids -- vol_uuids -- output_disks -- vm_uuid -- ovf_flavour in -- -- (* Write it to the metadata file. *) -- let file = ovf_output // vm_uuid ^ ".ovf" in -- with_open_out file (fun chan -> DOM.doc_to_chan chan ovf) -- -- let request_size = None --end -diff --git a/output/output_vdsm.mli b/output/output_vdsm.mli -deleted file mode 100644 -index c598f5df..00000000 ---- a/output/output_vdsm.mli -+++ /dev/null -@@ -1,21 +0,0 @@ --(* virt-v2v -- * Copyright (C) 2009-2025 Red Hat Inc. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- *) -- --(** [-o vdsm] output mode. *) -- --module VDSM : Output.OUTPUT -diff --git a/output/ovirt-upload-cancel.py b/output/ovirt-upload-cancel.py -deleted file mode 100644 -index fed44b45..00000000 ---- a/output/ovirt-upload-cancel.py -+++ /dev/null -@@ -1,96 +0,0 @@ --# -*- python -*- --# oVirt upload cancel used by ‘virt-v2v -o ovirt-upload’ --# Copyright (C) 2019-2025 Red Hat Inc. --# --# This program is free software; you can redistribute it and/or modify --# it under the terms of the GNU General Public License as published by --# the Free Software Foundation; either version 2 of the License, or --# (at your option) any later version. --# --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY; without even the implied warranty of --# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --# GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License along --# with this program; if not, write to the Free Software Foundation, Inc., --# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- --import json --import logging --import sys --from contextlib import closing --from urllib.parse import urlparse, urlunparse -- --import ovirtsdk4 as sdk --import ovirtsdk4.types as types -- -- --def debug(s): -- if params['verbose']: -- print(s, file=sys.stderr) -- sys.stderr.flush() -- -- --# Parameters are passed in via a JSON doc from the OCaml code. --# Because this Python code ships embedded inside virt-v2v there --# is no formal API here. --params = None -- --if len(sys.argv) != 2: -- raise RuntimeError("incorrect number of parameters") -- --# Parameters are passed in via a JSON document. --with open(sys.argv[1], 'r') as fp: -- params = json.load(fp) -- --# What is passed in is a password file, read the actual password. --with open(params['output_password'], 'r') as fp: -- output_password = fp.read() --output_password = output_password.rstrip() -- --# Parse out the username from the output_conn URL. --parsed = urlparse(params['output_conn']) --username = parsed.username or "admin@internal" --netloc = f"{parsed.hostname:parsed.port}" if parsed.port else parsed.hostname -- --# Connect to the server. --connection = sdk.Connection( -- url=urlunparse(parsed._replace(netloc=netloc)), -- username=username, -- password=output_password, -- ca_file=params['ovirt_cafile'], -- log=logging.getLogger(), -- insecure=params['insecure'], --) -- --with closing(connection): -- system_service = connection.system_service() -- image_transfers_service = system_service.image_transfers_service() -- -- # Try to cancel the transfers. This should delete the associated disk. -- for id in params['transfer_ids']: -- try: -- transfer_service = \ -- image_transfers_service.image_transfer_service(id) -- transfer_service.cancel() -- except sdk.NotFoundError: -- debug("unexpected error: transfer id %s not found" % id) -- except Exception: -- if params['verbose']: -- traceback.print_exc() -- -- disks_service = system_service.disks_service() -- -- # In case we didn't associate a disk with a transfer and as a last -- # resort, delete the disk too. -- for uuid in params['disk_uuids']: -- try: -- disk_service = disks_service.disk_service(uuid) -- disk_service.remove() -- except (sdk.NotFoundError, sdk.Error): -- # We expect these exceptions so ignore them. -- pass -- except Exception: -- if params['verbose']: -- traceback.print_exc() -diff --git a/output/ovirt-upload-createvm.py b/output/ovirt-upload-createvm.py -deleted file mode 100644 -index 6afde782..00000000 ---- a/output/ovirt-upload-createvm.py -+++ /dev/null -@@ -1,137 +0,0 @@ --# -*- python -*- --# oVirt upload create VM used by ‘virt-v2v -o ovirt-upload’ --# Copyright (C) 2018 Red Hat Inc. --# --# This program is free software; you can redistribute it and/or modify --# it under the terms of the GNU General Public License as published by --# the Free Software Foundation; either version 2 of the License, or --# (at your option) any later version. --# --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY; without even the implied warranty of --# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --# GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License along --# with this program; if not, write to the Free Software Foundation, Inc., --# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- --import json --import logging --import sys --import time --import uuid -- --from urllib.parse import urlparse, urlunparse -- --import ovirtsdk4 as sdk --import ovirtsdk4.types as types -- -- --def debug(s): -- if params['verbose']: -- print(s, file=sys.stderr) -- sys.stderr.flush() -- -- --def jobs_completed(system_service, correlation_id): -- jobs_service = system_service.jobs_service() -- -- try: -- jobs = jobs_service.list( -- search="correlation_id=%s" % correlation_id) -- except sdk.Error as e: -- debug( -- "Error searching for jobs with correlation id %s: %s" % -- (correlation_id, e)) -- # We don't know, assume that jobs did not complete yet. -- return False -- -- # STARTED is the only "in progress" status, anything else means the job -- # has already terminated. -- if all(job.status != types.JobStatus.STARTED for job in jobs): -- failed_jobs = [(job.description, str(job.status)) -- for job in jobs -- if job.status != types.JobStatus.FINISHED] -- if failed_jobs: -- raise RuntimeError( -- "Failed to create a VM! Failed jobs: %r" % failed_jobs) -- return True -- else: -- running_jobs = [(job.description, str(job.status)) for job in jobs] -- debug("Some jobs with correlation id %s are running: %s" % -- (correlation_id, running_jobs)) -- return False -- -- --# Seconds to wait for the VM import job to complete in oVirt. --timeout = 3 * 60 -- --# Parameters are passed in via a JSON doc from the OCaml code. --# Because this Python code ships embedded inside virt-v2v there --# is no formal API here. --params = None --ovf = None # OVF file -- --if len(sys.argv) != 3: -- raise RuntimeError("incorrect number of parameters") -- --# Parameters are passed in via a JSON document. --with open(sys.argv[1], 'r') as fp: -- params = json.load(fp) -- --# What is passed in is a password file, read the actual password. --with open(params['output_password'], 'r') as fp: -- output_password = fp.read() --output_password = output_password.rstrip() -- --# Read the OVF document. --with open(sys.argv[2], 'r') as fp: -- ovf = fp.read() -- --# Parse out the username from the output_conn URL. --parsed = urlparse(params['output_conn']) --username = parsed.username or "admin@internal" --netloc = f"{parsed.hostname:parsed.port}" if parsed.port else parsed.hostname -- --# Connect to the server. --connection = sdk.Connection( -- url=urlunparse(parsed._replace(netloc=netloc)), -- username=username, -- password=output_password, -- ca_file=params['ovirt_cafile'], -- log=logging.getLogger(), -- insecure=params['insecure'], --) -- --system_service = connection.system_service() -- --# Get the cluster. --cluster = system_service.clusters_service().cluster_service(params['ovirt_cluster_uuid']) --cluster = cluster.get() -- --correlation_id = str(uuid.uuid4()) --vms_service = system_service.vms_service() --vm = vms_service.add( -- types.Vm( -- cluster=cluster, -- initialization=types.Initialization( -- configuration=types.Configuration( -- type=types.ConfigurationType.OVA, -- data=ovf, -- ) -- ) -- ), -- query={'correlation_id': correlation_id}, --) -- --# Wait for the import job to finish. --endt = time.monotonic() + timeout --while True: -- time.sleep(10) -- if jobs_completed(system_service, correlation_id): -- break -- if time.monotonic() > endt: -- raise RuntimeError( -- "Timed out waiting for VM creation!" -- " Jobs still running for correlation id %s" % correlation_id) -diff --git a/output/ovirt-upload-finalize.py b/output/ovirt-upload-finalize.py -deleted file mode 100644 -index 8dd4a731..00000000 ---- a/output/ovirt-upload-finalize.py -+++ /dev/null -@@ -1,174 +0,0 @@ --# -*- python -*- --# oVirt upload finalize used by ‘virt-v2v -o ovirt-upload’ --# Copyright (C) 2018-2025 Red Hat Inc. --# --# This program is free software; you can redistribute it and/or modify --# it under the terms of the GNU General Public License as published by --# the Free Software Foundation; either version 2 of the License, or --# (at your option) any later version. --# --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY; without even the implied warranty of --# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --# GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License along --# with this program; if not, write to the Free Software Foundation, Inc., --# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- --import json --import logging --import sys --import time --from urllib.parse import urlparse, urlunparse -- --import ovirtsdk4 as sdk --import ovirtsdk4.types as types -- --# Timeout to wait for oVirt disks to change status, or the transfer --# object to finish initializing [seconds]. --timeout = 5 * 60 -- -- --def debug(s): -- if params['verbose']: -- print(s, file=sys.stderr) -- sys.stderr.flush() -- -- --def finalize_transfer(connection, transfer_id, disk_id): -- """ -- Finalize a transfer, making the transfer disk available. -- -- If finalizing succeeds, the transfer's disk status will change to OK -- and transfer's phase will change to FINISHED_SUCCESS. Unfortunately, -- the disk status is modified before the transfer finishes, and oVirt -- may still hold a lock on the disk at this point. -- -- The only way to make sure that the disk is unlocked, is to wait -- until the transfer phase switches FINISHED_SUCCESS. Unfortunately -- oVirt makes this hard to use because the transfer is removed shortly -- after switching the phase to the final phase. However if the -- transfer was removed, we can be sure that the disk is not locked, -- since oVirt releases the locks before removing the transfer. -- -- On errors, the transfer's phase will change to FINISHED_FAILURE and -- the disk status will change to ILLEGAL and it will be removed. Again -- the transfer will be removed shortly after that. -- -- If oVirt fails to finalize the transfer, transfer's phase will -- change to PAUSED_SYSTEM. In this case the disk's status will change -- to ILLEGAL and it will not be removed. -- -- oVirt 4.4.7 made waiting for transfer easier by keeping transfers -- after they complete, but we must support older versions so we have -- generic code that work with any version. -- -- For more info see: -- - http://ovirt.github.io/ovirt-engine-api-model/4.4/#services/image_transfer -- - http://ovirt.github.io/ovirt-engine-sdk/master/types.m.html#ovirtsdk4.types.ImageTransfer -- """ -- debug("finalizing transfer %s" % transfer_id) -- transfer_service = (connection.system_service() -- .image_transfers_service() -- .image_transfer_service(transfer_id)) -- -- start = time.monotonic() -- -- transfer_service.finalize() -- -- while True: -- time.sleep(1) -- try: -- transfer = transfer_service.get() -- except sdk.NotFoundError: -- # Transfer was removed (ovirt < 4.4.7). We need to check the -- # disk status to understand if the transfer was successful. -- # Due to the way oVirt does locking, we know that the disk -- # is unlocked at this point so we can check only once. -- -- debug("transfer %s was removed, checking disk %s status" -- % (transfer_id, disk_id)) -- -- disk_service = (connection.system_service() -- .disks_service() -- .disk_service(disk_id)) -- -- try: -- disk = disk_service.get() -- except sdk.NotFoundError: -- raise RuntimeError( -- "transfer %s failed: disk %s was removed" -- % (transfer_id, disk_id)) -- -- debug("disk %s is %s" % (disk.id, disk.status)) -- -- if disk.status == types.DiskStatus.OK: -- break -- -- raise RuntimeError( -- "transfer %s failed: disk is %s" % (transfer_id, disk.status)) -- else: -- # Transfer exists, check if it reached one of the final -- # phases, or we timed out. -- -- debug("transfer %s is %s" % (transfer.id, transfer.phase)) -- -- if transfer.phase == types.ImageTransferPhase.FINISHED_SUCCESS: -- break -- -- if transfer.phase == types.ImageTransferPhase.FINISHED_FAILURE: -- raise RuntimeError( -- "transfer %s has failed" % (transfer_id,)) -- -- if transfer.phase == types.ImageTransferPhase.PAUSED_SYSTEM: -- raise RuntimeError( -- "transfer %s was paused by system" % (transfer.id,)) -- -- if time.monotonic() > start + timeout: -- raise RuntimeError( -- "timed out waiting for transfer %s to finalize, " -- "transfer is %s" -- % (transfer.id, transfer.phase)) -- -- debug("transfer %s finalized in %.3f seconds" -- % (transfer_id, time.monotonic() - start)) -- -- --# Parameters are passed in via a JSON doc from the OCaml code. --# Because this Python code ships embedded inside virt-v2v there --# is no formal API here. --params = None -- --if len(sys.argv) != 2: -- raise RuntimeError("incorrect number of parameters") -- --# Parameters are passed in via a JSON document. --with open(sys.argv[1], 'r') as fp: -- params = json.load(fp) -- --# What is passed in is a password file, read the actual password. --with open(params['output_password'], 'r') as fp: -- output_password = fp.read() --output_password = output_password.rstrip() -- --# Parse out the username from the output_conn URL. --parsed = urlparse(params['output_conn']) --username = parsed.username or "admin@internal" --netloc = f"{parsed.hostname:parsed.port}" if parsed.port else parsed.hostname -- --# Connect to the server. --connection = sdk.Connection( -- url=urlunparse(parsed._replace(netloc=netloc)), -- username=username, -- password=output_password, -- ca_file=params['ovirt_cafile'], -- log=logging.getLogger(), -- insecure=params['insecure'], --) -- --# Finalize all the transfers. --for (transfer_id, disk_id) in zip(params['transfer_ids'], params['disk_uuids']): -- finalize_transfer(connection, transfer_id, disk_id) -- --connection.close() -diff --git a/output/ovirt-upload-plugin.py b/output/ovirt-upload-plugin.py -deleted file mode 100644 -index a10ecfd5..00000000 ---- a/output/ovirt-upload-plugin.py -+++ /dev/null -@@ -1,525 +0,0 @@ --# -*- python -*- --# oVirt upload nbdkit plugin used by ‘virt-v2v -o ovirt-upload’ --# Copyright (C) 2018-2025 Red Hat Inc. --# --# This program is free software; you can redistribute it and/or modify --# it under the terms of the GNU General Public License as published by --# the Free Software Foundation; either version 2 of the License, or --# (at your option) any later version. --# --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY; without even the implied warranty of --# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --# GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License along --# with this program; if not, write to the Free Software Foundation, Inc., --# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- --import json --import queue --import socket --import ssl --import threading --import time -- --from contextlib import contextmanager --from http.client import HTTPSConnection, HTTPConnection --from urllib.parse import urlparse -- --import nbdkit -- --# Using version 2 supporting the buffer protocol for better performance. --API_VERSION = 2 -- --# Maximum number of connection to imageio server. Based on testing with imageio --# client, this give best performance. --MAX_CONNECTIONS = 4 -- --# Maximum idle time allowed for imageio connections. --IDLE_TIMEOUT = 30 -- --# Required parameters. --size = None --url = None -- --# Optional parameters. --cafile = None --insecure = False --is_ovirt_host = False -- --# List of options read from imageio server. --options = None -- --# Pool of HTTP connections. --pool = None -- --# Set when plugin is cleaning up. --done = threading.Event() -- --# Set when periodic flush request fails. --pool_error = None -- -- --# Parse parameters. --def config(key, value): -- global cafile, url, is_ovirt_host, insecure, size -- -- if key == "cafile": -- cafile = value -- elif key == "insecure": -- insecure = value.lower() in ['true', '1'] -- elif key == "is_ovirt_host": -- is_ovirt_host = value.lower() in ['true', '1'] -- elif key == "size": -- size = int(value) -- elif key == "url": -- url = urlparse(value) -- else: -- raise RuntimeError("unknown configuration key '%s'" % key) -- -- --def config_complete(): -- # These parameters are required. -- if url is None: -- raise RuntimeError("url parameter was not set") -- if size is None: -- raise RuntimeError("size parameter was not set") -- -- --def after_fork(): -- global options, pool -- -- http = create_http(url) -- options = get_options(http, url) -- http.close() -- -- nbdkit.debug("imageio features: flush=%(can_flush)r " -- "zero=%(can_zero)r unix_socket=%(unix_socket)r " -- "max_readers=%(max_readers)r max_writers=%(max_writers)r" -- % options) -- -- pool = create_http_pool(url, options) -- -- t = threading.Thread(target=pool_keeper, name="poolkeeper") -- t.daemon = True -- t.start() -- -- --# This function is not actually defined before nbdkit 1.28, but it --# doesn't particularly matter if we don't close the pool because --# clients should call flush(). --def cleanup(): -- nbdkit.debug("cleaning up") -- done.set() -- close_http_pool(pool) -- -- --def thread_model(): -- """ -- Using parallel model to speed up transfer with multiple connections to -- imageio server. -- """ -- return nbdkit.THREAD_MODEL_PARALLEL -- -- --def open(readonly): -- return 1 -- -- --def can_trim(h): -- return False -- -- --def can_flush(h): -- return options['can_flush'] -- -- --def can_fua(h): -- # imageio flush feature is is compatible with NBD_CMD_FLAG_FUA. -- return options['can_flush'] -- -- --def can_multi_conn(h): -- # We can always handle multiple connections, and the number of NBD -- # connections is independent of the number of HTTP clients in the -- # pool. -- return True -- -- --def get_size(h): -- return size -- -- --# Any unexpected HTTP response status from the server will end up calling this --# function which logs the full error, and raises a RuntimeError exception. --def request_failed(r, msg): -- status = r.status -- reason = r.reason -- try: -- body = r.read() -- except EnvironmentError as e: -- body = "(Unable to read response body: %s)" % e -- -- # Log the full error if we're verbose. -- nbdkit.debug("unexpected response from imageio server:") -- nbdkit.debug(msg) -- nbdkit.debug("%d: %s" % (status, reason)) -- nbdkit.debug(body) -- -- # Only a short error is included in the exception. -- raise RuntimeError("%s: %d %s: %r" % (msg, status, reason, body[:200])) -- -- --# For documentation see: --# https://github.com/oVirt/ovirt-imageio/blob/master/docs/random-io.md --# For examples of working code to read/write from the server, see: --# https://github.com/oVirt/ovirt-imageio/blob/master/daemon/test/server_test.py --def pread(h, buf, offset, flags): -- count = len(buf) -- headers = {"Range": "bytes=%d-%d" % (offset, offset + count - 1)} -- -- with http_context(pool) as http: -- http.request("GET", url.path, headers=headers) -- -- r = http.getresponse() -- # 206 = HTTP Partial Content. -- if r.status != 206: -- request_failed(r, -- "could not read sector offset %d size %d" % -- (offset, count)) -- -- content_length = int(r.getheader("content-length")) -- if content_length != count: -- # Should never happen. -- request_failed(r, -- "unexpected Content-Length offset %d size %d got %d" % -- (offset, count, content_length)) -- -- with memoryview(buf) as view: -- got = 0 -- while got < count: -- n = r.readinto(view[got:]) -- if n == 0: -- request_failed(r, -- "short read offset %d size %d got %d" % -- (offset, count, got)) -- got += n -- -- --def pwrite(h, buf, offset, flags): -- count = len(buf) -- -- flush = "y" if (options['can_flush'] and (flags & nbdkit.FLAG_FUA)) else "n" -- -- with http_context(pool) as http: -- http.putrequest("PUT", url.path + "?flush=" + flush) -- # The oVirt server only uses the first part of the range, and the -- # content-length. -- http.putheader("Content-Range", "bytes %d-%d/*" % -- (offset, offset + count - 1)) -- http.putheader("Content-Length", str(count)) -- http.endheaders() -- -- try: -- http.send(buf) -- except BrokenPipeError: -- pass -- -- r = http.getresponse() -- if r.status != 200: -- request_failed(r, -- "could not write sector offset %d size %d" % -- (offset, count)) -- -- r.read() -- -- --def zero(h, count, offset, flags): -- # Unlike the trim and flush calls, there is no 'can_zero' method -- # so nbdkit could call this even if the server doesn't support -- # zeroing. If this is the case we must emulate. -- if not options['can_zero']: -- emulate_zero(h, count, offset, flags) -- return -- -- flush = bool(options['can_flush'] and (flags & nbdkit.FLAG_FUA)) -- -- # Construct the JSON request for zeroing. -- buf = json.dumps({'op': "zero", -- 'offset': offset, -- 'size': count, -- 'flush': flush}).encode() -- -- headers = {"Content-Type": "application/json", -- "Content-Length": str(len(buf))} -- -- with http_context(pool) as http: -- http.request("PATCH", url.path, body=buf, headers=headers) -- -- r = http.getresponse() -- if r.status != 200: -- request_failed(r, -- "could not zero sector offset %d size %d" % -- (offset, count)) -- -- r.read() -- -- --def emulate_zero(h, count, offset, flags): -- flush = "y" if (options['can_flush'] and (flags & nbdkit.FLAG_FUA)) else "n" -- -- with http_context(pool) as http: -- http.putrequest("PUT", url.path + "?flush=" + flush) -- http.putheader("Content-Range", -- "bytes %d-%d/*" % (offset, offset + count - 1)) -- http.putheader("Content-Length", str(count)) -- http.endheaders() -- -- try: -- buf = bytearray(128 * 1024) -- while count > len(buf): -- http.send(buf) -- count -= len(buf) -- http.send(memoryview(buf)[:count]) -- except BrokenPipeError: -- pass -- -- r = http.getresponse() -- if r.status != 200: -- request_failed(r, -- "could not write zeroes offset %d size %d" % -- (offset, count)) -- -- r.read() -- -- --def flush(h, flags): -- if pool_error: -- raise pool_error -- -- # Wait until all inflight requests are completed, and send a flush -- # request for all imageio connections. -- locked = [] -- -- # Lock the pool by taking all connections out. -- while len(locked) < pool.maxsize: -- locked.append(pool.get()) -- -- try: -- for item in locked: -- send_flush(item.http) -- item.last_used = time.monotonic() -- finally: -- # Unlock the pool by putting the connection back. -- for item in locked: -- pool.put(item) -- -- --def send_flush(http): -- # Construct the JSON request for flushing. -- buf = json.dumps({'op': "flush"}).encode() -- -- headers = {"Content-Type": "application/json", -- "Content-Length": str(len(buf))} -- -- http.request("PATCH", url.path, body=buf, headers=headers) -- -- r = http.getresponse() -- if r.status != 200: -- request_failed(r, "could not flush") -- -- r.read() -- -- --# Modify http.client.HTTPConnection to work over a Unix domain socket. --# Derived from uhttplib written by Erik van Zijst under an MIT license. --# (https://pypi.org/project/uhttplib/) --# Ported to Python 3 by Irit Goihman. --class UnixHTTPConnection(HTTPConnection): -- def __init__(self, path, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): -- self.path = path -- HTTPConnection.__init__(self, "localhost", timeout=timeout) -- -- def connect(self): -- self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) -- if self.timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: -- self.sock.settimeout(timeout) -- self.sock.connect(self.path) -- -- --class PoolItem: -- -- def __init__(self, http): -- self.http = http -- self.last_used = None -- -- --# Connection pool. --def create_http_pool(url, options): -- count = min(options["max_readers"], -- options["max_writers"], -- MAX_CONNECTIONS) -- -- nbdkit.debug("creating http pool connections=%d" % count) -- -- unix_socket = options["unix_socket"] if is_ovirt_host else None -- -- pool = queue.Queue(count) -- -- for i in range(count): -- http = create_http(url, unix_socket=unix_socket) -- pool.put(PoolItem(http)) -- -- return pool -- -- --def pool_keeper(): -- """ -- Thread flushing idle connections, keeping them alive. -- -- If a connection does not send any request for 60 seconds, imageio -- server closes the connection. Recovering from closed connection is -- hard and unsafe, so this thread ensure that connections never -- becomes idle by sending a flush request if the connection is idle -- for too much time. -- -- In normal conditions, all connections are busy most of the time, so -- the keeper will find no idle connections. If there short delays in -- nbdcopy, the keeper will find some idle connections, but will -- quickly return them back to the pool. In the pathological case when -- nbdcopy is blocked for 3 minutes on vddk input, the keeper will send -- a flush request on all connections every ~30 seconds, until nbdcopy -- starts communicating again. -- """ -- global pool_error -- -- nbdkit.debug("poolkeeper: started") -- -- while not done.wait(IDLE_TIMEOUT / 2): -- idle = [] -- -- while True: -- try: -- idle.append(pool.get_nowait()) -- except queue.Empty: -- break -- -- if idle: -- now = time.monotonic() -- for item in idle: -- if item.last_used and now - item.last_used > IDLE_TIMEOUT: -- nbdkit.debug("poolkeeper: flushing idle connection") -- try: -- send_flush(item.http) -- item.last_used = now -- except Exception as e: -- # We will report this error on the next request. -- pool_error = e -- item.last_used = None -- -- pool.put(item) -- -- nbdkit.debug("poolkeeper: stopped") -- -- --@contextmanager --def http_context(pool): -- """ -- Context manager yielding an imageio http connection from the pool. Blocks -- until a connection is available. -- """ -- if pool_error: -- raise pool_error -- -- item = pool.get() -- try: -- yield item.http -- finally: -- item.last_used = time.monotonic() -- pool.put(item) -- -- --def close_http_pool(pool): -- """ -- Wait until all inflight requests are done, close all connections and remove -- them from the pool. -- -- No request can be served by the pool after this call. -- """ -- nbdkit.debug("closing http pool") -- -- locked = [] -- -- while len(locked) < pool.maxsize: -- locked.append(pool.get()) -- -- for item in locked: -- item.http.close() -- -- --def create_http(url, unix_socket=None): -- """ -- Create http connection for transfer url. -- -- Returns HTTPConnection. -- """ -- if unix_socket: -- nbdkit.debug("creating unix http connection socket=%r" % unix_socket) -- try: -- return UnixHTTPConnection(unix_socket) -- except Exception as e: -- # Very unlikely, but we can recover by using https. -- nbdkit.debug("cannot create unix socket connection: %s" % e) -- -- if url.scheme == "https": -- context = \ -- ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, -- cafile=cafile) -- if insecure: -- context.check_hostname = False -- context.verify_mode = ssl.CERT_NONE -- -- nbdkit.debug("creating https connection host=%s port=%s" % -- (url.hostname, url.port)) -- return HTTPSConnection(url.hostname, url.port, context=context) -- elif url.scheme == "http": -- nbdkit.debug("creating http connection host=%s port=%s" % -- (url.hostname, url.port)) -- return HTTPConnection(url.hostname, url.port) -- else: -- raise RuntimeError("unknown URL scheme (%s)" % url.scheme) -- -- --def get_options(http, url): -- """ -- Send OPTIONS request to imageio server and return options dict. -- """ -- http.request("OPTIONS", url.path) -- r = http.getresponse() -- data = r.read() -- -- if r.status == 200: -- j = json.loads(data) -- features = j["features"] -- return { -- "can_flush": "flush" in features, -- "can_zero": "zero" in features, -- "unix_socket": j.get('unix_socket'), -- "max_readers": j.get("max_readers", 1), -- "max_writers": j.get("max_writers", 1), -- } -- -- elif r.status == 405 or r.status == 204: -- # Old imageio servers returned either 405 Method Not Allowed or -- # 204 No Content (with an empty body). -- return { -- "can_flush": False, -- "can_zero": False, -- "unix_socket": None, -- "max_readers": 1, -- "max_writers": 1, -- } -- else: -- raise RuntimeError("could not use OPTIONS request: %d: %s" % -- (r.status, r.reason)) -diff --git a/output/ovirt-upload-precheck.py b/output/ovirt-upload-precheck.py -deleted file mode 100644 -index 00d5a829..00000000 ---- a/output/ovirt-upload-precheck.py -+++ /dev/null -@@ -1,135 +0,0 @@ --# -*- python -*- --# oVirt pre-upload checks used by ‘virt-v2v -o ovirt-upload’ --# Copyright (C) 2018-2025 Red Hat Inc. --# --# This program is free software; you can redistribute it and/or modify --# it under the terms of the GNU General Public License as published by --# the Free Software Foundation; either version 2 of the License, or --# (at your option) any later version. --# --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY; without even the implied warranty of --# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --# GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License along --# with this program; if not, write to the Free Software Foundation, Inc., --# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- --import json --import logging --import re --import sys -- --from urllib.parse import urlparse, urlunparse -- --import ovirtsdk4 as sdk --import ovirtsdk4.types as types -- --# Parameters are passed in via a JSON doc from the OCaml code. --# Because this Python code ships embedded inside virt-v2v there --# is no formal API here. --params = None -- --if len(sys.argv) != 2: -- raise RuntimeError("incorrect number of parameters") -- --# Parameters are passed in via a JSON document. --with open(sys.argv[1], 'r') as fp: -- params = json.load(fp) -- --# What is passed in is a password file, read the actual password. --with open(params['output_password'], 'r') as fp: -- output_password = fp.read() --output_password = output_password.rstrip() -- --# Parse out the username from the output_conn URL. --parsed = urlparse(params['output_conn']) --username = parsed.username or "admin@internal" --netloc = f"{parsed.hostname:parsed.port}" if parsed.port else parsed.hostname -- --# Check the storage domain name is valid --# (https://bugzilla.redhat.com/show_bug.cgi?id=1986386#c1) --# Also this means it cannot contain spaces or glob symbols, so --# the search below is valid. --output_storage = params['output_storage'] --if not re.match('^[-a-zA-Z0-9_]+$', output_storage): -- raise RuntimeError("The storage domain (-os) parameter ‘%s’ is not valid" % -- output_storage) -- --# Connect to the server. --connection = sdk.Connection( -- url=urlunparse(parsed._replace(netloc=netloc)), -- username=username, -- password=output_password, -- ca_file=params['ovirt_cafile'], -- log=logging.getLogger(), -- insecure=params['insecure'], --) -- --system_service = connection.system_service() -- --# Check whether there is a datacenter for the specified storage. --data_centers = system_service.data_centers_service().list( -- search='storage.name=%s' % output_storage, -- case_sensitive=True, --) --if len(data_centers) == 0: -- storage_domains = system_service.storage_domains_service().list( -- search='name=%s' % output_storage, -- case_sensitive=True, -- ) -- if len(storage_domains) == 0: -- # The storage domain does not even exist. -- raise RuntimeError("The storage domain ‘%s’ does not exist" % -- output_storage) -- -- # The storage domain is not attached to a datacenter -- # (shouldn't happen, would fail on disk creation). -- raise RuntimeError("The storage domain ‘%s’ is not attached to a DC" % -- output_storage) --datacenter = data_centers[0] -- --# Get the storage domain. --storage_domains = connection.follow_link(datacenter.storage_domains) --try: -- storage_domain = [sd for sd in storage_domains -- if sd.name == output_storage][0] --except IndexError: -- raise RuntimeError("The storage domain ‘%s’ does not exist" % -- output_storage) -- --# Get the cluster. --clusters = connection.follow_link(datacenter.clusters) --clusters = [cluster for cluster in clusters if cluster.name == params['ovirt_cluster']] --if len(clusters) == 0: -- raise RuntimeError("The cluster ‘%s’ is not part of the DC ‘%s’, " -- "where the storage domain ‘%s’ is" % -- (params['ovirt_cluster'], datacenter.name, -- output_storage)) --cluster = clusters[0] --cpu = cluster.cpu --if cpu.architecture == types.Architecture.UNDEFINED: -- raise RuntimeError("The cluster ‘%s’ has an unknown architecture" % -- (params['ovirt_cluster'])) -- --# Find if any disk already exists with specified UUID. --# Only used with -oo ovirt-disk-uuid. It is assumed that the --# random UUIDs that we generate are unlikely to conflict. --disks_service = system_service.disks_service() -- --for uuid in params.get('ovirt_disk_uuids', []): -- try: -- disk_service = disks_service.disk_service(uuid).get() -- raise RuntimeError("Disk with the UUID '%s' already exists" % uuid) -- except sdk.NotFoundError: -- pass -- --# Otherwise everything is OK, print a JSON with the results. --results = { -- "ovirt_storagedomain_uuid": storage_domain.id, -- "ovirt_cluster_uuid": cluster.id, -- "ovirt_cluster_cpu_architecture": cpu.architecture.value, --} -- --json.dump(results, sys.stdout) -diff --git a/output/ovirt-upload-transfer.py b/output/ovirt-upload-transfer.py -deleted file mode 100644 -index 22a99592..00000000 ---- a/output/ovirt-upload-transfer.py -+++ /dev/null -@@ -1,298 +0,0 @@ --# -*- python -*- --# oVirt upload start transfer used by ‘virt-v2v -o ovirt-upload’ --# Copyright (C) 2018-2025 Red Hat Inc. --# --# This program is free software; you can redistribute it and/or modify --# it under the terms of the GNU General Public License as published by --# the Free Software Foundation; either version 2 of the License, or --# (at your option) any later version. --# --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY; without even the implied warranty of --# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --# GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License along --# with this program; if not, write to the Free Software Foundation, Inc., --# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- --import inspect --import json --import logging --import sys --import time --from contextlib import closing --from urllib.parse import urlparse, urlunparse -- --import ovirtsdk4 as sdk --import ovirtsdk4.types as types -- --# Timeout to wait for oVirt disks to change status, or the transfer --# object to finish initializing [seconds]. --timeout = 5 * 60 -- -- --def debug(s): -- if params['verbose']: -- print(s, file=sys.stderr) -- sys.stderr.flush() -- -- --def find_host(connection): -- """Return the current host object or None.""" -- try: -- with open("/etc/vdsm/vdsm.id") as f: -- vdsm_id = f.readline().strip() -- except FileNotFoundError: -- # Expected condition when running on non-oVirt host. -- debug("not an oVirt host, using non-oVirt host") -- return None -- except Exception as e: -- # Unexpected but we can degrade to remote transfer. -- debug(f"warning: cannot read host id, using non-oVirt host: {e}") -- return None -- -- debug("hw_id = %r" % vdsm_id) -- -- system_service = connection.system_service() -- storage_name = params['output_storage'] -- data_centers = system_service.data_centers_service().list( -- search='storage.name=%s' % storage_name, -- case_sensitive=True, -- ) -- if len(data_centers) == 0: -- # The storage domain is not attached to a datacenter -- # (shouldn't happen, would fail on disk creation). -- debug("storage domain (%s) is not attached to a DC" % storage_name) -- return None -- -- datacenter = data_centers[0] -- debug("datacenter = %s" % datacenter.name) -- -- hosts_service = system_service.hosts_service() -- hosts = hosts_service.list( -- search="hw_id=%s and datacenter=%s and status=Up" -- % (vdsm_id, datacenter.name), -- case_sensitive=True, -- ) -- if len(hosts) == 0: -- # Couldn't find a host that's fulfilling the following criteria: -- # - 'hw_id' equals to 'vdsm_id' -- # - Its status is 'Up' -- # - Belongs to the storage domain's datacenter -- debug("cannot find a running host with hw_id=%r, " -- "that belongs to datacenter '%s', " -- "using any host" % (vdsm_id, datacenter.name)) -- return None -- -- host = hosts[0] -- debug("host.id = %r" % host.id) -- -- return types.Host(id=host.id) -- -- --def create_disk(connection): -- """ -- Create a new disk for the transfer and wait until the disk is ready. -- -- Returns disk object. -- """ -- system_service = connection.system_service() -- disks_service = system_service.disks_service() -- -- if params['disk_format'] == "raw": -- disk_format = types.DiskFormat.RAW -- else: -- disk_format = types.DiskFormat.COW -- -- disk = disks_service.add( -- disk=types.Disk( -- id=params['disk_uuid'], -- name=params['disk_name'], -- description="Uploaded by virt-v2v", -- format=disk_format, -- # XXX For qcow2 disk on block storage, we should use the estimated -- # size, based on qemu-img measure of the overlay. -- initial_size=params['disk_size'], -- provisioned_size=params['disk_size'], -- # Handling this properly will be complex, see: -- # https://www.redhat.com/archives/libguestfs/2018-March/msg00177.html -- sparse=True, -- storage_domains=[ -- types.StorageDomain( -- name=params['output_storage'], -- ) -- ], -- ) -- ) -- -- debug("disk.id = %r" % disk.id) -- -- # Wait till the disk moved from LOCKED state to OK state, as the transfer -- # can't start if the disk is locked. -- -- disk_service = disks_service.disk_service(disk.id) -- endt = time.monotonic() + timeout -- while True: -- time.sleep(1) -- disk = disk_service.get() -- if disk.status == types.DiskStatus.OK: -- break -- if time.monotonic() > endt: -- raise RuntimeError( -- "timed out waiting for disk %s to become unlocked" % disk.id) -- -- return disk -- -- --def create_transfer(connection, disk, host): -- """ -- Create image transfer and wait until the transfer is ready. -- -- Returns a transfer object. -- """ -- system_service = connection.system_service() -- transfers_service = system_service.image_transfers_service() -- -- extra = {} -- if transfer_supports_format(): -- extra["format"] = types.DiskFormat.RAW -- -- transfer = transfers_service.add( -- types.ImageTransfer( -- disk=types.Disk(id=disk.id), -- host=host, -- inactivity_timeout=3600, -- **extra, -- ) -- ) -- -- # At this point the transfer owns the disk and will delete the disk if the -- # transfer is canceled, or if finalizing the transfer fails. -- -- debug("transfer.id = %r" % transfer.id) -- -- # Get a reference to the created transfer service. -- transfer_service = transfers_service.image_transfer_service(transfer.id) -- -- # Wait until transfer's phase change from INITIALIZING to TRANSFERRING. On -- # errors transfer's phase can change to PAUSED_SYSTEM or FINISHED_FAILURE. -- # If the transfer was paused, we need to cancel it to remove the disk, -- # otherwise the system will remove the disk and transfer shortly after. -- -- endt = time.monotonic() + timeout -- while True: -- time.sleep(1) -- try: -- transfer = transfer_service.get() -- except sdk.NotFoundError: -- # The system has removed the disk and the transfer. -- raise RuntimeError("transfer %s was removed" % transfer.id) -- -- if transfer.phase == types.ImageTransferPhase.FINISHED_FAILURE: -- # The system will remove the disk and the transfer soon. -- raise RuntimeError( -- "transfer %s has failed" % transfer.id) -- -- if transfer.phase == types.ImageTransferPhase.PAUSED_SYSTEM: -- transfer_service.cancel() -- raise RuntimeError( -- "transfer %s was paused by system" % transfer.id) -- -- if transfer.phase == types.ImageTransferPhase.TRANSFERRING: -- break -- -- if transfer.phase != types.ImageTransferPhase.INITIALIZING: -- transfer_service.cancel() -- raise RuntimeError( -- "unexpected transfer %s phase %s" -- % (transfer.id, transfer.phase)) -- -- if time.monotonic() > endt: -- transfer_service.cancel() -- raise RuntimeError( -- "timed out waiting for transfer %s" % transfer.id) -- -- return transfer -- -- --def transfer_supports_format(): -- """ -- Return True if transfer supports the "format" argument, enabling the NBD -- backend on imageio side, which allows uploading to qcow2 images. -- -- This feature was added in ovirt 4.3. We assume that the SDK version matches -- engine version. -- """ -- sig = inspect.signature(types.ImageTransfer) -- return "format" in sig.parameters -- -- --def get_transfer_url(transfer): -- """ -- Returns the transfer url, preferring direct transfer if possible. -- """ -- if params['ovirt_direct']: -- if transfer.transfer_url is None: -- raise RuntimeError("direct upload to host not supported, " -- "requires ovirt-engine >= 4.2 and only works " -- "when virt-v2v is run within the oVirt " -- "environment, eg. on an oVirt node.") -- return transfer.transfer_url -- else: -- return transfer.proxy_url -- -- --# Parameters are passed in via a JSON doc from the OCaml code. --# Because this Python code ships embedded inside virt-v2v there --# is no formal API here. --params = None -- --if len(sys.argv) != 2: -- raise RuntimeError("incorrect number of parameters") -- --# Parameters are passed in via a JSON document. --with open(sys.argv[1], 'r') as fp: -- data = fp.read() -- --try: -- params = json.loads(data) --except ValueError as e: -- raise RuntimeError(f"Cannot parse params {data!r}: {e}").with_traceback( -- e.__traceback__ -- ) from None -- --# What is passed in is a password file, read the actual password. --with open(params['output_password'], 'r') as fp: -- output_password = fp.read() --output_password = output_password.rstrip() -- --# Parse out the username from the output_conn URL. --parsed = urlparse(params['output_conn']) --username = parsed.username or "admin@internal" --netloc = f"{parsed.hostname:parsed.port}" if parsed.port else parsed.hostname -- --connection = sdk.Connection( -- url=urlunparse(parsed._replace(netloc=netloc)), -- username=username, -- password=output_password, -- ca_file=params['ovirt_cafile'], -- log=logging.getLogger(), -- insecure=params['insecure'], --) -- --with closing(connection): -- # Use the local host if possible. -- host = find_host(connection) if params['ovirt_direct'] else None -- disk = create_disk(connection) -- -- transfer = create_transfer(connection, disk, host) -- destination_url = get_transfer_url(transfer) -- --# Send the destination URL, transfer ID, and host flag back to OCaml code. --results = { -- "transfer_id": transfer.id, -- "destination_url": destination_url, -- "is_ovirt_host": host is not None, --} --json.dump(results, sys.stdout) -diff --git a/output/ovirt-upload-vmcheck.py b/output/ovirt-upload-vmcheck.py -deleted file mode 100644 -index 6240046e..00000000 ---- a/output/ovirt-upload-vmcheck.py -+++ /dev/null -@@ -1,72 +0,0 @@ --# -*- python -*- --# oVirt VM existence check used by ‘virt-v2v -o ovirt-upload’ --# Copyright (C) 2018-2025 Red Hat Inc. --# --# This program is free software; you can redistribute it and/or modify --# it under the terms of the GNU General Public License as published by --# the Free Software Foundation; either version 2 of the License, or --# (at your option) any later version. --# --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY; without even the implied warranty of --# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --# GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License along --# with this program; if not, write to the Free Software Foundation, Inc., --# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- --import json --import logging --import sys -- --from urllib.parse import urlparse, urlunparse -- --import ovirtsdk4 as sdk --import ovirtsdk4.types as types -- --# Parameters are passed in via a JSON doc from the OCaml code. --# Because this Python code ships embedded inside virt-v2v there --# is no formal API here. --params = None -- --if len(sys.argv) != 2: -- raise RuntimeError("incorrect number of parameters") -- --# Parameters are passed in via a JSON document. --with open(sys.argv[1], 'r') as fp: -- params = json.load(fp) -- --# What is passed in is a password file, read the actual password. --with open(params['output_password'], 'r') as fp: -- output_password = fp.read() --output_password = output_password.rstrip() -- --# Parse out the username from the output_conn URL. --parsed = urlparse(params['output_conn']) --username = parsed.username or "admin@internal" --netloc = f"{parsed.hostname:parsed.port}" if parsed.port else parsed.hostname -- --# Connect to the server. --connection = sdk.Connection( -- url=urlunparse(parsed._replace(netloc=netloc)), -- username=username, -- password=output_password, -- ca_file=params['ovirt_cafile'], -- log=logging.getLogger(), -- insecure=params['insecure'], --) -- --system_service = connection.system_service() -- --# Find if a virtual machine already exists with that name. --vms_service = system_service.vms_service() --vms = vms_service.list( -- search=("name=%s" % params['output_name']), --) --if len(vms) > 0: -- vm = vms[0] -- raise RuntimeError("VM already exists with name ‘%s’, id ‘%s’" % -- (params['output_name'], vm.id)) -- --# Otherwise everything is OK, exit with no error. -diff --git a/output/select_output.ml b/output/select_output.ml -index b1f7d0ab..7c01b50b 100644 ---- a/output/select_output.ml -+++ b/output/select_output.ml -@@ -25,10 +25,7 @@ type output_mode = - | Libvirt - | Null - | Openstack -- | OVirt -- | OVirt_Upload - | QEmu -- | VDSM - - let output_modes = [ - Disk; -@@ -36,10 +33,7 @@ let output_modes = [ - Libvirt; - Null; - Openstack; -- OVirt; -- OVirt_Upload; - QEmu; -- VDSM; - ] - - let string_of_output_mode = function -@@ -48,10 +42,7 @@ let string_of_output_mode = function - | Libvirt -> "libvirt" - | Null -> "null" - | Openstack -> "openstack" -- | OVirt -> "ovirt" -- | OVirt_Upload -> "ovirt-upload" - | QEmu -> "qemu" -- | VDSM -> "vdsm" - - let output_mode_of_string = function - | "kubevirt" -> Kubevirt -@@ -59,11 +50,7 @@ let output_mode_of_string = function - | "disk" | "local" -> Disk - | "null" -> Null - | "openstack" | "osp" | "rhosp" -> Openstack -- | "ovirt" | "rhv" | "rhev" -> OVirt -- | "ovirt-upload" | "ovirt_upload" | "rhv-upload" | "rhv_upload" -> -- OVirt_Upload - | "qemu" -> QEmu -- | "vdsm" -> VDSM - | s -> error (f_"unknown -o option: %s") s - - let select_output = function -@@ -73,6 +60,3 @@ let select_output = function - | Some QEmu -> (module Output_qemu.QEMU) - | Some Kubevirt -> (module Output_kubevirt.Kubevirt) - | Some Openstack -> (module Output_openstack.Openstack) -- | Some OVirt_Upload -> (module Output_ovirt_upload.OVirtUpload) -- | Some OVirt -> (module Output_ovirt.OVirt) -- | Some VDSM -> (module Output_vdsm.VDSM) -diff --git a/output/select_output.mli b/output/select_output.mli -index 093c9b9a..1f8259e3 100644 ---- a/output/select_output.mli -+++ b/output/select_output.mli -@@ -22,10 +22,7 @@ type output_mode = - | Libvirt - | Null - | Openstack -- | OVirt -- | OVirt_Upload - | QEmu -- | VDSM - (** [-o] option on the command line *) - - val output_modes : output_mode list -diff --git a/tests/Makefile.am b/tests/Makefile.am -index c0aa8498..df221b73 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -99,12 +99,7 @@ TESTS = \ - test-o-local-qcow2-compressed.sh \ - test-o-null.sh \ - test-o-openstack.sh \ -- test-o-ovirt-upload-oo-query.sh \ -- test-o-ovirt-upload.sh \ -- test-o-ovirt.sh \ - test-o-qemu.sh \ -- test-o-vdsm-oo-query.sh \ -- test-o-vdsm-options.sh \ - test-oa-option-qcow2.sh \ - test-oa-option-raw.sh \ - test-of-option.sh \ -@@ -294,17 +289,7 @@ EXTRA_DIST += \ - test-o-local-qcow2-compressed.sh \ - test-o-null.sh \ - test-o-openstack.sh \ -- test-o-ovirt-upload-module/imageio.py \ -- test-o-ovirt-upload-module/ovirtsdk4/__init__.py \ -- test-o-ovirt-upload-module/ovirtsdk4/types.py \ -- test-o-ovirt-upload-oo-query.sh \ -- test-o-ovirt-upload.sh \ -- test-o-ovirt.ovf.expected \ -- test-o-ovirt.sh \ - test-o-qemu.sh \ -- test-o-vdsm-oo-query.sh \ -- test-o-vdsm-options.ovf.expected \ -- test-o-vdsm-options.sh \ - test-oa-option-qcow2.sh \ - test-oa-option-raw.sh \ - test-of-option.sh \ -diff --git a/tests/test-o-ovirt-upload-module/imageio.py b/tests/test-o-ovirt-upload-module/imageio.py -deleted file mode 100755 -index f832f8dc..00000000 ---- a/tests/test-o-ovirt-upload-module/imageio.py -+++ /dev/null -@@ -1,71 +0,0 @@ --#!/usr/bin/env python3 --# -*- python -*- --# Copyright (C) 2018-2025 Red Hat Inc. --# --# This program is free software; you can redistribute it and/or modify --# it under the terms of the GNU General Public License as published by --# the Free Software Foundation; either version 2 of the License, or --# (at your option) any later version. --# --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY; without even the implied warranty of --# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --# GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License along --# with this program; if not, write to the Free Software Foundation, Inc., --# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- --# Fake imageio web server used as a test harness. --# See v2v/test-o-ovirt-upload.sh -- --import sys --import threading --from http.server import HTTPServer, BaseHTTPRequestHandler -- --class RequestHandler(BaseHTTPRequestHandler): -- protocol_version = 'HTTP/1.1' -- -- def do_OPTIONS(self): -- self.discard_request() -- -- # Advertise only flush and zero support. -- content = b'''{ "features": [ "flush", "zero" ] }''' -- length = len(content) -- -- self.send_response(200) -- self.send_header("Content-type", "application/json; charset=UTF-8") -- self.send_header("Content-Length", length) -- self.end_headers() -- self.wfile.write(content) -- -- # eg. zero request. Just ignore it. -- def do_PATCH(self): -- self.discard_request() -- self.send_response(200) -- self.send_header("Content-Length", "0") -- self.end_headers() -- -- # Flush request. Ignore it. -- def do_PUT(self): -- self.discard_request() -- self.send_response(200) -- self.send_header("Content-Length", "0") -- self.end_headers() -- -- def discard_request(self): -- length = self.headers.get('Content-Length') -- if length: -- length = int(length) -- content = self.rfile.read(length) -- --server_address = ("", 0) --# XXX This should test HTTPS, not HTTP, because we are testing a --# different path through the main code. --httpd = HTTPServer(server_address, RequestHandler) --imageio_port = httpd.server_address[1] -- --print("port: %d" % imageio_port) --sys.stdout.flush() -- --httpd.serve_forever() -diff --git a/tests/test-o-ovirt-upload-module/ovirtsdk4/__init__.py b/tests/test-o-ovirt-upload-module/ovirtsdk4/__init__.py -deleted file mode 100644 -index 3236b0fa..00000000 ---- a/tests/test-o-ovirt-upload-module/ovirtsdk4/__init__.py -+++ /dev/null -@@ -1,150 +0,0 @@ --# -*- python -*- --# Copyright (C) 2018 Red Hat Inc. --# --# This program is free software; you can redistribute it and/or modify --# it under the terms of the GNU General Public License as published by --# the Free Software Foundation; either version 2 of the License, or --# (at your option) any later version. --# --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY; without even the implied warranty of --# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --# GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License along --# with this program; if not, write to the Free Software Foundation, Inc., --# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- --# Fake ovirtsdk4 module used as a test harness. --# See v2v/test-o-ovirt-upload.sh -- --class Error(Exception): -- pass -- -- --class NotFoundError(Error): -- pass -- -- --class Connection(object): -- def __init__( -- self, -- url=None, -- username=None, -- password=None, -- ca_file=None, -- log=None, -- insecure=False, -- debug=True, -- ): -- pass -- -- def close(self): -- pass -- -- def follow_link(self, objs): -- return objs -- -- def system_service(self): -- return SystemService() -- -- --class SystemService(object): -- def clusters_service(self): -- return ClustersService() -- -- def data_centers_service(self): -- return DataCentersService() -- -- def disks_service(self): -- return DisksService() -- -- def jobs_service(self): -- return JobsService() -- -- def image_transfers_service(self): -- return ImageTransfersService() -- -- def storage_domains_service(self): -- return StorageDomainsService() -- -- def vms_service(self): -- return VmsService() -- -- --class ClusterService(object): -- def get(self): -- return types.Cluster() -- -- --class ClustersService(object): -- def cluster_service(self, id): -- return ClusterService() -- -- --class DataCentersService(object): -- def list(self, search=None, case_sensitive=False): -- return [types.DataCenter()] -- -- --class DiskService(object): -- def __init__(self, disk_id): -- self._disk_id = disk_id -- -- def get(self): -- return types.Disk(id=self._disk_id) -- -- def remove(self): -- pass -- -- --class DisksService(object): -- def add(self, disk=None): -- disk.id = "756d81b0-d5c0-41bc-9bbe-b343c3fa3490" -- return disk -- -- def disk_service(self, disk_id): -- return DiskService(disk_id) -- -- --class JobsService(object): -- def list(self, search=None): -- return [types.Job()] -- -- --class ImageTransferService(object): -- def __init__(self): -- self._finalized = False -- -- def cancel(self): -- pass -- -- def get(self): -- if self._finalized: -- raise NotFoundError -- else: -- return types.ImageTransfer() -- -- def finalize(self): -- self._finalized = True -- -- --class ImageTransfersService(object): -- def add(self, transfer): -- return transfer -- -- def image_transfer_service(self, id): -- return ImageTransferService() -- -- --class StorageDomainsService(object): -- def list(self, search=None, case_sensitive=False): -- return [StorageDomain()] -- -- --class VmsService(object): -- def add(self, vm, query=None): -- return vm -- -- def list(self, search=None): -- return [] -diff --git a/tests/test-o-ovirt-upload-module/ovirtsdk4/types.py b/tests/test-o-ovirt-upload-module/ovirtsdk4/types.py -deleted file mode 100644 -index ca2a0562..00000000 ---- a/tests/test-o-ovirt-upload-module/ovirtsdk4/types.py -+++ /dev/null -@@ -1,184 +0,0 @@ --# -*- python -*- --# Copyright (C) 2018 Red Hat Inc. --# --# This program is free software; you can redistribute it and/or modify --# it under the terms of the GNU General Public License as published by --# the Free Software Foundation; either version 2 of the License, or --# (at your option) any later version. --# --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY; without even the implied warranty of --# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --# GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License along --# with this program; if not, write to the Free Software Foundation, Inc., --# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- --# Fake ovirtsdk4 module used as a test harness. --# See v2v/test-o-ovirt-upload.sh -- --import os --from enum import Enum -- --imageio_port = os.getenv("IMAGEIO_PORT") --assert imageio_port is not None -- -- --class Architecture(Enum): -- UNDEFINED = "undefined" -- X86_64 = "x86_64" -- -- def __init__(self, arch): -- self._arch = arch -- -- def __str__(self): -- return self._arch -- -- --class Cpu(object): -- architecture = Architecture.X86_64 -- -- --class Cluster(object): -- id = "2e97537b-a783-4706-af9e-75cb2e032dcd" -- name = "Default" -- cpu = Cpu() -- -- --class Configuration(object): -- def __init__(self, type=None, data=None): -- pass -- -- --class ConfigurationType(Enum): -- OVA = 'ova' -- OVF = 'ovf' -- -- def __init__(self, image): -- self._image = image -- -- def __str__(self): -- return self._image -- -- --class DiskFormat(Enum): -- COW = "cow" -- RAW = "raw" -- -- def __init__(self, image): -- self._image = image -- -- def __str__(self): -- return self._image -- -- --class DiskStatus(Enum): -- ILLEGAL = "illegal" -- LOCKED = "locked" -- OK = "ok" -- -- def __init__(self, image): -- self._image = image -- -- def __str__(self): -- return self._image -- -- --class Disk(object): -- def __init__( -- self, -- id=None, -- name=None, -- description=None, -- format=None, -- initial_size=None, -- provisioned_size=None, -- sparse=False, -- storage_domains=None -- ): -- self.id = id -- -- status = DiskStatus.OK -- -- --class ImageTransferPhase(Enum): -- CANCELLED = 'cancelled' -- FINALIZING_FAILURE = 'finalizing_failure' -- FINALIZING_SUCCESS = 'finalizing_success' -- FINISHED_FAILURE = 'finished_failure' -- FINISHED_SUCCESS = 'finished_success' -- INITIALIZING = 'initializing' -- PAUSED_SYSTEM = 'paused_system' -- PAUSED_USER = 'paused_user' -- RESUMING = 'resuming' -- TRANSFERRING = 'transferring' -- UNKNOWN = 'unknown' -- -- def __init__(self, image): -- self._image = image -- -- def __str__(self): -- return self._image -- -- --class ImageTransfer(object): -- def __init__( -- self, -- disk=None, -- host=None, -- inactivity_timeout=None, -- ): -- pass -- -- id = "e26ac8ab-7090-4d5e-95ad-e707b511a359" -- phase = ImageTransferPhase.TRANSFERRING -- transfer_url = "http://localhost:" + imageio_port + "/" -- -- --class Initialization(object): -- def __init__(self, configuration): -- pass -- -- --class JobStatus(Enum): -- ABORTED = "aborted" -- FAILED = "failed" -- FINISHED = "finished" -- STARTED = "started" -- UNKNOWN = "unknown" -- -- def __init__(self, image): -- self._image = image -- -- def __str__(self): -- return self._image -- -- --class Job(object): -- description = "Fake job" -- status = JobStatus.FINISHED -- -- --class StorageDomain(object): -- def __init__(self, name=None): -- pass -- -- id = "ba87af68-b630-4211-a73a-694c1a689405" -- name = "Storage" -- -- --class Vm(object): -- def __init__( -- self, -- cluster=None, -- initialization=None -- ): -- pass -- -- --class DataCenter(object): -- id = "31d8c73b-554b-4958-bb04-9ce97f0849e1" -- name = "DC" -- storage_domains = [StorageDomain()] -- clusters = [Cluster()] -diff --git a/tests/test-o-ovirt-upload-oo-query.sh b/tests/test-o-ovirt-upload-oo-query.sh -deleted file mode 100755 -index 771f0613..00000000 ---- a/tests/test-o-ovirt-upload-oo-query.sh -+++ /dev/null -@@ -1,41 +0,0 @@ --#!/bin/bash - --# libguestfs virt-v2v test script --# Copyright (C) 2018 Red Hat Inc. --# --# This program is free software; you can redistribute it and/or modify --# it under the terms of the GNU General Public License as published by --# the Free Software Foundation; either version 2 of the License, or --# (at your option) any later version. --# --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY; without even the implied warranty of --# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --# GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License --# along with this program; if not, write to the Free Software --# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- --# Test -oo "?" option. -- --set -e -- --source ./functions.sh --set -e --set -x -- --skip_if_skipped -- --export VIRT_TOOLS_DATA_DIR="$srcdir/../test-data/fake-virt-tools" --export VIRTIO_WIN="$srcdir/../test-data/fake-virtio-win/drivers" -- --f=test-o-ovirt-upload-oo-query.actual --rm -f $f -- --$VG virt-v2v --debug-gc \ -- -o ovirt-upload -oo "?" > $f -- --grep -- "-oo ovirt-cafile" $f --grep -- "-oo ovirt-verifypeer" $f -- --rm $f -diff --git a/tests/test-o-ovirt-upload.sh b/tests/test-o-ovirt-upload.sh -deleted file mode 100755 -index c4a1fc92..00000000 ---- a/tests/test-o-ovirt-upload.sh -+++ /dev/null -@@ -1,74 +0,0 @@ --#!/bin/bash - --# libguestfs virt-v2v test script --# Copyright (C) 2018 Red Hat Inc. --# --# This program is free software; you can redistribute it and/or modify --# it under the terms of the GNU General Public License as published by --# the Free Software Foundation; either version 2 of the License, or --# (at your option) any later version. --# --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY; without even the implied warranty of --# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --# GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License --# along with this program; if not, write to the Free Software --# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- --# Test -o ovirt-upload. --# --# These uses a test harness (see --# tests/test-o-ovirt-upload-module/ovirtsdk4) to fake responses from --# oVirt. -- --set -e --set -x -- --source ./functions.sh --set -e --set -x -- --skip_if_skipped --requires python3 --version --requires nbdkit python --version --requires test -s ../test-data/phony-guests/windows.img -- --libvirt_uri="test://$abs_top_builddir/test-data/phony-guests/guests.xml" --f=../test-data/phony-guests/windows.img -- --export VIRT_TOOLS_DATA_DIR="$srcdir/../test-data/fake-virt-tools" --export VIRTIO_WIN="$srcdir/../test-data/fake-virtio-win/drivers" --export PYTHONPATH=$srcdir/test-o-ovirt-upload-module:$PYTHONPATH -- --# Run the imageio process and get the port number. --log=test-o-ovirt-upload.webserver.log --rm -f $log --cleanup_fn rm -f $log --$srcdir/test-o-ovirt-upload-module/imageio.py >$log 2>&1 & --pid=$! --cleanup_fn kill $pid --export IMAGEIO_PORT= --for i in {1..5}; do -- IMAGEIO_PORT=$( grep "^port:" $log | awk '{print $2}' ) -- if [ -n "$IMAGEIO_PORT" ]; then break; fi -- sleep 3 --done --if [ ! -n "$IMAGEIO_PORT" ]; then -- echo "$0: imageio process did not start up" -- cat $log -- exit 1 --fi --echo IMAGEIO_PORT=$IMAGEIO_PORT -- --# Run virt-v2v -o ovirt-upload. --# --# The fake ovirtsdk4 module doesn't care about most of the options --# like -oc, -oo ovirt-cafile, -op etc. Any values may be used. --$VG virt-v2v --debug-gc -v -x \ -- -i libvirt -ic "$libvirt_uri" windows \ -- -o ovirt-upload \ -- -oc https://example.com/ovirt-engine/api \ -- -oo ovirt-cafile=/dev/null \ -- -op /dev/null \ -- -os Storage -diff --git a/tests/test-o-ovirt.ovf.expected b/tests/test-o-ovirt.ovf.expected -deleted file mode 100644 -index 4f437d88..00000000 ---- a/tests/test-o-ovirt.ovf.expected -+++ /dev/null -@@ -1,113 +0,0 @@ -- -- -- -- -- -- --
-- List of networks -- --
--
-- List of Virtual Disks -- --
-- -- windows -- 00000000-0000-0000-0000-000000000000 -- Blank -- generated by virt-v2v -- -- #DATE# -- True -- False -- -- False -- 1 -- 2 -- 1 --
-- Windows Server 2022 Phony Edition -- windows_2022 --
--
-- 1 CPU, 1024 Memory -- -- 1 virtual cpu -- Number of virtual CPU -- 1 -- 3 -- 1 -- 1 -- -- -- 1024 MB of memory -- Memory Size -- 2 -- 4 -- MegaBytes -- 1024 -- -- -- USB Controller -- 3 -- 23 -- Disabled -- -- -- Graphical Controller -- #UUID# -- 20 -- video -- 1 -- vga -- -- -- RNG Device -- #UUID# -- 0 -- rng -- virtio -- -- urandom -- -- -- -- Memory Ballooning Device -- #UUID# -- 0 -- balloon -- memballoon -- -- virtio -- -- -- -- Drive 1 -- #VOL_ID# -- 17 -- disk -- #DISK_ID#/#VOL_ID# -- 00000000-0000-0000-0000-000000000000 -- 00000000-0000-0000-0000-000000000000 -- -- 12345678-1234-1234-1234-123456789abc -- 00000000-0000-0000-0000-000000000000 -- #DATE# -- #DATE# -- #DATE# -- 1 -- -- -- #UUID# -- Ethernet adapter on default -- 10 -- 3 -- interface -- default -- eth0 -- 00:11:22:33:44:55 -- --
--
--
-diff --git a/tests/test-o-ovirt.sh b/tests/test-o-ovirt.sh -deleted file mode 100755 -index cb0d2ccf..00000000 ---- a/tests/test-o-ovirt.sh -+++ /dev/null -@@ -1,87 +0,0 @@ --#!/bin/bash - --# libguestfs virt-v2v test script --# Copyright (C) 2014 Red Hat Inc. --# --# This program is free software; you can redistribute it and/or modify --# it under the terms of the GNU General Public License as published by --# the Free Software Foundation; either version 2 of the License, or --# (at your option) any later version. --# --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY; without even the implied warranty of --# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --# GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License --# along with this program; if not, write to the Free Software --# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- --# Test -o ovirt. -- --set -e -- --source ./functions.sh --set -e --set -x -- --skip_if_skipped --requires test -s ../test-data/phony-guests/windows.img -- --libvirt_uri="test://$abs_top_builddir/test-data/phony-guests/guests.xml" --f=../test-data/phony-guests/windows.img -- --export VIRT_TOOLS_DATA_DIR="$srcdir/../test-data/fake-virt-tools" --export VIRTIO_WIN="$srcdir/../test-data/fake-virtio-win/drivers" -- --d=test-o-ovirt.d --rm -rf $d --cleanup_fn rm -r $d --mkdir $d -- --# Create a dummy Export Storage Domain. --mkdir $d/12345678-1234-1234-1234-123456789abc --mkdir $d/12345678-1234-1234-1234-123456789abc/images --mkdir $d/12345678-1234-1234-1234-123456789abc/master --mkdir $d/12345678-1234-1234-1234-123456789abc/master/vms -- --# $VG - XXX Disabled because the forking used to write files in -o ovirt --# mode confuses valgrind. --virt-v2v --debug-gc -v -x \ -- -i libvirt -ic "$libvirt_uri" windows \ -- -o ovirt -os $d -- --# Test the OVF metadata was created. --test -f $d/12345678-1234-1234-1234-123456789abc/master/vms/*/*.ovf -- --pushd $d/12345678-1234-1234-1234-123456789abc/images/* -- --# Test the disk .meta was created. --test -f *.meta -- --# Test the disk file was created. --vol=`basename *.meta .meta` --test -f $vol -- --popd -- --# Compare resulting OVF --VM_ID=$(basename $(ls -1d $d/12345678-1234-1234-1234-123456789abc/master/vms/*)) --DISK_ID=$(basename $(ls -1d $d/12345678-1234-1234-1234-123456789abc/images/*)) --VOL_ID=$(basename $(ls -1d $d/12345678-1234-1234-1234-123456789abc/images/$DISK_ID/*.meta) .meta) --OVF=$(ls -1d $d/12345678-1234-1234-1234-123456789abc/master/vms/$VM_ID/$VM_ID.ovf) -- --RE_UUID='\<[0-9a-fA-F]\{8\}-[0-9a-fA-F]\{4\}-[0-9a-fA-F]\{4\}-[0-9a-fA-F]\{4\}-[0-9a-fA-F]\{12\}\>' -- --# Filter variable strings --sed -i \ -- -e "s/$DISK_ID/#DISK_ID#/g" \ -- -e "s/$VM_ID/#VM_ID#/g" \ -- -e "s/$VOL_ID/#VOL_ID#/g" \ -- -e "s/\('"$RE_UUID"'#UUID#[^<]*#DATE# $f -- --grep -- "-oo vdsm-compat" $f --grep -- "-oo vdsm-image-uuid" $f -- --rm $f -diff --git a/tests/test-o-vdsm-options.ovf.expected b/tests/test-o-vdsm-options.ovf.expected -deleted file mode 100644 -index 9f71a44e..00000000 ---- a/tests/test-o-vdsm-options.ovf.expected -+++ /dev/null -@@ -1,113 +0,0 @@ -- -- -- -- -- -- -- -- List of networks -- -- -- -- List of Virtual Disks -- -- -- -- windows -- 00000000-0000-0000-0000-000000000000 -- Blank -- generated by virt-v2v -- -- #DATE# -- True -- False -- -- False -- 1 -- 2 -- 1 -- -- Windows Server 2022 Phony Edition -- windows_2022 -- -- -- 1 CPU, 1024 Memory -- -- 1 virtual cpu -- Number of virtual CPU -- 1 -- 3 -- 1 -- 1 -- -- -- 1024 MB of memory -- Memory Size -- 2 -- 4 -- MegaBytes -- 1024 -- -- -- USB Controller -- 3 -- 23 -- Disabled -- -- -- Graphical Controller -- #UUID# -- 32768 -- video -- 1 -- vga -- -- -- RNG Device -- #UUID# -- 0 -- rng -- virtio -- -- urandom -- -- -- -- Memory Ballooning Device -- #UUID# -- 0 -- balloon -- memballoon -- -- virtio -- -- -- -- Drive 1 -- VOL -- 17 -- disk -- VOL -- 00000000-0000-0000-0000-000000000000 -- 00000000-0000-0000-0000-000000000000 -- -- 12345678-1234-1234-1234-123456789abc -- 00000000-0000-0000-0000-000000000000 -- #DATE# -- #DATE# -- #DATE# -- 1 -- -- -- #UUID# -- Ethernet adapter on default -- 10 -- 3 -- interface -- default -- eth0 -- 00:11:22:33:44:55 -- -- -- -- -diff --git a/tests/test-o-vdsm-options.sh b/tests/test-o-vdsm-options.sh -deleted file mode 100755 -index a8c5b208..00000000 ---- a/tests/test-o-vdsm-options.sh -+++ /dev/null -@@ -1,96 +0,0 @@ --#!/bin/bash - --# libguestfs virt-v2v test script --# Copyright (C) 2014-2025 Red Hat Inc. --# --# This program is free software; you can redistribute it and/or modify --# it under the terms of the GNU General Public License as published by --# the Free Software Foundation; either version 2 of the License, or --# (at your option) any later version. --# --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY; without even the implied warranty of --# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --# GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License --# along with this program; if not, write to the Free Software --# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- --# Test -o vdsm options -oo vdsm-*-uuid -- --set -e --set -x -- --source ./functions.sh --set -e --set -x -- --skip_if_skipped --requires test -s ../test-data/phony-guests/windows.img -- --libvirt_uri="test://$abs_top_builddir/test-data/phony-guests/guests.xml" --f=../test-data/phony-guests/windows.img -- --export VIRT_TOOLS_DATA_DIR="$srcdir/../test-data/fake-virt-tools" --export VIRTIO_WIN="$srcdir/../test-data/fake-virtio-win/drivers" -- --d=test-o-vdsm-options.d --rm -rf $d --cleanup_fn rm -r $d --mkdir $d -- --# Create a dummy Export Storage Domain. --mkdir $d/12345678-1234-1234-1234-123456789abc --mkdir $d/12345678-1234-1234-1234-123456789abc/images --mkdir $d/12345678-1234-1234-1234-123456789abc/images/IMAGE --mkdir $d/12345678-1234-1234-1234-123456789abc/master --mkdir $d/12345678-1234-1234-1234-123456789abc/master/vms --mkdir $d/12345678-1234-1234-1234-123456789abc/master/vms/VM -- --# The -oo vdsm-*-uuid options don't actually check that the --# parameter is a UUID, which is useful here. -- --$VG virt-v2v --debug-gc \ -- -i libvirt -ic "$libvirt_uri" windows \ -- -o vdsm -os $d/12345678-1234-1234-1234-123456789abc \ -- -of qcow2 \ -- -oo vdsm-image-uuid=IMAGE \ -- -oo vdsm-vol-uuid=VOL \ -- -oo vdsm-vm-uuid=VM \ -- -oo vdsm-ovf-output=$d/12345678-1234-1234-1234-123456789abc/master/vms/VM \ -- -oo vdsm-compat=1.1 \ -- -oo vdsm-ovf-flavour=ovirt -- --# Test the OVF metadata was created. --test -f $d/12345678-1234-1234-1234-123456789abc/master/vms/VM/VM.ovf -- --pushd $d/12345678-1234-1234-1234-123456789abc/images/IMAGE -- --# Test the disk .meta was created. --test -f VOL.meta -- --# Test the disk file was created. --test -f VOL -- --# Test that a qcow2 file with compat=1.1 was generated. --test "$(guestfish disk-format VOL)" = "qcow2" --qemu-img info VOL | grep 'compat: 1.1' -- --popd -- --# Compare resulting OVF --OVF="$d/12345678-1234-1234-1234-123456789abc/master/vms/VM/VM.ovf" -- --RE_UUID='\<[0-9a-fA-F]\{8\}-[0-9a-fA-F]\{4\}-[0-9a-fA-F]\{4\}-[0-9a-fA-F]\{4\}-[0-9a-fA-F]\{12\}\>' -- --# Filter variable strings --sed -i \ -- -e "s/\('"$RE_UUID"'#UUID#[^<]*#DATE# true - | _ -> false in - - (* Get the conversion options. *) diff --git a/0014-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch b/0022-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch similarity index 88% rename from 0014-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch rename to 0022-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch index f5692f5..39c50b3 100644 --- a/0014-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch +++ b/0022-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch @@ -1,4 +1,4 @@ -From 21c7424d64065fe77d4bfd6c05f0ca85e0a08229 Mon Sep 17 00:00:00 2001 +From b00922090f704e97388dbc96f6f710fd5e22af92 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Tue, 30 Sep 2014 10:50:27 +0100 Subject: [PATCH] RHEL: v2v: Disable the --qemu-boot / -oo qemu-boot option @@ -43,10 +43,10 @@ index 49f00754..bdf12c5d 100644 =item B<-o null> diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod -index e228fb33..35886561 100644 +index 04764832..eb550da0 100644 --- a/docs/virt-v2v.pod +++ b/docs/virt-v2v.pod -@@ -160,11 +160,6 @@ Since F contains the path(s) to the guest disk +@@ -169,11 +169,6 @@ Since F contains the path(s) to the guest disk image(s) you do not need to specify the name of the disk image on the command line. @@ -58,17 +58,17 @@ index e228fb33..35886561 100644 =head1 OPTIONS =over 4 -@@ -549,9 +544,6 @@ This is similar to I<-o local>, except that a shell script is written +@@ -578,9 +573,6 @@ This is similar to I<-o local>, except that a shell script is written which you can use to boot the guest in qemu. The converted disks and shell script are written to the directory specified by I<-os>. -When using this output mode, you can also specify the I<-oo qemu-boot> -option which boots the guest under qemu immediately. - + ifelse(ENABLE_OVIRT, yes, ` =item B<-o> B - Set the output method to I. -@@ -622,11 +614,6 @@ For I<-o openstack> (L) only, set a guest ID +@@ -653,11 +645,6 @@ For I<-o openstack> (L) only, set a guest ID which is saved on each Cinder volume in the C volume property. @@ -81,7 +81,7 @@ index e228fb33..35886561 100644 For I<-o openstack> (L) only, set optional diff --git a/output/output_qemu.ml b/output/output_qemu.ml -index 909b6e10..37371aad 100644 +index b17ac518..197fe385 100644 --- a/output/output_qemu.ml +++ b/output/output_qemu.ml @@ -65,6 +65,9 @@ module QEMU = struct diff --git a/0015-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch b/0023-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch similarity index 83% rename from 0015-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch rename to 0023-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch index 3b1adc5..ea99cce 100644 --- a/0015-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch +++ b/0023-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch @@ -1,4 +1,4 @@ -From 04ee519268f9805ac0a9c54fe20e26ccb99c8550 Mon Sep 17 00:00:00 2001 +From f19e71394757c9f44ed3367addbe694140f34fea Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Fri, 24 Apr 2015 09:45:41 -0400 Subject: [PATCH] RHEL: Fix list of supported sound cards to match RHEL qemu @@ -9,10 +9,10 @@ Subject: [PATCH] RHEL: Fix list of supported sound cards to match RHEL qemu 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/utils.ml b/lib/utils.ml -index f3f7a205..7b0d2327 100644 +index 15af5b1a..f5afa58f 100644 --- a/lib/utils.ml +++ b/lib/utils.ml -@@ -81,13 +81,14 @@ let kvm_arch = function +@@ -83,13 +83,14 @@ let kvm_arch = function (* Does qemu support the given sound card? *) let qemu_supports_sound_card = function | Types.AC97 diff --git a/0016-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch b/0024-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch similarity index 85% rename from 0016-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch rename to 0024-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch index 6a7fc46..f73d045 100644 --- a/0016-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch +++ b/0024-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch @@ -1,4 +1,4 @@ -From 4f5301bfa39c09df4ce4368abbafcb53ea139efc Mon Sep 17 00:00:00 2001 +From 2e69a53b203968d77eb0a0447bdb347bd34481c6 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Thu, 2 Mar 2017 14:21:37 +0100 Subject: [PATCH] RHEL: v2v: -i disk: force VNC as display (RHBZ#1372671) @@ -9,10 +9,10 @@ The SDL output mode is not supported in RHEL's qemu-kvm. 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/input_disk.ml b/input/input_disk.ml -index 8b027fed..6dd1b0cf 100644 +index a5291031..599436f9 100644 --- a/input/input_disk.ml +++ b/input/input_disk.ml -@@ -78,7 +78,7 @@ module Disk = struct +@@ -77,7 +77,7 @@ module Disk = struct s_firmware = UnknownFirmware; (* causes virt-v2v to autodetect *) s_uefi_secureboot = false; s_display = diff --git a/0024-remove-timeout-before-installing-virtio-win-drivers.patch b/0024-remove-timeout-before-installing-virtio-win-drivers.patch deleted file mode 100644 index 6de9818..0000000 --- a/0024-remove-timeout-before-installing-virtio-win-drivers.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 74cbf6c5f6c65736a5b5e70aa8876564948645fa Mon Sep 17 00:00:00 2001 -From: Vadim Rozenfeld -Date: Fri, 18 Jul 2025 19:31:34 +1000 -Subject: [PATCH] remove timeout before installing virtio-win drivers - -Signed-off-by: Vadim Rozenfeld -(cherry picked from commit 07192e2bf5e73dd4d3d7d3c1faa940c7a67e2d72) ---- - convert/convert_windows.ml | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/convert/convert_windows.ml b/convert/convert_windows.ml -index 2ff9bcfa..f416b3ad 100644 ---- a/convert/convert_windows.ml -+++ b/convert/convert_windows.ml -@@ -401,8 +401,6 @@ let convert (g : G.guestfs) source inspect i_firmware - echo Installing drivers from %inf_dir%\n\ - set REBOOT_PENDING=0\n\ - \n\ -- timeout /t 10 /nobreak\n\ -- \n\ - reg query \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Auto Update\\RebootRequired\"\n\ - if %errorlevel%==0 (\n\ - echo Windows Update: Reboot required.\n\ diff --git a/0017-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch b/0025-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch similarity index 97% rename from 0017-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch rename to 0025-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch index 74de0a2..d17aa31 100644 --- a/0017-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch +++ b/0025-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch @@ -1,4 +1,4 @@ -From a3ca5d7c85f44c55bccc8b964e00e4937a54a3b4 Mon Sep 17 00:00:00 2001 +From 19cd953d2b43f1d385845ed86c1802d4343093e7 Mon Sep 17 00:00:00 2001 From: Pino Toscano Date: Tue, 26 Mar 2019 09:42:25 +0100 Subject: [PATCH] RHEL: point to KB for supported v2v hypervisors/guests diff --git a/0025-v2v-Fix-SELinux-relabelling.patch b/0025-v2v-Fix-SELinux-relabelling.patch deleted file mode 100644 index fb79cfb..0000000 --- a/0025-v2v-Fix-SELinux-relabelling.patch +++ /dev/null @@ -1,81 +0,0 @@ -From c674bb5596460fddea5478208dc2cec17993189e Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Wed, 13 Aug 2025 16:55:27 +0100 -Subject: [PATCH] v2v: Fix SELinux relabelling - -Update the common submodule to pick up: - - Richard W.M. Jones (3): - mlcustomize/SELinux_relabel.ml: Add comment - mlcustomize/SELinux_relabel.ml: Use new guestfs_setfiles API - mlcustomize/SELinux_relabel.ml: Relabel every mountpoint - -This allows SELinux relabelling to work for Linux guests that have a -split-/usr configuration. - -This requires libguestfs >= 1.57.1, for the new guestfs_setfiles API. - -Fixes: https://issues.redhat.com/browse/RHEL-108174 -Reported-by: Germano Veit Michel -Thanks: Ming Xie -(cherry picked from commit e4c53263d08e8aa40b0d911d470ea2930dbb27c7) ---- - common | 2 +- - m4/guestfs-libraries.m4 | 6 ++---- - 2 files changed, 3 insertions(+), 5 deletions(-) - -Submodule common 10d2b626..89f1eb2d: -diff --git a/common/mlcustomize/SELinux_relabel.ml b/common/mlcustomize/SELinux_relabel.ml -index 2f3a09bf..f1729e3f 100644 ---- a/common/mlcustomize/SELinux_relabel.ml -+++ b/common/mlcustomize/SELinux_relabel.ml -@@ -1,5 +1,5 @@ - (* virt-customize -- * Copyright (C) 2016 Red Hat Inc. -+ * Copyright (C) 2016-2025 Red Hat Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -@@ -24,6 +24,10 @@ open Printf - - module G = Guestfs - -+(* XXX A lot of this code could usefully be moved into -+ * [libguestfs.git/daemon/selinux.ml]. -+ *) -+ - let rec relabel (g : G.guestfs) = - (* Is the guest using SELinux? (Otherwise this is a no-op). *) - if is_selinux_guest g then ( -@@ -109,5 +113,13 @@ and use_setfiles g = - g#copy_attributes ~all:true old_specfile specfile - ); - -+ (* Get the list of mountpoints, since setfiles does not cross -+ * filesystems (RHEL-108174). -+ *) -+ let mps = g#mountpoints () |> -+ List.map snd |> (* the list of directories *) -+ List.sort compare |> (* sort them for consistency *) -+ Array.of_list in -+ - (* Relabel everything. *) -- g#selinux_relabel ~force:true specfile "/" -+ g#setfiles ~force:true specfile mps -diff --git a/m4/guestfs-libraries.m4 b/m4/guestfs-libraries.m4 -index fa13e0f6..f1d5d127 100644 ---- a/m4/guestfs-libraries.m4 -+++ b/m4/guestfs-libraries.m4 -@@ -19,10 +19,8 @@ dnl Any C libraries required by virt-v2v. - - dnl Of course we need libguestfs. - dnl --dnl We need libguestfs 1.55.6 for guestfs_sh_out. --dnl We need libguestfs 1.55.12 for guestfs_btrfs_scrub_full. --dnl We need libguestfs 1.55.13 for guestfs_e2fsck FORCENO flag. --PKG_CHECK_MODULES([LIBGUESTFS], [libguestfs >= 1.55.13]) -+dnl We need libguestfs 1.57.1 for guestfs_setfiles. -+PKG_CHECK_MODULES([LIBGUESTFS], [libguestfs >= 1.57.1]) - printf "libguestfs version is "; $PKG_CONFIG --modversion libguestfs - - dnl And libnbd. diff --git a/0026-RHEL-10-m4-Depend-on-libguestfs-1.56.1-2.el10-for-gu.patch b/0026-RHEL-10-m4-Depend-on-libguestfs-1.56.1-2.el10-for-gu.patch deleted file mode 100644 index f316469..0000000 --- a/0026-RHEL-10-m4-Depend-on-libguestfs-1.56.1-2.el10-for-gu.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 687965a4797104fe20f8dc6eaab93d11a6b15775 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Wed, 13 Aug 2025 18:03:41 +0100 -Subject: [PATCH] RHEL 10: m4: Depend on libguestfs 1.56.1-2.el10 for - guestfs_setfiles - ---- - m4/guestfs-libraries.m4 | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/m4/guestfs-libraries.m4 b/m4/guestfs-libraries.m4 -index f1d5d127..1bd39074 100644 ---- a/m4/guestfs-libraries.m4 -+++ b/m4/guestfs-libraries.m4 -@@ -19,8 +19,8 @@ dnl Any C libraries required by virt-v2v. - - dnl Of course we need libguestfs. - dnl --dnl We need libguestfs 1.57.1 for guestfs_setfiles. --PKG_CHECK_MODULES([LIBGUESTFS], [libguestfs >= 1.57.1]) -+dnl We need libguestfs 1.56.1-2.el10 for guestfs_setfiles. -+PKG_CHECK_MODULES([LIBGUESTFS], [libguestfs >= 1.56.1]) - printf "libguestfs version is "; $PKG_CONFIG --modversion libguestfs - - dnl And libnbd. diff --git a/0020-RHEL-tests-Remove-btrfs-test.patch b/0026-RHEL-tests-Remove-btrfs-test.patch similarity index 86% rename from 0020-RHEL-tests-Remove-btrfs-test.patch rename to 0026-RHEL-tests-Remove-btrfs-test.patch index e5b0fcc..e034c38 100644 --- a/0020-RHEL-tests-Remove-btrfs-test.patch +++ b/0026-RHEL-tests-Remove-btrfs-test.patch @@ -1,4 +1,4 @@ -From 867666d94ada861146fcd0ae6643c0d69c2e4513 Mon Sep 17 00:00:00 2001 +From 57a29e5f33a5035917ef0bfffaa61326148c7afa Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Tue, 5 Jul 2022 11:58:09 +0100 Subject: [PATCH] RHEL: tests: Remove btrfs test @@ -9,7 +9,7 @@ RHEL does not have btrfs so this test always fails. 1 file changed, 1 deletion(-) diff --git a/tests/Makefile.am b/tests/Makefile.am -index 3a8bab3c..f9c748ed 100644 +index 54cfd124..8e142b09 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -64,7 +64,6 @@ TESTS = \ diff --git a/0023-RHEL-Add-warning-about-virt-v2v-in-place-not-being-s.patch b/0027-RHEL-Add-warning-about-virt-v2v-in-place-not-being-s.patch similarity index 74% rename from 0023-RHEL-Add-warning-about-virt-v2v-in-place-not-being-s.patch rename to 0027-RHEL-Add-warning-about-virt-v2v-in-place-not-being-s.patch index 7a1c260..b3d3a31 100644 --- a/0023-RHEL-Add-warning-about-virt-v2v-in-place-not-being-s.patch +++ b/0027-RHEL-Add-warning-about-virt-v2v-in-place-not-being-s.patch @@ -1,18 +1,32 @@ -From 40333a5f19e6442d0765e11c5b7f8cc4adb8b090 Mon Sep 17 00:00:00 2001 +From 61eac56a5cb787d591b9338324513b94f0f51b74 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Tue, 9 Jul 2024 11:30:09 +0100 Subject: [PATCH] RHEL: Add warning about virt-v2v-in-place not being supported Fixes: https://issues.redhat.com/browse/RHEL-40903 --- - docs/virt-v2v-in-place.pod | 4 ++++ - in-place/in_place.ml | 3 +++ + in-place/in_place.ml | 3 +++ + in-place/virt-v2v-in-place.pod | 4 ++++ 2 files changed, 7 insertions(+) -diff --git a/docs/virt-v2v-in-place.pod b/docs/virt-v2v-in-place.pod -index 3d0d1b28..9714bbac 100644 ---- a/docs/virt-v2v-in-place.pod -+++ b/docs/virt-v2v-in-place.pod +diff --git a/in-place/in_place.ml b/in-place/in_place.ml +index 7e490867..6c2790af 100644 +--- a/in-place/in_place.ml ++++ b/in-place/in_place.ml +@@ -229,6 +229,9 @@ read the man page virt-v2v-in-place(1). + let opthandle = create_standard_options argspec ~anon_fun ~key_opts:true ~machine_readable:true usage_msg in + Getopt.parse opthandle.getopt; + ++ warning "virt-v2v-in-place is NOT SUPPORTED for command line use. \ ++ It is almost always better to use virt-v2v instead of this tool."; ++ + (* Print the version, easier than asking users to tell us. *) + debug "info: %s: %s %s (%s)" + prog Config.package_name Config.package_version_full +diff --git a/in-place/virt-v2v-in-place.pod b/in-place/virt-v2v-in-place.pod +index 69d2092e..7c0a4d90 100644 +--- a/in-place/virt-v2v-in-place.pod ++++ b/in-place/virt-v2v-in-place.pod @@ -16,6 +16,10 @@ virt-v2v-in-place - Convert a guest to use KVM in-place =head1 DESCRIPTION @@ -24,17 +38,3 @@ index 3d0d1b28..9714bbac 100644 Virt-v2v-in-place converts a single guest from a foreign hypervisor to run on KVM. It does this conversion in place, modifying the original disk. -diff --git a/in-place/in_place.ml b/in-place/in_place.ml -index a91ee39d..dba0772c 100644 ---- a/in-place/in_place.ml -+++ b/in-place/in_place.ml -@@ -211,6 +211,9 @@ read the man page virt-v2v-in-place(1). - let opthandle = create_standard_options argspec ~anon_fun ~key_opts:true ~machine_readable:true usage_msg in - Getopt.parse opthandle.getopt; - -+ warning "virt-v2v-in-place is NOT SUPPORTED for command line use. \ -+ It is almost always better to use virt-v2v instead of this tool."; -+ - (* Print the version, easier than asking users to tell us. *) - debug "info: %s: %s %s (%s)" - prog Config.package_name Config.package_version_full diff --git a/0027-convert-Model-target-boot-device.patch b/0027-convert-Model-target-boot-device.patch deleted file mode 100644 index aa0c851..0000000 --- a/0027-convert-Model-target-boot-device.patch +++ /dev/null @@ -1,98 +0,0 @@ -From c00234c61eb2a49b2961b24672e41f15d8d734b8 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Thu, 21 Aug 2025 09:45:44 +0100 -Subject: [PATCH] convert: Model target boot device - -SeaBIOS recently changed how it works so it no longer initializes all -disks at boot. To get around this, for some Linux BIOS guests, we -will have to assign a boot order to the disks, with -for the disk that contains the GRUB bootloader, and higher boot orders -assigned to the other disks. - -As the first step, model the target boot device. - -In the current commit this is always unset (set to 'None'), so this -does nothing. - -(cherry picked from commit e512d84bc8e18734aac7659e839f32c960f6fb0a) ---- - convert/convert.ml | 8 ++++++-- - lib/types.ml | 3 ++- - lib/types.mli | 15 ++++++++++++++- - 3 files changed, 22 insertions(+), 4 deletions(-) - -diff --git a/convert/convert.ml b/convert/convert.ml -index 45d48a95..f8a35506 100644 ---- a/convert/convert.ml -+++ b/convert/convert.ml -@@ -136,7 +136,8 @@ let rec convert input_disks options source = - get_target_firmware i_firmware guestcaps source output in - - (* Create target metadata file. *) -- let target_meta = { guestcaps; target_buses; target_firmware; target_nics } in -+ let target_meta = { guestcaps; target_buses; target_nics; -+ target_firmware; target_boot_device = None } in - - (* This is a good place to dump everything we know about the guest. *) - if verbose () then debug_info source inspect target_meta mpstats; -@@ -366,7 +367,8 @@ and get_target_firmware i_firmware guestcaps source output = - * is enabled. - *) - and debug_info source inspect -- { guestcaps; target_buses; target_firmware; target_nics } -+ { guestcaps; target_buses; target_nics; -+ target_firmware; target_boot_device } - mpstats = - eprintf "info:\n"; - eprintf "%s\n" (string_of_source source); -@@ -374,6 +376,8 @@ and debug_info source inspect - eprintf "%s\n" (string_of_guestcaps guestcaps); - eprintf "%s\n" (string_of_target_buses target_buses); - eprintf "target firmware: %s\n" (string_of_target_firmware target_firmware); -+ eprintf "target boot device: %s\n" -+ (match target_boot_device with None -> "" | Some i -> string_of_int i); - eprintf "target NICs:\n"; - List.iter (fun nic -> eprintf "%s\n" (string_of_source_nic nic)) - target_nics; -diff --git a/lib/types.ml b/lib/types.ml -index 0196a3fd..bd4ab31c 100644 ---- a/lib/types.ml -+++ b/lib/types.ml -@@ -485,8 +485,9 @@ let string_of_target_buses buses = - type target_meta = { - guestcaps : guestcaps; - target_buses : target_buses; -+ target_nics : target_nics; - target_firmware : target_firmware; -- target_nics : target_nics -+ target_boot_device : int option; - } - - type root_choice = AskRoot | SingleRoot | FirstRoot | RootDev of string -diff --git a/lib/types.mli b/lib/types.mli -index b3815c8e..0c43b149 100644 ---- a/lib/types.mli -+++ b/lib/types.mli -@@ -367,8 +367,21 @@ val string_of_target_buses : target_buses -> string - type target_meta = { - guestcaps : guestcaps; - target_buses : target_buses; -+ target_nics : target_nics; -+ - target_firmware : target_firmware; -- target_nics : target_nics -+ -+ target_boot_device : int option; -+ (** The disk index of the device containing the bootloader (index -+ starting from 0). -+ -+ For libvirt guests this should usually be mapped to -+ [] for this disk, and [] -+ where N > 1 for each other disk (order does not matter -+ for the other disks). -+ -+ This is only necessary for SeaBIOS so only collected for -+ a subset of BIOS guests (RHEL-108991). *) - } - - (** {2 Command line parameters} *) diff --git a/0035-RHEL-output-output.ml-Remove-cache-none.patch b/0028-RHEL-output-output.ml-Remove-reduce-memory-pressure-.patch similarity index 59% rename from 0035-RHEL-output-output.ml-Remove-cache-none.patch rename to 0028-RHEL-output-output.ml-Remove-reduce-memory-pressure-.patch index 72db039..1eda78d 100644 --- a/0035-RHEL-output-output.ml-Remove-cache-none.patch +++ b/0028-RHEL-output-output.ml-Remove-reduce-memory-pressure-.patch @@ -1,41 +1,41 @@ -From 24cd76732009fabd3070d1a1fcfee5cbfa5c229c Mon Sep 17 00:00:00 2001 +From 9e9546aa983337e197407ce25ef3d3cd0a3cf173 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Fri, 12 Dec 2025 16:18:15 +0000 -Subject: [PATCH] RHEL: output/output.ml: Remove cache=none +Subject: [PATCH] RHEL: output/output.ml: Remove reduce-memory-pressure=on + (cache=none) Virt-v2v tries to reduce the amount of page cache used when writing out the disk image to the target storage. It does this by enabling the -cache=none option in nbdkit-file-plugin. +reduce-memory-pressure=on option (previously cache=none) option in +nbdkit-file-plugin. However, use of nbdkit-file-plugin cache=none option causes data corruption with Dell PowerMax 8000 storage (only). -As this is only an advisory setting, remove it. Use of the page cache -can be limited instead using cgroupsv2 memory settings. +As this is only an advisory setting, remove it for now. Fixes: https://issues.redhat.com/browse/RHEL-135617 -(cherry picked from commit 30c03c7e308b063843a7848d15890871566bbbc0) --- output/output.ml | 2 -- 1 file changed, 2 deletions(-) diff --git a/output/output.ml b/output/output.ml -index 15cb50db..5d9c044f 100644 +index ff4b12b1..8b94df34 100644 --- a/output/output.ml +++ b/output/output.ml -@@ -101,7 +101,6 @@ let output_to_local_file ?(changeuid = fun f -> f ()) +@@ -102,7 +102,6 @@ let output_to_local_file ?name | "raw" -> - let cmd = Nbdkit.create "file" in + let cmd = Nbdkit.create ?name "file" in Nbdkit.add_arg cmd "file" filename; -- Nbdkit.add_arg cmd "cache" "none"; +- Nbdkit.reduce_memory_pressure cmd; if verbose () then Nbdkit.add_filter_if_available cmd "count"; let _, pid = Nbdkit.run_unix socket cmd in pid -@@ -204,7 +203,6 @@ let create_local_output_disks dir +@@ -209,7 +208,6 @@ let create_local_output_disks dir (* Create the single nbdkit-file-plugin instance. *) - let cmd = Nbdkit.create "file" in + let cmd = Nbdkit.create ~name:"out" "file" in Nbdkit.add_arg cmd "dir" output_storage; -- Nbdkit.add_arg cmd "cache" "none"; +- Nbdkit.reduce_memory_pressure cmd; if verbose () then Nbdkit.add_filter_if_available cmd "count"; let _, pid = Nbdkit.run_unix socket cmd in On_exit.kill pid; diff --git a/0028-output-Add-boot-order-depending-on-target-boot-devic.patch b/0028-output-Add-boot-order-depending-on-target-boot-devic.patch deleted file mode 100644 index 074ec39..0000000 --- a/0028-output-Add-boot-order-depending-on-target-boot-devic.patch +++ /dev/null @@ -1,184 +0,0 @@ -From e7abf2e39ed17e324b54c00f2386f56152660522 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Thu, 21 Aug 2025 09:53:42 +0100 -Subject: [PATCH] output: Add boot order depending on target boot device - -If no target boot device was specified, we number them -through for each disk. - -If a target boot device was specified, then that disk has -, and the remaining disks are numbered sequentially -starting at 2. - -(cherry picked from commit 08e57a392aa5e0720e8787968a562808cb0a31fe) ---- - lib/create_ovf.ml | 19 ++++++++----------- - output/create_libvirt_xml.ml | 16 +++++++++++++++- - output/output_qemu.ml | 16 +++++++++++++--- - tests/test-cdrom.expected | 1 + - tests/test-floppy.expected | 1 + - tests/test-i-ova.xml | 1 + - 6 files changed, 39 insertions(+), 15 deletions(-) - -diff --git a/lib/create_ovf.ml b/lib/create_ovf.ml -index 0af62c88..f74ba3a7 100644 ---- a/lib/create_ovf.ml -+++ b/lib/create_ovf.ml -@@ -544,7 +544,7 @@ let create_meta_files output_alloc output_format sd_uuid image_uuids sizes = - - (* Create the OVF file. *) - let rec create_ovf source inspect -- { guestcaps; target_firmware; target_nics } -+ { guestcaps; target_nics; target_firmware; target_boot_device } - sizes - output_alloc output_format - output_name -@@ -763,7 +763,7 @@ let rec create_ovf source inspect - ] in - - (* Add disks to the OVF XML. *) -- add_disks sizes guestcaps output_alloc output_format -+ add_disks sizes guestcaps target_boot_device output_alloc output_format - sd_uuid image_uuids vol_uuids need_actual_sizes output_disks - ovf_flavour ovf; - -@@ -813,7 +813,7 @@ and get_flavoured_section ovf ovirt_path esd_path esd_path_attr = function - with Not_found -> assert false - - (* This modifies the OVF DOM, adding a section for each disk. *) --and add_disks sizes guestcaps output_alloc output_format -+and add_disks sizes guestcaps target_boot_device output_alloc output_format - sd_uuid image_uuids vol_uuids need_actual_sizes output_disks - ovf_flavour ovf = - let references = -@@ -838,14 +838,11 @@ and add_disks sizes guestcaps output_alloc output_format - (* Iterate over the disks, adding them to the OVF document. *) - List.iteri ( - fun i (size, image_uuid, vol_uuid, output_uri) -> -- (* This sets the boot order to boot the first disk first. This -- * isn't generally correct. We should copy over the boot order -- * from the source hypervisor. See long discussion in -- * https://bugzilla.redhat.com/show_bug.cgi?id=1308535 for -- * what we should be doing. (XXX) -- *) -- let is_bootable_drive = i == 0 in -- let boot_order = i+1 in -+ let is_bootable_drive, boot_order = -+ match target_boot_device with -+ | None -> i = 0, i+1 -+ | Some disk_index when disk_index = i -> true, 1 -+ | Some _ -> false, i+2 in - - let fileref = - match ovf_flavour with -diff --git a/output/create_libvirt_xml.ml b/output/create_libvirt_xml.ml -index 7ab8d34c..59f2f1f8 100644 ---- a/output/create_libvirt_xml.ml -+++ b/output/create_libvirt_xml.ml -@@ -41,7 +41,8 @@ let get_osinfo_id inspect = - None - - let create_libvirt_xml ?pool source inspect -- { guestcaps; target_buses; target_firmware; target_nics } -+ { guestcaps; target_buses; target_nics; target_firmware; -+ target_boot_device } - target_features outdisk_name output_format output_name = - (* The main body of the libvirt XML document. *) - let body = ref [] in -@@ -206,6 +207,18 @@ let create_libvirt_xml ?pool source inspect - | BusSlotDisk d -> - let outdisk = outdisk_name d.s_disk_id in - -+ let boot_order = -+ match target_boot_device with -+ | None -> -+ (* No known boot device, just number them sequentially. *) -+ i+1 -+ | Some disk_index when disk_index = i -> -+ (* For the boot disk, use order 1. *) -+ 1 -+ | Some _ -> -+ (* For the others number them sequentially starting at 2. *) -+ i+2 in -+ - e "disk" ( - [ - "type", if pool = None then "file" else "volume"; -@@ -231,6 +244,7 @@ let create_libvirt_xml ?pool source inspect - "dev", drive_prefix ^ drive_name i; - "bus", bus_name; - ] []; -+ e "boot" [ "order", string_of_int boot_order ] []; - ] - - | BusSlotRemovable { s_removable_type = CDROM } -> -diff --git a/output/output_qemu.ml b/output/output_qemu.ml -index 37371aad..dff08b66 100644 ---- a/output/output_qemu.ml -+++ b/output/output_qemu.ml -@@ -108,7 +108,8 @@ module QEMU = struct - let _, qemu_boot, output_alloc, output_format, - output_name, output_storage = options in - -- let { guestcaps; target_buses; target_firmware } = target_meta in -+ let { guestcaps; target_buses; -+ target_firmware; target_boot_device } = target_meta in - - (* Start the shell script. Write it to a temporary file - * which we rename at the end. -@@ -282,8 +283,17 @@ module QEMU = struct - * "disk_id". - *) - let outdisk = disk_path output_storage output_name disk_id in -- arg_list "-drive" [ "file=" ^ outdisk; "format=" ^ output_format; -- "if=none"; "id=" ^ backend_name; "media=disk" ] -+ let bootindex = -+ match target_boot_device with -+ | None -> disk_id+1 -+ | Some disk_index when disk_index = disk_id -> 1 -+ | Some _ -> disk_id+2 in -+ arg_list "-drive" [ "file=" ^ outdisk; -+ "format=" ^ output_format; -+ "if=none"; -+ "id=" ^ backend_name; -+ "media=disk"; -+ sprintf "bootindex=%d" bootindex ] - - and add_cdrom_backend backend_name = - (* Add a drive (back-end) for an "ide-cd" or "scsi-cd" device (front-end). -diff --git a/tests/test-cdrom.expected b/tests/test-cdrom.expected -index 17bd152d..806461e7 100644 ---- a/tests/test-cdrom.expected -+++ b/tests/test-cdrom.expected -@@ -1,6 +1,7 @@ - - - -+ - - - -diff --git a/tests/test-floppy.expected b/tests/test-floppy.expected -index a718c21f..c5bd913b 100644 ---- a/tests/test-floppy.expected -+++ b/tests/test-floppy.expected -@@ -1,6 +1,7 @@ - - - -+ - - - -diff --git a/tests/test-i-ova.xml b/tests/test-i-ova.xml -index f1d8f2e3..08b5b9f2 100644 ---- a/tests/test-i-ova.xml -+++ b/tests/test-i-ova.xml -@@ -27,6 +27,7 @@ - - - -+ - - - diff --git a/0042-Update-common-submodule.patch b/0029-Update-common-submodule.patch similarity index 84% rename from 0042-Update-common-submodule.patch rename to 0029-Update-common-submodule.patch index 65b6357..f71d402 100644 --- a/0042-Update-common-submodule.patch +++ b/0029-Update-common-submodule.patch @@ -1,7 +1,11 @@ -From 69c4b5280893793771f6514357ab56348420fcf7 Mon Sep 17 00:00:00 2001 +From 2666493010b1b82d5b8dbb517c9976727b05184f Mon Sep 17 00:00:00 2001 +Message-ID: <2666493010b1b82d5b8dbb517c9976727b05184f.1770914130.git.crobinso@redhat.com> +In-Reply-To: <859c43b1eb81cfdcb5f481b571e2c387860f8a27.1770914130.git.crobinso@redhat.com> +References: <859c43b1eb81cfdcb5f481b571e2c387860f8a27.1770914130.git.crobinso@redhat.com> From: Cole Robinson Date: Wed, 11 Feb 2026 19:09:26 -0500 Subject: [PATCH] Update common submodule +Content-type: text/plain Update to fix: https://issues.redhat.com/browse/RHEL-148423 @@ -11,14 +15,13 @@ This pulls in the following commits: Cole Robinson (1): virtio-win: Install blnsvr.exe to C:\Windows\Drivers\VirtIO -(cherry picked from commit b227d493ace2250bbc53a25ce7db42fcf220ba51) - Signed-off-by: Cole Robinson +(cherry picked from commit b227d493ace2250bbc53a25ce7db42fcf220ba51) --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -Submodule common 54a5b4ce..10fed783: +Submodule common 1005f4a6..22b583b9: diff --git a/common/mlcustomize/inject_virtio_win.ml b/common/mlcustomize/inject_virtio_win.ml index 114df064..a2938080 100644 --- a/common/mlcustomize/inject_virtio_win.ml diff --git a/0029-convert-Detect-target-boot-device-for-Linux-guests.patch b/0029-convert-Detect-target-boot-device-for-Linux-guests.patch deleted file mode 100644 index 5905242..0000000 --- a/0029-convert-Detect-target-boot-device-for-Linux-guests.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 46af95ecd11c9eda5fd4195b62528b1eea214550 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Thu, 21 Aug 2025 10:27:41 +0100 -Subject: [PATCH] convert: Detect target boot device for Linux guests - -If the guest is Linux, try to detect the boot device, so we can set - appropriately. We do this for BIOS or UEFI here, but -this only really matters for SeaBIOS. - -Suggested-by: Gerd Hoffmann -Fixes: https://issues.redhat.com/browse/RHEL-108991 -(cherry picked from commit ca6ec6317e20a633315f783a8ba4ece3c2fc01f2) ---- - convert/convert.ml | 37 ++++++++++++++++++++++++++++++++++++- - 1 file changed, 36 insertions(+), 1 deletion(-) - -diff --git a/convert/convert.ml b/convert/convert.ml -index f8a35506..728ea5a1 100644 ---- a/convert/convert.ml -+++ b/convert/convert.ml -@@ -95,6 +95,10 @@ let rec convert input_disks options source = - let root = Choose_root.choose_root options.root_choice g in - let inspect = Mount_filesystems.mount_filesystems g root in - -+ (* Detect boot device. *) -+ message (f_"Detecting the boot device"); -+ let target_boot_device = get_target_boot_device g inspect in -+ - let mpstats = get_mpstats g in - check_guest_free_space inspect mpstats; - -@@ -137,7 +141,7 @@ let rec convert input_disks options source = - - (* Create target metadata file. *) - let target_meta = { guestcaps; target_buses; target_nics; -- target_firmware; target_boot_device = None } in -+ target_firmware; target_boot_device } in - - (* This is a good place to dump everything we know about the guest. *) - if verbose () then debug_info source inspect target_meta mpstats; -@@ -362,6 +366,37 @@ and get_target_firmware i_firmware guestcaps source output = - - target_firmware - -+and get_target_boot_device g inspect = -+ (* We only do it for Linux, as most likely Windows never(?) boots -+ * from any drive other than C:. We can revisit this decision -+ * if someone reports a bug. -+ *) -+ match inspect.i_type with -+ | "linux" -> -+ (try -+ (* In sane cases, the Grub stage1/boot.img (ie. the boot sector) is -+ * always on the same drive as /boot. So we can just find out -+ * where /boot is mounted and use that. -+ *) -+ let boot_mountpoint = List.assoc "/boot" inspect.i_mountpoints in -+ let boot_device = g#part_to_dev boot_mountpoint in -+ let boot_device = g#device_index boot_device in -+ Some boot_device -+ with -+ | Not_found -> None -+ | G.Error msg -+ (* Returned by part_to_dev if the /boot mountpoint is not -+ * a partition name. -+ *) -+ when String.find msg "device name is not a partition" >= 0 -> None -+ | G.Error msg -+ (* Returned by device_index if the /boot device is not -+ * a normal drive name (eg. /dev/mdX). -+ *) -+ when String.find msg "device not found" >= 0 -> None -+ ) -+ | _ -> None -+ - (* After conversion we dump as much information about the guest - * as we can in one place. Note this is only called when verbose - * is enabled. diff --git a/0030-convert-linux-properly-match-etc-crypttab.patch b/0030-convert-linux-properly-match-etc-crypttab.patch new file mode 100644 index 0000000..3176b0c --- /dev/null +++ b/0030-convert-linux-properly-match-etc-crypttab.patch @@ -0,0 +1,33 @@ +From 4e06515083d7effdee91195dbf93082e544a6283 Mon Sep 17 00:00:00 2001 +Message-ID: <4e06515083d7effdee91195dbf93082e544a6283.1771345004.git.crobinso@redhat.com> +In-Reply-To: <859c43b1eb81cfdcb5f481b571e2c387860f8a27.1771345004.git.crobinso@redhat.com> +References: <859c43b1eb81cfdcb5f481b571e2c387860f8a27.1771345004.git.crobinso@redhat.com> +From: Cole Robinson +Date: Mon, 16 Feb 2026 13:58:08 -0500 +Subject: [PATCH] convert: linux: properly match /etc/crypttab + +I broke b227d493ace2250bbc53a25ce7db42fcf220ba51 during review +and neglected to retest. We need to match an augeas style +path when using starts_with + +Fixes: https://issues.redhat.com/browse/RHEL-93583 + +Signed-off-by: Cole Robinson +(cherry picked from commit 109bc1ab3bd2f6b9d73616c546aeceb0631159be) +--- + convert/convert_linux.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml +index 4462e6cf..484148ab 100644 +--- a/convert/convert_linux.ml ++++ b/convert/convert_linux.ml +@@ -1212,7 +1212,7 @@ fi + This depends on /dev/sdXX in the guest having the same /dev/sdXX + name in the appliance. + *) +- if String.starts_with "/etc/crypttab" path && ++ if String.starts_with "/files/etc/crypttab" path && + String.starts_with "/dev/sd" value then ( + try + let uuid = g#vfs_uuid value in diff --git a/0030-output-kubevirt-Add-bootOrder-to-Kubevirt-YAML.patch b/0030-output-kubevirt-Add-bootOrder-to-Kubevirt-YAML.patch deleted file mode 100644 index 16273cf..0000000 --- a/0030-output-kubevirt-Add-bootOrder-to-Kubevirt-YAML.patch +++ /dev/null @@ -1,66 +0,0 @@ -From e2aa9fab93431ff03421806c11fd66349aa3dd92 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Mon, 25 Aug 2025 20:59:12 +0100 -Subject: [PATCH] output: kubevirt: Add bootOrder to Kubevirt YAML - -Fixes: https://issues.redhat.com/browse/RHEL-110742 -(cherry picked from commit 394159cfa36b06b031bdc7322b355af9aac658a5) ---- - output/create_kubevirt_yaml.ml | 9 ++++++++- - tests/test-o-kubevirt-fedora.yaml.expected | 1 + - tests/test-o-kubevirt-windows.yaml.expected | 1 + - 3 files changed, 10 insertions(+), 1 deletion(-) - -diff --git a/output/create_kubevirt_yaml.ml b/output/create_kubevirt_yaml.ml -index 067cf6cb..1bb53216 100644 ---- a/output/create_kubevirt_yaml.ml -+++ b/output/create_kubevirt_yaml.ml -@@ -27,7 +27,8 @@ open Utils - open YAML - - let create_kubevirt_yaml source inspect -- { guestcaps; target_buses; target_firmware; target_nics } -+ { guestcaps; target_buses; target_nics; -+ target_firmware; target_boot_device } - outdisk_name output_format output_name = - (* The body of the YAML contains various sections attached to - * a tree. We fill in these sections first. -@@ -164,8 +165,14 @@ let create_kubevirt_yaml source inspect - (* XXX How to place devices on the bus? *) () - | BusSlotDisk d -> - let disk_id = sprintf "disk-%d" d.s_disk_id in -+ let boot_order = -+ match target_boot_device with -+ | None -> d.s_disk_id + 1 -+ | Some disk_index when disk_index = d.s_disk_id -> 1 -+ | Some _ -> d.s_disk_id + 2 in - let disk = Assoc [ - "disk", Assoc ["bus", String "virtio"]; -+ "bootOrder", Int boot_order; - "name", String disk_id - ] in - List.push_back disks disk; -diff --git a/tests/test-o-kubevirt-fedora.yaml.expected b/tests/test-o-kubevirt-fedora.yaml.expected -index 63205f1b..38577866 100644 ---- a/tests/test-o-kubevirt-fedora.yaml.expected -+++ b/tests/test-o-kubevirt-fedora.yaml.expected -@@ -26,6 +26,7 @@ spec: - disks: - - disk: - bus: virtio -+ bootOrder: 1 - name: disk-0 - volumes: - - hostDisk: -diff --git a/tests/test-o-kubevirt-windows.yaml.expected b/tests/test-o-kubevirt-windows.yaml.expected -index 9bad64bd..d0544510 100644 ---- a/tests/test-o-kubevirt-windows.yaml.expected -+++ b/tests/test-o-kubevirt-windows.yaml.expected -@@ -36,6 +36,7 @@ spec: - disks: - - disk: - bus: virtio -+ bootOrder: 1 - name: disk-0 - interfaces: - - name: net_default diff --git a/0031-convert-Look-for-GRUB-signature-first-to-identify-bo.patch b/0031-convert-Look-for-GRUB-signature-first-to-identify-bo.patch deleted file mode 100644 index 29b429a..0000000 --- a/0031-convert-Look-for-GRUB-signature-first-to-identify-bo.patch +++ /dev/null @@ -1,239 +0,0 @@ -From f221fc8b697335bbb5b90df25f14e0e998b29e57 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Wed, 10 Sep 2025 14:39:18 +0100 -Subject: [PATCH] convert: Look for GRUB signature first to identify boot - device - -In commit ca6ec6317e ("convert: Detect target boot device for Linux -guests") we tried to identify the boot order by looking for the device -containing the /boot filesystem. However during our testing we found -a guest where GRUB was installed on /dev/sda but the /boot partition -was found on /dev/sdd. This guest would not boot with the boot order -indicating that disk 4 (sdd) was the boot disk. - -Change how we search for the boot device by first trying to find a -GRUB signature in the boot sector of any disk. The first matching -disk (if any) would then be picked as the boot device. If this fails -then we fall back to looking at the device containing /boot as before. - -This also updates the common module to get: - - Richard W.M. Jones (1): - mlstdutils: Export List.find_opt - -Reported-by: Ming Xie -Thanks: Gerd Hoffmann -Fixes: commit ca6ec6317e20a633315f783a8ba4ece3c2fc01f2 -Fixes: https://issues.redhat.com/browse/RHEL-108991 -See-also: https://thestarman.pcministry.com/asm/mbr/GRUB.htm -(cherry picked from commit 06fa7bf0f9078d8035eab7ad4689a5018136e712) ---- - common | 2 +- - convert/convert.ml | 77 +++++++++++++++++++++++++++++----------------- - 2 files changed, 49 insertions(+), 30 deletions(-) - -Submodule common 89f1eb2d..5be8d552: -diff --git a/common/mlcustomize/firstboot.ml b/common/mlcustomize/firstboot.ml -index 5f2642b0..360c33d6 100644 ---- a/common/mlcustomize/firstboot.ml -+++ b/common/mlcustomize/firstboot.ml -@@ -35,8 +35,7 @@ let sanitize_name = - module Linux = struct - let firstboot_dir = "/usr/lib/virt-sysprep" - -- let firstboot_sh = sprintf "\ --#!/bin/sh - -+ let firstboot_sh = sprintf {|#!/bin/sh - - - ### BEGIN INIT INFO - # Provides: virt-sysprep -@@ -57,14 +56,14 @@ d=%s/scripts - d_done=%s/scripts-done - logfile=~root/virt-sysprep-firstboot.log - --echo \"$0\" \"$@\" 2>&1 | tee -a $logfile --echo \"Scripts dir: $d\" 2>&1 | tee -a $logfile -+echo "$0" "$@" 2>&1 | tee -a $logfile -+echo "Scripts dir: $d" 2>&1 | tee -a $logfile - --if test \"$1\" = \"start\" -+if test "$1" = "start" - then - mkdir -p $d_done - for f in $d/* ; do -- if test -x \"$f\" -+ if test -x "$f" - then - # move the script to the 'scripts-done' directory, so it is not - # executed again at the next boot -@@ -75,7 +74,7 @@ then - done - rm -f $d_done/* - fi --" firstboot_dir firstboot_dir -+|} firstboot_dir firstboot_dir - - let systemd_target = "multi-user.target" - -@@ -282,38 +281,37 @@ module Windows = struct - * 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 -+ let firstboot_script = sprintf {|@echo off - - setlocal EnableDelayedExpansion - set firstboot=%s --set log=%%firstboot%%\\log.txt -+set log=%%firstboot%%\log.txt - --set scripts=%%firstboot%%\\scripts --set scripts_done=%%firstboot%%\\scripts-done -+set scripts=%%firstboot%%\scripts -+set scripts_done=%%firstboot%%\scripts-done - --call :main >> \"%%log%%\" 2>&1 -+call :main >> "%%log%%" 2>&1 - exit /b - - :main - echo starting firstboot service - --if not exist \"%%scripts_done%%\" ( -- mkdir \"%%scripts_done%%\" -+if not exist "%%scripts_done%%" ( -+ mkdir "%%scripts_done%%" - ) - - :: Pick the next script to run. --for %%%%f in (\"%%scripts%%\"\\*.bat) do ( -- echo running \"%%%%f\" -- pushd \"%%scripts%%\" -- call \"%%%%~nf\" -+for %%%%f in ("%%scripts%%"\*.bat) do ( -+ echo running "%%%%f" -+ pushd "%%scripts%%" -+ call "%%%%~nf" - set elvl=!errorlevel! - echo .... exit code !elvl! - popd - - if !elvl! NEQ 249 ( - echo Script succeeded, moving to scripts-done -- move \"%%%%f\" \"%%scripts_done%%\" -+ move "%%%%f" "%%scripts_done%%" - ) else ( - echo Script failed, will retry on next boot - ) -@@ -329,8 +327,8 @@ for %%%%f in (\"%%scripts%%\"\\*.bat) do ( - - :: Fallthrough here if there are no scripts. - echo uninstalling firstboot service --\"%%firstboot%%\\%s\" -s firstboot uninstall --" firstboot_dir_win srvany in -+"%%firstboot%%\%s" -s firstboot uninstall -+|} firstboot_dir_win srvany in - - g#write (firstboot_dir // "firstboot.bat") - (String.unix2dos firstboot_script); -diff --git a/common/mlstdutils/std_utils.mli b/common/mlstdutils/std_utils.mli -index a20e720c..6c1911da 100644 ---- a/common/mlstdutils/std_utils.mli -+++ b/common/mlstdutils/std_utils.mli -@@ -46,6 +46,7 @@ module List : sig - val mem : 'a -> 'a list -> bool - val memq : 'a -> 'a list -> bool - val find : ('a -> bool) -> 'a list -> 'a -+ val find_opt : ('a -> bool) -> 'a list -> 'a option - val filter : ('a -> bool) -> 'a list -> 'a list - val find_all : ('a -> bool) -> 'a list -> 'a list - val partition : ('a -> bool) -> 'a list -> 'a list * 'a list -diff --git a/convert/convert.ml b/convert/convert.ml -index 728ea5a1..6c78bd99 100644 ---- a/convert/convert.ml -+++ b/convert/convert.ml -@@ -367,35 +367,54 @@ and get_target_firmware i_firmware guestcaps source output = - target_firmware - - and get_target_boot_device g inspect = -- (* We only do it for Linux, as most likely Windows never(?) boots -- * from any drive other than C:. We can revisit this decision -- * if someone reports a bug. -- *) -- match inspect.i_type with -- | "linux" -> -- (try -- (* In sane cases, the Grub stage1/boot.img (ie. the boot sector) is -- * always on the same drive as /boot. So we can just find out -- * where /boot is mounted and use that. -- *) -- let boot_mountpoint = List.assoc "/boot" inspect.i_mountpoints in -- let boot_device = g#part_to_dev boot_mountpoint in -- let boot_device = g#device_index boot_device in -- Some boot_device -- with -- | Not_found -> None -- | G.Error msg -- (* Returned by part_to_dev if the /boot mountpoint is not -- * a partition name. -- *) -- when String.find msg "device name is not a partition" >= 0 -> None -- | G.Error msg -- (* Returned by device_index if the /boot device is not -- * a normal drive name (eg. /dev/mdX). -- *) -- when String.find msg "device not found" >= 0 -> None -- ) -- | _ -> None -+ with_return (fun {return} -> -+ (* We only do it for Linux, as most likely Windows never(?) boots -+ * from any drive other than C:. We can revisit this decision -+ * if someone reports a bug. -+ *) -+ if inspect.i_type <> "linux" then return None; -+ -+ (* Look for "GRUB" signature in the boot sector of each disk. -+ * If we find it, choose that disk. -+ *) -+ let devices = g#list_devices () |> Array.to_list in -+ let boot_device = List.find_opt (has_grub_signature g) devices in -+ let boot_device = Option.map g#device_index boot_device in -+ if boot_device <> None then return boot_device; -+ -+ (* If that fails, in sane cases, the Grub stage1/boot.img (ie. the boot -+ * sector) is always on the same drive as /boot. So we can just find -+ * out where /boot is mounted and use that. -+ *) -+ get_device_of_boot_filesystem g inspect -+ ) -+ -+and has_grub_signature g dev = -+ let boot_sector = g#pread_device dev 512 0_L in -+ let r = String.find boot_sector "GRUB" >= 0 in -+ debug "has_grub_signature: \"GRUB\" signature on %s? %b" dev r; -+ r -+ -+and get_device_of_boot_filesystem g inspect = -+ try -+ let boot_mountpoint = List.assoc "/boot" inspect.i_mountpoints in -+ let boot_device = g#part_to_dev boot_mountpoint in -+ debug "get_device_of_boot_filesystem: found /boot filesystem on device %s" -+ boot_device; -+ let boot_device = g#device_index boot_device in -+ Some boot_device -+ with -+ | Not_found -> None -+ (* Returned by part_to_dev if the /boot mountpoint is not -+ * a partition name. -+ *) -+ | G.Error msg -+ when String.find msg "device name is not a partition" >= 0 -> None -+ (* Returned by device_index if the /boot device is not -+ * a normal drive name (eg. /dev/mdX). -+ *) -+ | G.Error msg -+ when String.find msg "device not found" >= 0 -> None - - (* After conversion we dump as much information about the guest - * as we can in one place. Note this is only called when verbose diff --git a/0032-lib-types.ml-Fix-formatting-of-debug-message.patch b/0032-lib-types.ml-Fix-formatting-of-debug-message.patch deleted file mode 100644 index 2714b1c..0000000 --- a/0032-lib-types.ml-Fix-formatting-of-debug-message.patch +++ /dev/null @@ -1,34 +0,0 @@ -From def3f0343f3cbf0431004f0b00ec0862c09ce476 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Thu, 25 Sep 2025 10:35:31 +0100 -Subject: [PATCH] lib/types.ml: Fix formatting of debug message - -With multiple disks you would see: - - virtio-blk slot 0: - 0 [scsi]virtio-blk slot 1: - 1 [scsi]virtio-blk slot 2: - 2 [scsi]virtio-blk slot 3: - 3 [scsi] - -Fix this by adding a \n character. - -Fixes: commit 2c96e93f63d86c9980594816a532b787532cdc2c -(cherry picked from commit dfd78446296c721efe596f2107163c5157d6c3d2) ---- - lib/types.ml | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/types.ml b/lib/types.ml -index bd4ab31c..d6709a2c 100644 ---- a/lib/types.ml -+++ b/lib/types.ml -@@ -471,7 +471,7 @@ let string_of_target_bus_slots bus_name slots = - sprintf "%s slot %d:\n" bus_name slot_nr ^ - (match slot with - | BusSlotEmpty -> "\t(slot empty)\n" -- | BusSlotDisk d -> string_of_source_disk d -+ | BusSlotDisk d -> string_of_source_disk d ^ "\n" - | BusSlotRemovable r -> string_of_source_removable r ^ "\n" - ) - ) slots in diff --git a/0033-convert-windows-Fix-ESP-conversion-if-C-Windows-Temp.patch b/0033-convert-windows-Fix-ESP-conversion-if-C-Windows-Temp.patch deleted file mode 100644 index 23a957e..0000000 --- a/0033-convert-windows-Fix-ESP-conversion-if-C-Windows-Temp.patch +++ /dev/null @@ -1,69 +0,0 @@ -From e0f472c42409b157e32e0c8efd0af3a2bd02f0e7 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Tue, 28 Oct 2025 11:34:22 +0000 -Subject: [PATCH] convert: windows: Fix ESP conversion if C:\Windows\Temp has - alternate case - -We found a Windows guest which had the expected C:\Windows\Temp path, -but the actual name was TEMP rather than Temp. It's unclear if this -had been renamed, or if Windows can create this normally. In any -case, the unexpected casing caused this failure: - - virt-v2v: error: libguestfs error: mkdtemp: /Windows/Temp/ESP_XXXXXX: No such file or directory - -We have to use g#case_sensitive_path here since the directory is on -NTFS. - -I also removed the hard-coded "\Windows" in favour of %systemroot%, -and fixed the indentation. - -Fixes: https://issues.redhat.com/browse/RHEL-124569 -Reported-by: Ulhas Surse -(cherry picked from commit 277ddd1a9b84d9c1b1fa93ef9a2e7f52b68d7930) ---- - convert/convert_windows.ml | 30 +++++++++++++++++------------- - 1 file changed, 17 insertions(+), 13 deletions(-) - -diff --git a/convert/convert_windows.ml b/convert/convert_windows.ml -index f416b3ad..b7a7727b 100644 ---- a/convert/convert_windows.ml -+++ b/convert/convert_windows.ml -@@ -961,21 +961,25 @@ let convert (g : G.guestfs) source inspect i_firmware - match i_firmware with - | Firmware.I_BIOS -> () - | I_UEFI esp_list -> -- let esp_temp_path = g#mkdtemp "/Windows/Temp/ESP_XXXXXX" in -- let uefi_arch = get_uefi_arch_suffix inspect.i_arch in -+ let esp_temp_path = -+ let temp = inspect.i_windows_systemroot ^ "/Temp" in -+ let mp = g#case_sensitive_path temp in -+ let template = mp ^ "/ESP_XXXXXX" in -+ g#mkdtemp template in -+ let uefi_arch = get_uefi_arch_suffix inspect.i_arch in - -- List.iter ( -- fun dev_path -> -- g#mount dev_path esp_temp_path; -- fix_win_uefi_bcd esp_temp_path; -- (match uefi_arch with -- | Some uefi_arch -> fix_win_uefi_fallback esp_temp_path uefi_arch -- | None -> () -- ); -- g#umount esp_temp_path; -- ) esp_list; -+ List.iter ( -+ fun dev_path -> -+ g#mount dev_path esp_temp_path; -+ fix_win_uefi_bcd esp_temp_path; -+ (match uefi_arch with -+ | Some uefi_arch -> fix_win_uefi_fallback esp_temp_path uefi_arch -+ | None -> () -+ ); -+ g#umount esp_temp_path; -+ ) esp_list; - -- g#rmdir esp_temp_path -+ g#rmdir esp_temp_path - in - - do_convert () diff --git a/0034-Update-common-submodule.patch b/0034-Update-common-submodule.patch deleted file mode 100644 index 791e27d..0000000 --- a/0034-Update-common-submodule.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 519ccf9d812093c0c54625d14f835652c07cf0dc Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Sat, 20 Sep 2025 17:20:25 +0100 -Subject: [PATCH] Update common submodule - - Richard W.M. Jones (2): - daemon, generator: Use power of 2 for initial size of Hashtbl.create - mlcustomize/inject_virtio_win.ml: Use viostor.inf instead of guestor - -Fixes: https://issues.redhat.com/browse/RHEL-128908 ---- - common | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -Submodule common 5be8d552..54a5b4ce: -diff --git a/common/mlcustomize/inject_virtio_win.ml b/common/mlcustomize/inject_virtio_win.ml -index b26b14d3..114df064 100644 ---- a/common/mlcustomize/inject_virtio_win.ml -+++ b/common/mlcustomize/inject_virtio_win.ml -@@ -310,8 +310,13 @@ and ddb_regedits inspect drv_name drv_pciid = - * one must add keys into the DriverDatabase. - *) - -+ let winarch = -+ match inspect.i_arch with -+ | "i386" -> "x86" | "x86_64" -> "amd64" -+ | _ -> assert false in -+ - let drv_inf = "guestor.inf" in -- let drv_inf_label = drv_inf ^ "_tmp" in -+ let drv_inf_label = sprintf "%s_%s_0000000000000000" drv_inf winarch in - let drv_config = "guestor_conf" in - - [ diff --git a/0036-input-input_vddk.ml-Handle-subdirectories-in-nbdkit-.patch b/0036-input-input_vddk.ml-Handle-subdirectories-in-nbdkit-.patch deleted file mode 100644 index 268d888..0000000 --- a/0036-input-input_vddk.ml-Handle-subdirectories-in-nbdkit-.patch +++ /dev/null @@ -1,118 +0,0 @@ -From 1053eaf35267c20f451f581973e55474a1f2ee58 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Thu, 16 Oct 2025 12:32:40 +0100 -Subject: [PATCH] input/input_vddk.ml: Handle subdirectories in nbdkit vddk - export wildcard - -When calling nbdkit vddk plugin, we have to construct an export -parameter, which is a wildcard that matches all of the filenames we -will request. See: -https://libguestfs.org/nbdkit-vddk-plugin.1.html#PARAMETERS - -The wildcard is checked using fnmatch(FNM_PATHNAME), so '/' characters -in the filename do *not* match '*' characters in the wildcard. As a -result, we failed before when the VMware filename was a path with -subdirectories. - -Attempt some hairy functional programming to calculate a suitable -wildcard for these cases. This definitely won't handle the case where -we have filenames at different directory depths, because in fact -nbdkit itself cannot handle this case right now. - -Reported-by: Ming Xie -Signed-off-by: Richard W.M. Jones -Fixes: https://issues.redhat.com/browse/RHEL-121728 -Related: commit 5461976e229873a203062848c0de30e70067b3fb -Fixes: commit 076727e55f4d4fed246097d3f89ebfe83e3de88f -Related: https://issues.redhat.com/browse/RHEL-102734 -(cherry picked from commit ba86b22c75a65240fdb65ac2e91c472c0f68f78e) ---- - input/input_vddk.ml | 63 +++++++++++++++++++++++++++++++++++---------- - 1 file changed, 50 insertions(+), 13 deletions(-) - -diff --git a/input/input_vddk.ml b/input/input_vddk.ml -index e88befa2..7fd416b9 100644 ---- a/input/input_vddk.ml -+++ b/input/input_vddk.ml -@@ -35,6 +35,53 @@ open Input - *) - let libNN = sprintf "lib%d" Sys.word_size - -+(* Calculate the nbdkit vddk plugin 'export' parameter. This is a -+ * wildcard that must match all filenames given. nbdkit uses -+ * 'fnmatch (export, filename, FNM_PATHNAME)' when checking this, -+ * which means: -+ * - We have to escape any fnmatch-special chars such as '[' and '*' -+ * - '*' does not match '/' characters in the filename -+ *) -+let get_vddk_export_wildcard = function -+ | [] -> assert false (* can't happen, checked by the caller *) -+ | [f] -> fnmatch_escape f (* single file, just escape the whole thing *) -+ | files -> -+ (* We implicitly assume all files end in *.vmdk, check that. *) -+ List.iter (fun f -> assert (String.ends_with ".vmdk" f)) files; -+ -+ (* Calculate the longest common prefix of all the filenames. -+ * Remove the prefix from each filename, leaving the remainder strings. -+ * eg. -+ * "foobar", "foobazs" => prefix = "fooba", remainders = ["r", "zs"] -+ *) -+ let prefix = String.longest_common_prefix files in -+ let prefix_len = String.length prefix in -+ let remainders = List.map ( -+ fun f -> -+ let n = String.length f in -+ assert (prefix_len <= n); -+ String.sub f prefix_len (n - prefix_len) -+ ) files in -+ -+ (* The number of '/' (slash) characters in the remainders must be -+ * the same, otherwise there's something weird with subdirectories -+ * going on that we can't handle yet. (XXX If this happens, then -+ * we'd need to change nbdkit because it cannot possibly handle -+ * a wildcard that matches different directory depths). -+ *) -+ let count_slashes = List.map (String.count_chars '/') remainders in -+ let nr_slashes = List.hd count_slashes in -+ List.iter (fun nr -> assert (nr_slashes = nr)) count_slashes; -+ -+ (* Now we need to generate "*/*/*" for this number of slashes. *) -+ let stars = List.make (nr_slashes+1) "*" in -+ let stars_n_slashes = String.concat "/" stars in -+ -+ (* Construct the final wildcard. Note we only need to -+ * escape the prefix (the only part which is user content). -+ *) -+ fnmatch_escape prefix ^ stars_n_slashes ^ ".vmdk" -+ - module VDDK = struct - let to_string options args = - let xs = "-it vddk" :: args in -@@ -415,24 +462,14 @@ See also the virt-v2v-input-vmware(1) manual.") libNN - * instance of nbdkit. - *) - if Nbdkit.probe_plugin_parameter "vddk" "export=" then ( -- let wildcard = -- match files with -- | [] -> assert false (* can't happen, see assert above *) -- | [f] -> fnmatch_escape f -- | files -> -- (* Calculate the longest common prefix across all the files, -- * then set the wildcard to this. -- * XXX May not work if there are subdirectories? -- * XXX Is every file we want to read called *.vmdk? -- *) -- let prefix = String.longest_common_prefix files in -- fnmatch_escape prefix ^ "*.vmdk" in -- - let socket = sprintf "%s/in0" dir in - On_exit.unlink socket; - - let nbdkit = create_nbdkit_vddk () in -+ -+ let wildcard = get_vddk_export_wildcard files in - Nbdkit.add_arg nbdkit "export" wildcard; -+ - let _, pid = Nbdkit.run_unix socket nbdkit in - On_exit.kill pid; - diff --git a/0037-input-input_vddk.ml-Pass-only-longest-prefix-to-vddk.patch b/0037-input-input_vddk.ml-Pass-only-longest-prefix-to-vddk.patch deleted file mode 100644 index 94522de..0000000 --- a/0037-input-input_vddk.ml-Pass-only-longest-prefix-to-vddk.patch +++ /dev/null @@ -1,127 +0,0 @@ -From c1119abb08bc27609f99f99a4d2f5c8e71f06cd5 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Mon, 20 Oct 2025 14:50:07 +0100 -Subject: [PATCH] input/input_vddk.ml: Pass only longest prefix to vddk export - parameter - -See discussion on https://gitlab.com/nbdkit/nbdkit/-/merge_requests/113 - -nbdkit commit 01b429c412 ("vddk: Don't use FNM_PATHNAME when matching -export parameter") removes the FNM_PATHNAME restriction, so we can -just use the longest common prefix again. - -This change requires nbdkit >= 1.45.11. I think it's time to raise -the minimum version of nbdkit anyway, so starting with virt-v2v 2.10, -nbdkit 1.46 will be required. If you use too old nbdkit you will see -the error: - - virt-v2v: error: nbdkit must be >= 1.45.11 for input from VDDK - -This partially reverts commit ba86b22c75 ("input/input_vddk.ml: Handle -subdirectories in nbdkit vddk export wildcard") but I didn't actually -revert that commit because I wanted to keep the explantory comments in -the code. - -Reverts: commit ba86b22c75 -Related: https://gitlab.com/nbdkit/nbdkit/-/merge_requests/113 -Related: https://gitlab.com/nbdkit/nbdkit/-/commit/01b429c412504a491a4b5cc009a9c2e906f993ef -Related: https://issues.redhat.com/browse/RHEL-121728 - -Cherry picked from commit dda93d7fd3ef5b2cdf25cfefa0b2d41207fa54f6, -but remove the hard test for nbdkit >= 1.45.11, and replace it with -an RPM dependency. ---- - README | 2 +- - input/input_vddk.ml | 46 ++++++++++++++++----------------------------- - 2 files changed, 17 insertions(+), 31 deletions(-) - -diff --git a/README b/README -index 407869b4..b21cb87d 100644 ---- a/README -+++ b/README -@@ -56,7 +56,7 @@ REQUIREMENTS - - * OCaml bindings for libnbd - --* nbdkit >= 1.28 (https://gitlab.com/nbdkit/nbdkit) -+* nbdkit >= 1.45.11 (https://gitlab.com/nbdkit/nbdkit) - - * These nbdkit plugins and filters: - -diff --git a/input/input_vddk.ml b/input/input_vddk.ml -index 7fd416b9..f420192b 100644 ---- a/input/input_vddk.ml -+++ b/input/input_vddk.ml -@@ -36,11 +36,15 @@ open Input - let libNN = sprintf "lib%d" Sys.word_size - - (* Calculate the nbdkit vddk plugin 'export' parameter. This is a -- * wildcard that must match all filenames given. nbdkit uses -- * 'fnmatch (export, filename, FNM_PATHNAME)' when checking this, -- * which means: -- * - We have to escape any fnmatch-special chars such as '[' and '*' -- * - '*' does not match '/' characters in the filename -+ * wildcard that must match all filenames given. -+ * -+ * nbdkit 1.44 used 'fnmatch (export, filename, FNM_PATHNAME)' -+ * which means '*' does not match '/' characters in the filename. -+ * Unfortunately this made it impossible to match certain paths, -+ * in particular if the guest has some files in a subdirectory. -+ * -+ * nbdkit 1.46 relaxes this to 'fnmatch (export, filename, 0)', -+ * so a simple longest prefix works. - *) - let get_vddk_export_wildcard = function - | [] -> assert false (* can't happen, checked by the caller *) -@@ -50,37 +54,14 @@ let get_vddk_export_wildcard = function - List.iter (fun f -> assert (String.ends_with ".vmdk" f)) files; - - (* Calculate the longest common prefix of all the filenames. -- * Remove the prefix from each filename, leaving the remainder strings. -- * eg. -- * "foobar", "foobazs" => prefix = "fooba", remainders = ["r", "zs"] -+ * eg. "foobar", "foobazs" => prefix = "fooba" - *) - let prefix = String.longest_common_prefix files in -- let prefix_len = String.length prefix in -- let remainders = List.map ( -- fun f -> -- let n = String.length f in -- assert (prefix_len <= n); -- String.sub f prefix_len (n - prefix_len) -- ) files in -- -- (* The number of '/' (slash) characters in the remainders must be -- * the same, otherwise there's something weird with subdirectories -- * going on that we can't handle yet. (XXX If this happens, then -- * we'd need to change nbdkit because it cannot possibly handle -- * a wildcard that matches different directory depths). -- *) -- let count_slashes = List.map (String.count_chars '/') remainders in -- let nr_slashes = List.hd count_slashes in -- List.iter (fun nr -> assert (nr_slashes = nr)) count_slashes; -- -- (* Now we need to generate "*/*/*" for this number of slashes. *) -- let stars = List.make (nr_slashes+1) "*" in -- let stars_n_slashes = String.concat "/" stars in - - (* Construct the final wildcard. Note we only need to - * escape the prefix (the only part which is user content). - *) -- fnmatch_escape prefix ^ stars_n_slashes ^ ".vmdk" -+ fnmatch_escape prefix ^ "*.vmdk" - - module VDDK = struct - let to_string options args = -@@ -283,6 +264,11 @@ information on these settings. - (* Check we have nbdkit and the vddk plugin and the cow filter. *) - if not (Nbdkit.is_installed ()) then - error (f_"nbdkit is not installed or not working"); -+(* Remove this test for RHEL 10.1-z, we will enforce it through -+ RPM dependencies instead. -+ if not (Nbdkit.version () >= (1, 45, 11)) then -+ error (f_"nbdkit must be >= 1.45.11 for input from VDDK"); -+*) - if not (Nbdkit.probe_plugin "vddk") then - error (f_"nbdkit-vddk-plugin is not installed"); - if not (Nbdkit.probe_filter "cow") then diff --git a/0038-v2v-Add-memsize-and-smp-options.patch b/0038-v2v-Add-memsize-and-smp-options.patch deleted file mode 100644 index 9c0ac16..0000000 --- a/0038-v2v-Add-memsize-and-smp-options.patch +++ /dev/null @@ -1,364 +0,0 @@ -From 4b5e135960edde0091aa25fd070934fa643c5299 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Tue, 26 Aug 2025 12:33:18 +0100 -Subject: [PATCH] v2v: Add --memsize and --smp options - -For a long time in virt-builder and virt-customize, we have had -options --memsize and --smp which let you override the default amount -of memory and number of vCPUs assigned to the libguestfs appliance. -Usually virt-builder / virt-customize choose suitable numbers, but -occasionally (for example if you need to --install a large package or ---run a heavyweight program) we cannot anticipate what is needed so -it's useful to allow these to be overridden by the user. - -Virt-v2v by default choses 2560MB and min (8, NR_CPUS) for these. -However much the same as above applies, especially since we added -virt-customize features to virt-v2v. It's useful to have these -options as additional control or to "just get it working", although -generally we should still try to make virt-v2v choose good defaults. - -Also add the same options to virt-v2v-in-place and virt-v2v-inspector. - -(cherry picked from commit 03b656ed468ecbe309e7cca24721de9369d476aa) ---- - convert/convert.ml | 29 ++++++++++++++++++++++++----- - convert/convert.mli | 2 ++ - docs/virt-v2v-in-place.pod | 17 +++++++++++++++++ - docs/virt-v2v-inspector.pod | 6 ++++++ - docs/virt-v2v.pod | 17 +++++++++++++++++ - in-place/in_place.ml | 13 +++++++++++++ - inspector/inspector.ml | 13 +++++++++++++ - v2v/v2v.ml | 13 +++++++++++++ - 8 files changed, 105 insertions(+), 5 deletions(-) - -diff --git a/convert/convert.ml b/convert/convert.ml -index 6c78bd99..0b6c88f9 100644 ---- a/convert/convert.ml -+++ b/convert/convert.ml -@@ -34,8 +34,10 @@ type options = { - block_driver : guestcaps_block_type; - keep_serial_console : bool; - ks : key_store; -+ memsize : int option; - network_map : Networks.t; - root_choice : root_choice; -+ smp : int option; - static_ips : static_ip list; - customize_ops : Customize_cmdline.ops; - } -@@ -54,11 +56,28 @@ let rec convert input_disks options source = - message (f_"Opening the source"); - let g = open_guestfs ~identifier:"v2v" () in - g#set_program "virt-v2v"; -- g#set_memsize (g#get_memsize () * 2); -- (* Setting the number of vCPUs allows parallel mkinitrd, but make -- * sure this is not too large because each vCPU consumes guest RAM. -- *) -- g#set_smp (min 8 (Sysconf.nr_processors_online ())); -+ let memsize = -+ match options.memsize with -+ | None -> -+ (* Default (if [--memsize] option is not used) is to calculate -+ * some multiple of the libguestfs default memory size. -+ *) -+ g#get_memsize () * 2 -+ | Some memsize -> memsize in -+ g#set_memsize memsize; -+ let smp = -+ match options.smp with -+ | None -> -+ (* Default (if [--smp] option is not used) is to set the number -+ * according to the number of physical CPUs on the host, but -+ * limit it because each vCPU consumes guest RAM. This is -+ * necessary to allow parallel mkinitrd which greatly improves -+ * performance. -+ *) -+ min 8 (Sysconf.nr_processors_online ()) -+ | Some smp -> smp in -+ g#set_smp smp; -+ - (* The network is used by the unconfigure_vmware () function, and the "--key - * ID:clevis" command line options (if any). *) - g#set_network true; -diff --git a/convert/convert.mli b/convert/convert.mli -index b34f04e0..85ed05cb 100644 ---- a/convert/convert.mli -+++ b/convert/convert.mli -@@ -20,8 +20,10 @@ type options = { - block_driver : Types.guestcaps_block_type; (** [--block-driver] option *) - keep_serial_console : bool; - ks : Tools_utils.key_store; (** [--key] option *) -+ memsize : int option; (** [--memsize] option *) - network_map : Networks.t; (** [-b] and [-n] options *) - root_choice : Types.root_choice; (** [--root] option *) -+ smp : int option; (** [--smp] option *) - static_ips : Types.static_ip list; (** [--mac :ip:] option *) - customize_ops : Customize_cmdline.ops; (** virt-customize options *) - } -diff --git a/docs/virt-v2v-in-place.pod b/docs/virt-v2v-in-place.pod -index 9714bbac..2d1857b9 100644 ---- a/docs/virt-v2v-in-place.pod -+++ b/docs/virt-v2v-in-place.pod -@@ -197,6 +197,14 @@ This option is used to make the output more machine friendly - when being parsed by other programs. See - L. - -+=item B<-m> MB -+ -+=item B<--memsize> MB -+ -+Change the amount of memory allocated when doing the conversion. -+Virt-v2v-in-place will usually choose a suitable default. Increase -+this if you see that the conversion step is running out of memory. -+ - =item B<-n> in:out - - =item B<-n> out -@@ -244,6 +252,15 @@ This disables progress bars and other unnecessary output. - Choose the root filesystem to be converted. See the documentation of - this option in L. - -+=item B<--smp> N -+ -+Change the number of virtual CPUs used when doing the conversion. -+Virt-v2v-in-place will usually choose a suitable default. -+ -+Increasing this beyond 8 may improve conversion performance, if your -+host has sufficient physical CPUs. You may also need to increase the -+memory size (I<--memsize> option). -+ - =item B<-v> - - =item B<--verbose> -diff --git a/docs/virt-v2v-inspector.pod b/docs/virt-v2v-inspector.pod -index 29adcb56..26770459 100644 ---- a/docs/virt-v2v-inspector.pod -+++ b/docs/virt-v2v-inspector.pod -@@ -194,6 +194,10 @@ virt-v2v-inspector. - - =item B<--machine-readable>=format - -+=item B<-m> MB -+ -+=item B<--memsize> MB -+ - =item B<-n> ... - - =item B<--network> ... -@@ -204,6 +208,8 @@ virt-v2v-inspector. - - =item B<--root> ... - -+=item B<--smp> N -+ - =item B<--wrap> - - These options work in the same way as the equivalent virt-v2v options. -diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod -index b63da9f3..76a53e34 100644 ---- a/docs/virt-v2v.pod -+++ b/docs/virt-v2v.pod -@@ -386,6 +386,14 @@ This option is used to make the output more machine friendly - when being parsed by other programs. See - L below. - -+=item B<-m> MB -+ -+=item B<--memsize> MB -+ -+Change the amount of memory allocated when doing the conversion. -+Virt-v2v will usually choose a suitable default. Increase this if you -+see that the conversion step is running out of memory. -+ - =item B<-n> in:out - - =item B<-n> out -@@ -646,6 +654,15 @@ would mean to use the second partition on the first hard drive. If - the named root device does not exist or was not detected as a root - device, then virt-v2v will fail. - -+=item B<--smp> N -+ -+Change the number of virtual CPUs used when doing the conversion. -+Virt-v2v will usually choose a suitable default. -+ -+Increasing this beyond 8 may improve conversion performance, if your -+host has sufficient physical CPUs. You may also need to increase the -+memory size (I<--memsize> option). -+ - =item B<-v> - - =item B<--verbose> -diff --git a/in-place/in_place.ml b/in-place/in_place.ml -index dba0772c..2ee3abc4 100644 ---- a/in-place/in_place.ml -+++ b/in-place/in_place.ml -@@ -66,6 +66,11 @@ let rec main () = - ) - in - -+ let memsize = ref None in -+ let set_memsize arg = memsize := Some arg in -+ let smp = ref None in -+ let set_smp arg = smp := Some arg in -+ - let network_map = Networks.create () in - - let output_xml = ref No_output_xml in -@@ -173,6 +178,8 @@ let rec main () = - s_"Use password from file to connect to input hypervisor"; - [ L"mac" ], Getopt.String ("mac:network|bridge|ip:out", add_mac), - s_"Map NIC to network or bridge or assign static IP"; -+ [ S 'm'; L"memsize" ], Getopt.Int ("mb", set_memsize), -+ s_"Set memory size"; - [ S 'n'; L"network" ], Getopt.String ("in:out", add_network), - s_"Map network ‘in’ to ‘out’"; - [ S 'O' ], Getopt.String ("output.xml", set_output_xml_option), -@@ -181,6 +188,8 @@ let rec main () = - s_"Print source and stop"; - [ L"root" ], Getopt.String ("ask|... ", set_root_choice), - s_"How to choose root filesystem"; -+ [ L"smp" ], Getopt.Int ("vcpus", set_smp), -+ s_"Set number of vCPUs"; - ] in - - (* Append virt-customize options. *) -@@ -233,9 +242,11 @@ read the man page virt-v2v-in-place(1). - let customize_ops = get_customize_ops () in - let input_conn = !input_conn in - let input_mode = !input_mode in -+ let memsize = !memsize in - let output_xml = !output_xml in - let print_source = !print_source in - let root_choice = !root_choice in -+ let smp = !smp in - let static_ips = !static_ips in - - (* No arguments and machine-readable mode? Print out some facts -@@ -295,8 +306,10 @@ read the man page virt-v2v-in-place(1). - Convert.block_driver = Virtio_blk; - keep_serial_console = true; - ks = opthandle.ks; -+ memsize; - network_map; - root_choice; -+ smp; - static_ips; - customize_ops; - } in -diff --git a/inspector/inspector.ml b/inspector/inspector.ml -index 50b8f711..752a5c1c 100644 ---- a/inspector/inspector.ml -+++ b/inspector/inspector.ml -@@ -65,6 +65,11 @@ let rec main () = - ) - in - -+ let memsize = ref None in -+ let set_memsize arg = memsize := Some arg in -+ let smp = ref None in -+ let set_smp arg = smp := Some arg in -+ - let network_map = Networks.create () in - let static_ips = ref [] in - let rec add_network str = -@@ -164,12 +169,16 @@ let rec main () = - s_"Input transport"; - [ L"mac" ], Getopt.String ("mac:network|bridge|ip:out", add_mac), - s_"Map NIC to network or bridge or assign static IP"; -+ [ S 'm'; L"memsize" ], Getopt.Int ("mb", set_memsize), -+ s_"Set memory size"; - [ S 'n'; L"network" ], Getopt.String ("in:out", add_network), - s_"Map network ‘in’ to ‘out’"; - [ S 'O' ], Getopt.String ("output.xml", set_output_file_option), - s_"Set the output filename"; - [ L"root" ], Getopt.String ("ask|... ", set_root_choice), - s_"How to choose root filesystem"; -+ [ L"smp" ], Getopt.Int ("vcpus", set_smp), -+ s_"Set number of vCPUs"; - ] in - - (* Append virt-customize options. *) -@@ -223,7 +232,9 @@ read the man page virt-v2v-inspector(1). - | Some "vddk" -> Some Input.VDDK - | Some transport -> - error (f_"unknown input transport ‘-it %s’") transport in -+ let memsize = !memsize in - let root_choice = !root_choice in -+ let smp = !smp in - let static_ips = !static_ips in - - (* No arguments and machine-readable mode? Print out some facts -@@ -276,8 +287,10 @@ read the man page virt-v2v-inspector(1). - Convert.block_driver = Virtio_blk; - keep_serial_console = true; - ks = opthandle.ks; -+ memsize; - network_map; - root_choice; -+ smp; - static_ips; - customize_ops; - } in -diff --git a/v2v/v2v.ml b/v2v/v2v.ml -index c274baa0..20082544 100644 ---- a/v2v/v2v.ml -+++ b/v2v/v2v.ml -@@ -73,7 +73,12 @@ let rec main () = - ) - in - -+ let memsize = ref None in -+ let set_memsize arg = memsize := Some arg in - let parallel = ref 1 in -+ let smp = ref None in -+ let set_smp arg = smp := Some arg in -+ - let network_map = Networks.create () in - let static_ips = ref [] in - let rec add_network str = -@@ -216,6 +221,8 @@ let rec main () = - s_"Use virt-v2v-in-place instead"; - [ L"mac" ], Getopt.String ("mac:network|bridge|ip:out", add_mac), - s_"Map NIC to network or bridge or assign static IP"; -+ [ S 'm'; L"memsize" ], Getopt.Int ("mb", set_memsize), -+ s_"Set memory size"; - [ S 'n'; L"network" ], Getopt.String ("in:out", add_network), - s_"Map network ‘in’ to ‘out’"; - [ S 'o' ], Getopt.String (output_modes, set_output_mode), -@@ -240,6 +247,8 @@ let rec main () = - s_"Print source and stop"; - [ L"root" ], Getopt.String ("ask|... ", set_root_choice), - s_"How to choose root filesystem"; -+ [ L"smp" ], Getopt.Int ("vcpus", set_smp), -+ s_"Set number of vCPUs"; - ] in - - (* Append virt-customize options. *) -@@ -299,6 +308,7 @@ read the man page virt-v2v(1). - | Some "vddk" -> Some Input.VDDK - | Some transport -> - error (f_"unknown input transport ‘-it %s’") transport in -+ let memsize = !memsize in - let output_alloc = - match !output_alloc with - | `Not_set | `Sparse -> Types.Sparse -@@ -310,6 +320,7 @@ read the man page virt-v2v(1). - error (f_"--parallel parameter must be >= 1"); - let print_source = !print_source in - let root_choice = !root_choice in -+ let smp = !smp in - let static_ips = !static_ips in - - (* No arguments and machine-readable mode? Print out some facts -@@ -402,8 +413,10 @@ read the man page virt-v2v(1). - Convert.block_driver = Virtio_blk; - keep_serial_console = not remove_serial_console; - ks = opthandle.ks; -+ memsize; - network_map; - root_choice; -+ smp; - static_ips; - customize_ops; - } in diff --git a/0039-docs-Add-more-description-for-memsize-option.patch b/0039-docs-Add-more-description-for-memsize-option.patch deleted file mode 100644 index 941b7f8..0000000 --- a/0039-docs-Add-more-description-for-memsize-option.patch +++ /dev/null @@ -1,60 +0,0 @@ -From edfb40af35c5922b6f7a5595f95f063b3a31fcba Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Thu, 30 Oct 2025 17:48:39 +0000 -Subject: [PATCH] docs: Add more description for --memsize option - -The adjustable --memsize option, which increases the amount of memory -available in the appliance, is necessary to work around at least one -unfixable setfiles / glibc bug. Document in more detail what this -option does in a new section, and mention this issue. (As the issue -can't be fixed properly, this is a documentation-only fix). - -Fixes: https://issues.redhat.com/browse/RHEL-125116 -(cherry picked from commit 9bb2e7d4705811f0e227103c14757895e5f591d9) ---- - docs/virt-v2v.pod | 22 ++++++++++++++++++++-- - 1 file changed, 20 insertions(+), 2 deletions(-) - -diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod -index 76a53e34..ff31bb00 100644 ---- a/docs/virt-v2v.pod -+++ b/docs/virt-v2v.pod -@@ -394,6 +394,8 @@ Change the amount of memory allocated when doing the conversion. - Virt-v2v will usually choose a suitable default. Increase this if you - see that the conversion step is running out of memory. - -+See also L. -+ - =item B<-n> in:out - - =item B<-n> out -@@ -742,11 +744,27 @@ alleviate this. - - =head2 Compute power and RAM - -+Virt-v2v can be run in a virtual machine, but may run faster on bare -+metal. -+ - Virt-v2v is not especially compute or RAM intensive. If you are - running many parallel conversions, then you may consider allocating --one CPU core and 2 GB of RAM per running instance. -+one CPU core and 2 GB of RAM per running instance. (You may adjust -+the amount of memory used by conversion, see the next heading.) - --Virt-v2v can be run in a virtual machine. -+=head2 Adjusting memory available for conversion -+ -+Virt-v2v I<--memsize=N> can be used to increase the amount of memory -+available to do conversion. This rarely needs to be adjusted, but can -+help to workaround some conversion problems. -+ -+=head3 Linux: setfiles runs out of memory when relabelling -+ -+For Linux guests that use SELinux, setfiles can run out of memory if a -+single directory contains millions of files. As there is no simple -+way for virt-v2v to detect this problem in advance, you may have to -+use I<--memsize=4000> (or larger) to convert such guests. For details -+see L - - =head2 Trimming - diff --git a/0043-Add-no-fstrim-option-to-disable-fstrim-during-conver.patch b/0043-Add-no-fstrim-option-to-disable-fstrim-during-conver.patch deleted file mode 100644 index c5a921c..0000000 --- a/0043-Add-no-fstrim-option-to-disable-fstrim-during-conver.patch +++ /dev/null @@ -1,303 +0,0 @@ -From ce2cb1b89e8431c1090c327246ff11a17a89d012 Mon Sep 17 00:00:00 2001 -From: sarika -Date: Tue, 9 Dec 2025 16:12:14 +0530 -Subject: [PATCH] Add --no-fstrim option to disable fstrim during conversion - -In particular, fstrim on NTFS is a serialized operation which can be -very slow on large partitions. - -Closes: https://github.com/libguestfs/virt-v2v/pull/121 -Fixes: https://redhat.atlassian.net/browse/RHEL-164271 - -RWMJ: Added documentation, a test, and larger commit message. -(cherry picked from commit 251639458907f06148ecdd5acbac5c43136e7662) -(cherry picked from commit f937f290a4c032c971ad78d1b07e8aefe15eab8a) ---- - convert/convert.ml | 10 +++++++-- - convert/convert.mli | 1 + - docs/virt-v2v-in-place.pod | 4 ++++ - docs/virt-v2v-inspector.pod | 2 ++ - docs/virt-v2v.pod | 6 +++++ - in-place/in_place.ml | 5 +++++ - inspector/inspector.ml | 6 +++++ - tests/Makefile.am | 2 ++ - tests/test-no-fstrim.sh | 44 +++++++++++++++++++++++++++++++++++++ - v2v/v2v.ml | 6 +++++ - 10 files changed, 84 insertions(+), 2 deletions(-) - create mode 100755 tests/test-no-fstrim.sh - -diff --git a/convert/convert.ml b/convert/convert.ml -index 0b6c88f9..f2676fe9 100644 ---- a/convert/convert.ml -+++ b/convert/convert.ml -@@ -40,6 +40,7 @@ type options = { - smp : int option; - static_ips : static_ip list; - customize_ops : Customize_cmdline.ops; -+ no_fstrim : bool; - } - - (* Mountpoint stats, used for free space estimation. *) -@@ -135,8 +136,13 @@ let rec convert input_disks options source = - * because unused blocks are marked in the overlay and thus do - * not have to be copied. - *) -- message (f_"Mapping filesystem data to avoid copying unused and blank areas"); -- do_fstrim g inspect; -+ if not options.no_fstrim then ( -+ message -+ (f_"Mapping filesystem data to avoid copying unused and blank areas"); -+ do_fstrim g inspect -+ ) else ( -+ message (f_"Skipping fstrim (--no-fstrim specified)") -+ ); - - (* Check (fsck) the filesystems after conversion. *) - g#umount_all (); -diff --git a/convert/convert.mli b/convert/convert.mli -index 85ed05cb..13d80351 100644 ---- a/convert/convert.mli -+++ b/convert/convert.mli -@@ -26,6 +26,7 @@ type options = { - smp : int option; (** [--smp] option *) - static_ips : Types.static_ip list; (** [--mac :ip:] option *) - customize_ops : Customize_cmdline.ops; (** virt-customize options *) -+ no_fstrim : bool; (** [--no-fstrim] option *) - } - - val convert : NBD_URI.t list -> options -> Types.source -> -diff --git a/docs/virt-v2v-in-place.pod b/docs/virt-v2v-in-place.pod -index 2d1857b9..78a3314e 100644 ---- a/docs/virt-v2v-in-place.pod -+++ b/docs/virt-v2v-in-place.pod -@@ -227,6 +227,10 @@ are mapped to C. - - See L. - -+=item B<--no-fstrim> -+ -+Do not trim the filesystem. See L. -+ - =item B<-O> output.xml - - =item B<-O -> -diff --git a/docs/virt-v2v-inspector.pod b/docs/virt-v2v-inspector.pod -index 26770459..65ce71ce 100644 ---- a/docs/virt-v2v-inspector.pod -+++ b/docs/virt-v2v-inspector.pod -@@ -202,6 +202,8 @@ virt-v2v-inspector. - - =item B<--network> ... - -+=item B<--no-fstrim> -+ - =item B<-q> - - =item B<--quiet> -diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod -index ff31bb00..38dc475a 100644 ---- a/docs/virt-v2v.pod -+++ b/docs/virt-v2v.pod -@@ -418,6 +418,10 @@ are mapped to C. - - See L below. - -+=item B<--no-fstrim> -+ -+Do not trim the filesystem. See L below. -+ - =item B<-o> B - - This is the same as I<-o local>. -@@ -792,6 +796,8 @@ fstrim support in the Linux kernel is improving gradually, so over - time some of these restrictions will be lifted and virt-v2v will work - faster. - -+Use I<--no-fstrim> to disable trimming. -+ - =head2 Free space for conversion - - =head3 Free space in the guest -diff --git a/in-place/in_place.ml b/in-place/in_place.ml -index 2ee3abc4..0021089f 100644 ---- a/in-place/in_place.ml -+++ b/in-place/in_place.ml -@@ -150,6 +150,7 @@ let rec main () = - let set_root_choice = Types.set_root_choice root_choice in - - (* Other options that we handle here. *) -+ let no_fstrim = ref false in - let print_source = ref false in - - let input_modes = -@@ -184,6 +185,8 @@ let rec main () = - s_"Map network ‘in’ to ‘out’"; - [ S 'O' ], Getopt.String ("output.xml", set_output_xml_option), - s_"Set the output filename"; -+ [ L"no-fstrim" ], Getopt.Set no_fstrim, -+ s_"Don't trim filesystems before conversion"; - [ L"print-source" ], Getopt.Set print_source, - s_"Print source and stop"; - [ L"root" ], Getopt.String ("ask|... ", set_root_choice), -@@ -242,6 +245,7 @@ read the man page virt-v2v-in-place(1). - let customize_ops = get_customize_ops () in - let input_conn = !input_conn in - let input_mode = !input_mode in -+ let no_fstrim = !no_fstrim in - let memsize = !memsize in - let output_xml = !output_xml in - let print_source = !print_source in -@@ -312,6 +316,7 @@ read the man page virt-v2v-in-place(1). - smp; - static_ips; - customize_ops; -+ no_fstrim; - } in - - (* Before starting the input module, check there is sufficient -diff --git a/inspector/inspector.ml b/inspector/inspector.ml -index 752a5c1c..137d5f61 100644 ---- a/inspector/inspector.ml -+++ b/inspector/inspector.ml -@@ -70,6 +70,8 @@ let rec main () = - let smp = ref None in - let set_smp arg = smp := Some arg in - -+ let no_fstrim = ref false in -+ - let network_map = Networks.create () in - let static_ips = ref [] in - let rec add_network str = -@@ -171,6 +173,8 @@ let rec main () = - s_"Map NIC to network or bridge or assign static IP"; - [ S 'm'; L"memsize" ], Getopt.Int ("mb", set_memsize), - s_"Set memory size"; -+ [ L"no-fstrim" ], Getopt.Set no_fstrim, -+ s_"Don't trim filesystems before conversion"; - [ S 'n'; L"network" ], Getopt.String ("in:out", add_network), - s_"Map network ‘in’ to ‘out’"; - [ S 'O' ], Getopt.String ("output.xml", set_output_file_option), -@@ -233,6 +237,7 @@ read the man page virt-v2v-inspector(1). - | Some transport -> - error (f_"unknown input transport ‘-it %s’") transport in - let memsize = !memsize in -+ let no_fstrim = !no_fstrim in - let root_choice = !root_choice in - let smp = !smp in - let static_ips = !static_ips in -@@ -293,6 +298,7 @@ read the man page virt-v2v-inspector(1). - smp; - static_ips; - customize_ops; -+ no_fstrim; - } in - - (* Before starting the input module, check there is sufficient -diff --git a/tests/Makefile.am b/tests/Makefile.am -index df221b73..8048612e 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -91,6 +91,7 @@ TESTS = \ - test-mac.sh \ - test-machine-readable.sh \ - test-networks-and-bridges.sh \ -+ test-no-fstrim.sh \ - test-o-glance.sh \ - test-o-kubevirt-fedora.sh \ - test-o-kubevirt-oo-disk.sh \ -@@ -279,6 +280,7 @@ EXTRA_DIST += \ - test-machine-readable.sh \ - test-networks-and-bridges-expected.xml \ - test-networks-and-bridges.sh \ -+ test-no-fstrim.sh \ - test-o-glance.sh \ - test-o-kubevirt-fedora.sh \ - test-o-kubevirt-fedora.yaml.expected \ -diff --git a/tests/test-no-fstrim.sh b/tests/test-no-fstrim.sh -new file mode 100755 -index 00000000..ba84ad96 ---- /dev/null -+++ b/tests/test-no-fstrim.sh -@@ -0,0 +1,44 @@ -+#!/bin/bash - -+# libguestfs virt-v2v test script -+# Copyright (C) 2014-2026 Red Hat Inc. -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -+ -+# Test --no-fstrim option. -+ -+source ./functions.sh -+set -e -+set -x -+ -+skip_if_skipped -+requires test -s ../test-data/phony-guests/windows.img -+ -+export VIRT_TOOLS_DATA_DIR="$srcdir/../test-data/fake-virt-tools" -+ -+d=test-no-fstrim.d -+rm -rf $d -+cleanup_fn rm -rf $d -+mkdir $d -+ -+$VG virt-v2v --debug-gc \ -+ -i disk ../test-data/phony-guests/windows.img \ -+ --no-fstrim \ -+ -o local -os $d -+ -+# Test the libvirt XML metadata and a disk was created. -+test -f $d/windows.xml -+test -f $d/windows-sda -+ -+cat $d/windows.xml -diff --git a/v2v/v2v.ml b/v2v/v2v.ml -index 20082544..0cad36af 100644 ---- a/v2v/v2v.ml -+++ b/v2v/v2v.ml -@@ -79,6 +79,8 @@ let rec main () = - let smp = ref None in - let set_smp arg = smp := Some arg in - -+ let no_fstrim = ref false in -+ - let network_map = Networks.create () in - let static_ips = ref [] in - let rec add_network str = -@@ -241,6 +243,8 @@ let rec main () = - s_"Use password from file to connect to output hypervisor"; - [ M"os" ], Getopt.String ("storage", set_string_option_once "-os" output_storage), - s_"Set output storage location"; -+ [ L"no-fstrim" ], Getopt.Set no_fstrim, -+ s_"Don't trim filesystems before conversion"; - [ L"parallel" ], Getopt.Set_int ("N", parallel), - s_"Run up to N instances of nbdcopy in parallel"; - [ L"print-source" ], Getopt.Set print_source, -@@ -309,6 +313,7 @@ read the man page virt-v2v(1). - | Some transport -> - error (f_"unknown input transport ‘-it %s’") transport in - let memsize = !memsize in -+ let no_fstrim = !no_fstrim in - let output_alloc = - match !output_alloc with - | `Not_set | `Sparse -> Types.Sparse -@@ -419,6 +424,7 @@ read the man page virt-v2v(1). - smp; - static_ips; - customize_ops; -+ no_fstrim; - } in - - (* Before starting the input module, check there is sufficient diff --git a/0044-convert-Stop-using-maxmem-xfs_repair-m-option.patch b/0044-convert-Stop-using-maxmem-xfs_repair-m-option.patch deleted file mode 100644 index 93d5b31..0000000 --- a/0044-convert-Stop-using-maxmem-xfs_repair-m-option.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 6d42e902a74d1d7053c4c14050c8b4b412f6ab1f Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Wed, 15 Apr 2026 11:22:34 +0100 -Subject: [PATCH] convert: Stop using maxmem (xfs_repair -m option) - -We originally introduced this option in commit dba4f0d3ba ("convert: -Limit the amount of memory used by xfs_repair"). In the same commit -we also started to use noprefetch (xfs_repair -P). This was to avoid -xfs_repair taking too much memory, causing OOM errors. - -However the -m option turns out to be deprecated. It has a number of -problems and sharp edges, including that it overestimates the amount -of memory required (often, greatly), its estimates are not very -accurate, and it prints a localized error message that libguestfs -needs to parse to obtain useful information. - -xfs_repair has internal logic already to find the available physical -memory and limit memory usage. This also operates even if the -m -option is not used. - -The beneficial option is noprefetch (-P) which limits the caching that -xfs_repair does. Leave that one alone. - -Reported-by: Ming Xie -Thanks: Eric Sandeen, Dave Chinner -Related: https://redhat.atlassian.net/browse/RHEL-165677 -(cherry picked from commit 788bd68663cfc4535753623faa25180fd35f0893) ---- - convert/convert.ml | 8 +++----- - 1 file changed, 3 insertions(+), 5 deletions(-) - -diff --git a/convert/convert.ml b/convert/convert.ml -index f2676fe9..d8b90d73 100644 ---- a/convert/convert.ml -+++ b/convert/convert.ml -@@ -312,13 +312,11 @@ and do_fsck ?(before=false) g = - *) - let nomodify = true - (* xfs_repair runs out of memory in the low memory environment -- * of the appliance unless we limit the amount of memory it will -- * use here. -+ * of the appliance unless we disable prefetch. - *) -- and noprefetch = true -- and maxmem = Int64.of_int (g#get_memsize () / 2) in -+ and noprefetch = true in - -- if g#xfs_repair ~maxmem ~noprefetch ~nomodify dev <> 0 then -+ if g#xfs_repair ~noprefetch ~nomodify dev <> 0 then - error (f_"detected errors on the XFS filesystem on %s") dev - - | _, _ -> diff --git a/0045-Update-common-submodule.patch b/0045-Update-common-submodule.patch deleted file mode 100644 index d1c8868..0000000 --- a/0045-Update-common-submodule.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 11c3421fd248d5b02f521a96ddc95e05e46eaac3 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -Date: Thu, 23 Apr 2026 15:42:12 +0100 -Subject: [PATCH] Update common submodule - - Richard W.M. Jones (1): - mldrivers/firmware.ml: Ignore CHS geometry error from parted ---- - common | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -Submodule common 10fed783..06905cd1: -diff --git a/common/mldrivers/firmware.ml b/common/mldrivers/firmware.ml -index ee0a7caf..6698b073 100644 ---- a/common/mldrivers/firmware.ml -+++ b/common/mldrivers/firmware.ml -@@ -18,6 +18,7 @@ - - open Printf - -+open Std_utils - open Tools_utils - - module G = Guestfs -@@ -28,12 +29,22 @@ type i_firmware = - - let detect_firmware g = - let parttype_is_gpt dev = -- try g#part_get_parttype dev = "gpt" -- with G.Error msg as exn -> -- (* If it's _not_ "unrecognised disk label" then re-raise it. *) -- if g#last_errno () <> G.Errno.errno_EINVAL then raise exn; -- debug "%s (ignored)" msg; -- false -+ try -+ g#part_get_parttype dev = "gpt" -+ with -+ | G.Error msg when String.find msg "CHS geometry" >= 0 -> -+ (* Parted has poor handling of "sun" partition types, always -+ * issuing a warning because the CHS doesn't match the physical -+ * geometry. Ignore this as we don't care about it in this -+ * function (RHEL-165220). -+ *) -+ debug "%s (ignored)" msg; -+ false -+ | G.Error msg as exn -> -+ (* If it's _not_ "unrecognised disk label" then re-raise it. *) -+ if g#last_errno () <> G.Errno.errno_EINVAL then raise exn; -+ debug "%s (ignored)" msg; -+ false - in - let accumulate_partition (esp_parts, bboot) part = - let dev = g#part_to_dev part in diff --git a/copy-patches.sh b/copy-patches.sh index 6fb8369..8a585f9 100755 --- a/copy-patches.sh +++ b/copy-patches.sh @@ -7,7 +7,7 @@ set -e # ./copy-patches.sh project=virt-v2v -rhel_version=10.1 +rhel_version=10.2 # Check we're in the right directory. if [ ! -f $project.spec ]; then diff --git a/gating.yaml b/gating.yaml new file mode 100755 index 0000000..336c565 --- /dev/null +++ b/gating.yaml @@ -0,0 +1,7 @@ +--- !Policy +product_versions: + - rhel-* +decision_context: osci_compose_gate +rules: + - !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional} + - !PassingTestCaseRule {test_case_name: libvirt-ci.v2v.brew-build.gating.x86_64.tier1.functional} diff --git a/libguestfs.keyring b/libguestfs.keyring new file mode 100644 index 0000000000000000000000000000000000000000..bb3eb5537b7c398a10b7e2b26ca00af011d1a73e GIT binary patch literal 2823 zcma*oXEYm(0><$qB7$nPViakqqNG)u+FR_sQdc{DRukabMCqKo^wCkug~Y-bN=ZdDzIiUZ#$40(0^!V6(C-KH79?s=m3cGghyAo z1|dJMm+eiM>Vb)QYy4I#;Xu&Z^B~&YVZ!Whl6YA`T0fY9jOhHw z+Y;*35;Jx(8F=n(3o5j*bNOr3S) zCOp0NiMsuh^>)x<=&*u##pa25u9;{ZZc=y@%)4CE$a$A}A*UQGOC-D04;}dULUfuV z)^qc0R62lhwbK5pAcC9hk{LK2KJQ&jd|seog-6NxEVm_4X)8y7DYjWwHK2eI$lRku zmeq4z0zkjTs4a++z4bu{k^$N0>0MkG^k~>}tQQd>eap=1)cK}mGM_yYhtaPw3u{n! zU9d7X%GZbXT!~-iaePA-_ZF&Sz{>(|!tON<`4C)es{n-Uesd{GoD$><>+YS*e%6$X zv}81ZQEu&BDa*m|%?xc}K? ztXy1dUpQFtxVqa*MT11aG(ZsGE-C15Js>6$2qig`j06Osg@VW_D8Y0f5+LX{5JVpY zpdhDC^oaLZsK??x8DJOWJSw`FnKV|{5~fVJ%k`yWLJxgLVDcRdn^Wa_F@huK2}*V{VwcRgyv*)4g2Qgt1JGlabiOx*7Fj?B<+5~s41Ba znTns*;eGgN*mTv0;L>wfxeCI*{K-s;9kSV!?`oEYYHR#>`F5iO`ZuDJL%yslOO9&w zhbbHM^ngdugCnWhKqq{uTHT9qS(fk}s?L44SS*-LzWFNMdJ_cZV+Pj}Fc0 z$z?*yD| z^ee!4Z%nhXNm_MKw>GfR!|#AT7wI=d8;#FBd0Dn`;z*2sFEnNL=50xc+d7>-sr4hc z1H^ZFsD|Tz3VZsuG#PhW4A#n%$Hvw9zllAj{C|nDDp3Q9IoOo59u_f15UB-d(i^Ft zm}W~GSou3Y2Zae}aUVFWKJ)XZ-FcZ)f7}5VNSmEBezlPwny+1V!c|G1q2)yJu^>SU zBG(uFdMTFhV(LalnV(s$P>l{I_IXET&d9&(TxDa{R*NCzcuMf&q78elSLN9YIaoM7X!j3`9@_C^pJ@OJh;qD77 z`}&Nz_D*Iq6f;t7?Bqxowet8!npZ$`6NXiVD@~AY_g*>B){{F>D1? zN$g|68|pA_wcr~kt)JAUlnukx>iU8KA)f_4{X1&=@-!^E^P8QCNsCiKiUK_F>Xsli+q$Z*{a2b32CMwb3D{%D_`*E!rm9<3xmVE)l89dYVw5nlryxm zap55S(@vrBI7zH^ydCt_O(Ugr9>qJgQm;i{)`fD?)7n|Jj)=c?=qu9x3%|TVwl?!x z?-#a4>J7h7(TrYP9;;VFFnL~q)11l=W{2zM0PM_#^G-;w9~Y(6gf0(xy$5NJB{8G) z2_PZQC}tF@|I|RCJ_Ct6H6l-=E50j$d5Ku9&`{QVe8Z;T+VX2372^TDbVX-o_tL$y zfM36H?e10e)+AoUd;Ar?$c*rS7DBr*maRLN9n|78-|^BE1bP6RW%uVWO+Eh#-^#2q zU1o2OGeEnJe`vc1&bKa=PK5K>MrUoy*4Di*xQ~Hr8YK=ae$S@5;A6m-C*^N>H6QiE z+Z~%eGDDNK_vktjC^nxMUEXZReG3G^_uml$%lONCD~B)o&u@Ar}fQG5;T#E%^U88SI<&z@~yy|THGE%E1PbI z?F^r&ZTiw{?xi@{*DAy6C4z2C)^HACOJ!QTq)OKNiy$F_ao^+$ziBa!`o*phmK_>s za)NY_nGb%M+@h1zb zdfh2x>9W=SlC19X_yB5T8jPIITr(IuajP65y|~iU>niq=mN|NI*0)B&ixQw`dlhcIFP)G9WnV`}K3C{4m}cRO<&1vJ^K5DAVUo*Z<@ zunwMvxU0NO;ORRnw0-LRLg3}q^7?BlO`eOGFQ3pD@ literal 0 HcmV?d00001 diff --git a/rpminspect.yaml b/rpminspect.yaml new file mode 100644 index 0000000..fda4fe5 --- /dev/null +++ b/rpminspect.yaml @@ -0,0 +1,10 @@ + +# config docs: https://github.com/rpminspect/rpminspect/blob/main/data/generic.yaml +# real example: https://gitlab.com/redhat/centos-stream/rpms/python3.14/-/blob/c10s/rpminspect.yaml + +# annocheck has known issues with ocaml binaries +# https://issues.redhat.com/browse/RHEL-44303 +annocheck: + ignore: + - '/usr/bin/virt-v2v*' + - '/usr/libexec/virt-v2v*' diff --git a/sources b/sources index 3b095bb..8fc8fc9 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ -SHA512 (libguestfs.keyring) = 297a15edc7c220222b9f650e0a9361ae132d3f0fed04aeb2237a1d9c3f6dac6f336846434f66480faed72635a33f659e849b052e74b88d1508aeff03f8c9a2ac -SHA512 (virt-v2v-2.8.1.tar.gz) = 70da68563e870955ca013e6d55be8f56ad65dde6f84909f06fae7ab928227a566e8949bb90e839fffce2ad4ebc604b2cfa1c5547394c8d1bd092bb95f9e6435c +SHA512 (virt-v2v-2.10.0.tar.gz) = 035f2181c1cc5f482e96d3e21b513b95939ca224d71ac6ad938842d5af5d60ef07db1600d2ccb609dc2042b1c74088f6f39ffbe595cb51e80278ecb50c314515 +SHA512 (virt-v2v-2.10.0.tar.gz.sig) = cb6301224ef00577a9cd0fc8fa504e583eb447341bd3849e6854f2d78ae72ca39bca68b70f30efd3d1d64480acf161c5e4bc9ba943595ef4dd2a654c3268aa66 diff --git a/tests/basic-test.sh b/tests/basic-test.sh new file mode 100755 index 0000000..71929e0 --- /dev/null +++ b/tests/basic-test.sh @@ -0,0 +1,13 @@ +#!/bin/bash - +set -e +set -x + +# This only makes sure that virt-v2v isn't totally broken. +# virt-v2v is extensively tested on real guests by the QE +# team using a mix of automated and manual testing. + +# Fix libvirt. +systemctl restart virtqemud virtsecretd virtstoraged virtnetworkd + +virt-builder fedora-30 +virt-v2v -i disk fedora-30.img -o null diff --git a/tests/tests.yml b/tests/tests.yml new file mode 100644 index 0000000..9dae6bd --- /dev/null +++ b/tests/tests.yml @@ -0,0 +1,13 @@ +- hosts: localhost + roles: + - role: standard-test-basic + tags: + - classic + required_packages: + - virt-v2v + - guestfs-tools + - libvirt-daemon-kvm + tests: + - simple: + dir: . + run: ./basic-test.sh diff --git a/virt-v2v-2.8.1.tar.gz.sig b/virt-v2v-2.8.1.tar.gz.sig deleted file mode 100644 index b357652..0000000 --- a/virt-v2v-2.8.1.tar.gz.sig +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQJEBAABCgAvFiEE93dPsa0HSn6Mh2fqkXOPc+G3aKAFAmhdYdMRHHJpY2hAYW5u -ZXhpYS5vcmcACgkQkXOPc+G3aKD8Lg/2KysBtKtSnEhMUKhvSzIyj8nIB/qFB+hV -4BPxLeRyW5DgDIN+caJ5DwR50U/wNsK3xpMYApyDHyBcYflzoSh1yul0IGKaTH9n -zGrBxkjHblAJkV4aA0BDkczJcR/PcRR8y+2v6o5XeiP4Ih90l1lGWcregY9H4oi9 -7ExxibkWMn1E35iqIO3Yhaei7tBU7Z6IYztqrNnmZW7hkkJvrnYq3i/TZiU5n3zq -77ounYTp7aM4py6FtN01/M5nIhXULt2vwegs9Tt9gWen+BPyvME9Ul2ESvkF8lS1 -7/4JuPXPoGsMy5KDMvCKMmoau+8WYNaARVg35+rTx4UIg3GDGPjcZkauquJTztgx -n6wLP0LqiyVdE58r3N84VJo949wSi8JoyCZ1rUSgTe50UVsVItFmvWwZkjB5Frk5 -uARpa7KFD5udVCaVYh6MN4CDT19re5WfadYOocoETIRKGzz7W4+OzsMtuURYCdL7 -d8Yk2XNFwPDNEM3f+5l2FjDu8LyYrhPO9CTY2swxsLFMpVGCYIAruDgY4FqVg6s5 -pG8zdQo9u6wVOWs4wxZsoY7GGdjDo6COvDgDOHjI3OQMVa8IszJVliJqxefHFEKg -ouAwqg/HrrzyzJtFmPCfMHodYJF0YF1zgMZnT/n/CyCelP6tGETR/xyPaVtcd8cu -IbrfJq2HWg== -=IwRf ------END PGP SIGNATURE----- diff --git a/virt-v2v.spec b/virt-v2v.spec index 1e58188..eccdc7a 100644 --- a/virt-v2v.spec +++ b/virt-v2v.spec @@ -2,12 +2,50 @@ %global verify_tarball_signature 1 # The source directory. -%global source_directory 2.8-stable +%global source_directory 2.10-stable + +%if !0%{?rhel} +# Optional features enabled in this build for Fedora. +%global with_block_driver 1 +%global with_glance 1 +%global with_ovirt 1 +%global with_xen 1 + +# libguestfs hasn't been built on i686 for a while since there is no +# kernel built for this architecture any longer and libguestfs rather +# fundamentally depends on the kernel. Therefore we must exclude this +# arch. Note there is no bug filed for this because we do not ever +# expect that libguestfs or virt-v2v will be available on i686 so +# there is nothing that needs fixing. +ExcludeArch: %{ix86} + +# Version extra string for Fedora. +%global version_extra fedora=%{fedora},release=%{release} + +%else + +# Optional features enabled in this build for RHEL. +%global with_block_driver 0 +%global with_glance 0 +%global with_ovirt 0 +%global with_xen 0 + +# Architectures where virt-v2v is shipped on RHEL: +# +# not on aarch64 because it is not useful there +# not on %%{power64} because of RHBZ#1287826 +# not on s390x because it is not useful there +ExclusiveArch: x86_64 + +# Version extra string for RHEL. +%global version_extra rhel=%{rhel},release=%{release} + +%endif Name: virt-v2v Epoch: 1 -Version: 2.8.1 -Release: 22%{?dist} +Version: 2.10.0 +Release: 7%{?dist} Summary: Convert a virtual machine to run on KVM License: GPL-2.0-or-later AND LGPL-2.0-or-later @@ -24,85 +62,59 @@ Source2: libguestfs.keyring Source3: copy-patches.sh # Patches are maintained in the following repository: -# https://github.com/libguestfs/virt-v2v/commits/rhel-10.1 +# https://github.com/libguestfs/virt-v2v/commits/rhel-10.2 # Patches. -Patch0001: 0001-docs-Move-oo-verify-server-certificate-docs-to-alpha.patch -Patch0002: 0002-input-input_vddk.ml-Fix-escaping-of-export-.-paramet.patch -Patch0003: 0003-Modify-configure_pnputil_install-script-to-check.patch -Patch0004: 0004-Update-the-common-submodule.patch -Patch0005: 0005-Ignore-ERROR_NO_MORE_ITEMS-status-from-PnPUtil.patch -Patch0006: 0006-v2v-Print-the-version-of-libnbd-nbdcopy-in-debug-out.patch -Patch0007: 0007-vddk-Remove-io-vddk-noextents-option.patch -Patch0008: 0008-curl-ssh-vddk-file-Add-nbdkit-count-filter.patch -Patch0009: 0009-o-kubevirt-Add-oo-disk-to-allow-disk-names-to-be-ove.patch -Patch0010: 0010-output-Add-optional-create-parameter.patch -Patch0011: 0011-o-kubevirt-Add-oo-create-false-to-avoid-disk-creatio.patch -Patch0012: 0012-RHEL-Fixes-for-libguestfs-winsupport.patch -Patch0013: 0013-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch -Patch0014: 0014-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch -Patch0015: 0015-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch -Patch0016: 0016-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch -Patch0017: 0017-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch -Patch0018: 0018-RHEL-Remove-input-from-Xen.patch -Patch0019: 0019-RHEL-Remove-o-glance.patch -Patch0020: 0020-RHEL-tests-Remove-btrfs-test.patch -Patch0021: 0021-RHEL-Remove-block-driver-option.patch -Patch0022: 0022-RHEL-Remove-o-ovirt-o-ovirt-upload-and-o-vdsm-modes.patch -Patch0023: 0023-RHEL-Add-warning-about-virt-v2v-in-place-not-being-s.patch -Patch0024: 0024-remove-timeout-before-installing-virtio-win-drivers.patch -Patch0025: 0025-v2v-Fix-SELinux-relabelling.patch -Patch0026: 0026-RHEL-10-m4-Depend-on-libguestfs-1.56.1-2.el10-for-gu.patch -Patch0027: 0027-convert-Model-target-boot-device.patch -Patch0028: 0028-output-Add-boot-order-depending-on-target-boot-devic.patch -Patch0029: 0029-convert-Detect-target-boot-device-for-Linux-guests.patch -Patch0030: 0030-output-kubevirt-Add-bootOrder-to-Kubevirt-YAML.patch -Patch0031: 0031-convert-Look-for-GRUB-signature-first-to-identify-bo.patch -Patch0032: 0032-lib-types.ml-Fix-formatting-of-debug-message.patch -Patch0033: 0033-convert-windows-Fix-ESP-conversion-if-C-Windows-Temp.patch -Patch0034: 0034-Update-common-submodule.patch -Patch0035: 0035-RHEL-output-output.ml-Remove-cache-none.patch -Patch0036: 0036-input-input_vddk.ml-Handle-subdirectories-in-nbdkit-.patch -Patch0037: 0037-input-input_vddk.ml-Pass-only-longest-prefix-to-vddk.patch -Patch0038: 0038-v2v-Add-memsize-and-smp-options.patch -Patch0039: 0039-docs-Add-more-description-for-memsize-option.patch -Patch0040: 0040-convert-convert_linux.ml-Add-debian-12-UEFI.patch -Patch0041: 0041-input-vcenter-double-uri_encode-dcPath-and-dsName.patch -Patch0042: 0042-Update-common-submodule.patch -Patch0043: 0043-Add-no-fstrim-option-to-disable-fstrim-during-conver.patch -Patch0044: 0044-convert-Stop-using-maxmem-xfs_repair-m-option.patch -Patch0045: 0045-Update-common-submodule.patch - -%if !0%{?rhel} -# libguestfs hasn't been built on i686 for a while since there is no -# kernel built for this architecture any longer and libguestfs rather -# fundamentally depends on the kernel. Therefore we must exclude this -# arch. Note there is no bug filed for this because we do not ever -# expect that libguestfs or virt-v2v will be available on i686 so -# there is nothing that needs fixing. -ExcludeArch: %{ix86} -%else -# Architectures where virt-v2v is shipped on RHEL: -# -# not on aarch64 because it is not useful there -# not on %%{power64} because of RHBZ#1287826 -# not on s390x because it is not useful there -ExclusiveArch: x86_64 -%endif +Patch0001: 0001-docs-virt-v2v.pod-Document-Windows-vTPM-and-BitLocke.patch +Patch0002: 0002-input-ssh.ml-Add-debugging-around-remote_file_exists.patch +Patch0003: 0003-input-ssh.ml-Fix-Ssh.remote_file_exists.patch +Patch0004: 0004-Update-common-submodule.patch +Patch0005: 0005-v2v-Enhance-inspection-with-filesystems-information.patch +Patch0006: 0006-inspector-Enhance-virt-v2v-inspector-output-with-fil.patch +Patch0007: 0007-convert-convert_linux.ml-Add-debian-12-UEFI.patch +Patch0008: 0008-input-vcenter-double-uri_encode-dcPath-and-dsName.patch +Patch0009: 0009-lib-Replace-nbdkit-file-cache-none-with-reduce-memor.patch +Patch0010: 0010-convert-convert_linux.ml-Condense-device-regex-handl.patch +Patch0011: 0011-convert-linux-replace-etc-crypttab-dev-sdX-with-UUID.patch +Patch0012: 0012-build-replace-AM_GNU_GETTEXT-with-simpler-LIBINTL-ch.patch +Patch0013: 0013-docs-Drop-references-to-virtio-win-osinfo-usage.patch +Patch0014: 0014-docs-update-virtio-win-exploded-tree-docs.patch +Patch0015: 0015-ocaml-link.sh.in-pass-explicit-guestfs-search-path.patch +Patch0016: 0016-output-introduce-disk_name-helper.patch +Patch0017: 0017-output-Replace-in-VM-names-with-_.patch +Patch0018: 0018-output-sanitize-guest-names-in-metadata-file-paths.patch +Patch0019: 0019-output-sanitize-VM-names-in-libvirt-XML.patch +Patch0020: 0020-RHEL-Fixes-for-libguestfs-winsupport.patch +Patch0021: 0021-RHEL-v2v-Select-correct-qemu-binary-for-o-qemu-mode-.patch +Patch0022: 0022-RHEL-v2v-Disable-the-qemu-boot-oo-qemu-boot-option-R.patch +Patch0023: 0023-RHEL-Fix-list-of-supported-sound-cards-to-match-RHEL.patch +Patch0024: 0024-RHEL-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch +Patch0025: 0025-RHEL-point-to-KB-for-supported-v2v-hypervisors-guest.patch +Patch0026: 0026-RHEL-tests-Remove-btrfs-test.patch +Patch0027: 0027-RHEL-Add-warning-about-virt-v2v-in-place-not-being-s.patch +Patch0028: 0028-RHEL-output-output.ml-Remove-reduce-memory-pressure-.patch +Patch0029: 0029-Update-common-submodule.patch +Patch0030: 0030-convert-linux-properly-match-etc-crypttab.patch BuildRequires: autoconf, automake, libtool BuildRequires: make BuildRequires: /usr/bin/pod2man +BuildRequires: perl(Pod::Usage) +BuildRequires: perl(Getopt::Long) +BuildRequires: perl(IPC::Run3) BuildRequires: gcc BuildRequires: ocaml >= 4.08 -BuildRequires: libguestfs-devel >= 1:1.56.1-2.el10 +BuildRequires: libguestfs-devel >= 1:1.58.1-2 BuildRequires: augeas-devel BuildRequires: bash-completion +%if 0%{?fedora} || 0%{?rhel} >= 11 +BuildRequires: bash-completion-devel +%endif BuildRequires: file BuildRequires: gettext-devel BuildRequires: json-c-devel -BuildRequires: libnbd-devel >= 1.14 +BuildRequires: libnbd-devel >= 1.24 BuildRequires: libosinfo-devel BuildRequires: libvirt-daemon-kvm BuildRequires: libvirt-devel @@ -126,11 +138,9 @@ BuildRequires: glibc-utils BuildRequires: %{_bindir}/qemu-nbd BuildRequires: %{_bindir}/nbdcopy BuildRequires: %{_bindir}/nbdinfo +BuildRequires: nbdkit-server >= 1.46.1 BuildRequires: nbdkit-file-plugin BuildRequires: nbdkit-null-plugin -%if !0%{?rhel} -BuildRequires: nbdkit-python-plugin -%endif BuildRequires: nbdkit-cow-filter BuildRequires: mingw-srvany-redistributable >= 1.1-6 %ifarch x86_64 @@ -141,8 +151,8 @@ BuildRequires: glibc-static BuildRequires: gnupg2 %endif -Requires: libguestfs%{?_isa} >= 1:1.56.1-2.el10 -Requires: guestfs-tools >= 1.49.7-1 +Requires: libguestfs%{?_isa} >= 1:1.58.1-2 +Requires: guestfs-tools >= 1.54 # XFS is the default filesystem in Fedora and RHEL. Requires: libguestfs-xfs @@ -168,24 +178,19 @@ Requires: edk2-ovmf Requires: edk2-aarch64 %endif -%if !0%{?rhel} +%if !%{with_ovirt} Requires: /usr/bin/python3 -%else -%if 0%{?rhel} == 9 -Requires: platform-python -# Python is not needed by RHEL 10. %endif -%endif -Requires: libnbd >= 1.10 +Requires: libnbd >= 1.24 Requires: %{_bindir}/qemu-nbd Requires: %{_bindir}/nbdcopy Requires: %{_bindir}/nbdinfo -Requires: nbdkit-server >= 1.44.1-3.el10_1 +Requires: nbdkit-server >= 1.46.1 Requires: nbdkit-curl-plugin Requires: nbdkit-file-plugin Requires: nbdkit-nbd-plugin Requires: nbdkit-null-plugin -%if !0%{?rhel} +%if !%{with_ovirt} Requires: nbdkit-python-plugin %endif Requires: nbdkit-ssh-plugin @@ -193,9 +198,9 @@ Requires: nbdkit-ssh-plugin Requires: nbdkit-vddk-plugin %endif Requires: nbdkit-blocksize-filter +Requires: nbdkit-count-filter Requires: nbdkit-cow-filter Requires: nbdkit-multi-conn-filter -Requires: nbdkit-noextents-filter Requires: nbdkit-rate-filter Requires: nbdkit-retry-filter @@ -261,11 +266,27 @@ autoreconf -fiv %build %configure \ -%if !0%{?rhel} - --with-extra="fedora=%{fedora},release=%{release}" \ +%if %{with_block_driver} + --enable-block-driver \ %else - --with-extra="rhel=%{rhel},release=%{release}" \ + --disable-block-driver \ %endif +%if %{with_glance} + --enable-glance \ +%else + --disable-glance \ +%endif +%if %{with_ovirt} + --enable-ovirt \ +%else + --disable-ovirt \ +%endif +%if %{with_xen} + --enable-xen \ +%else + --disable-xen \ +%endif + --with-extra="%{version_extra}" make V=1 %{?_smp_mflags} @@ -282,9 +303,6 @@ find $RPM_BUILD_ROOT -name '*.la' -delete mkdir -p $RPM_BUILD_ROOT%{_libexecdir} mv $RPM_BUILD_ROOT%{_bindir}/virt-v2v-in-place $RPM_BUILD_ROOT%{_libexecdir}/ rm $RPM_BUILD_ROOT%{_mandir}/man1/virt-v2v-in-place.1* -# these are also not supported on RHEL -rm -f $RPM_BUILD_ROOT%{_mandir}/man1/virt-v2v-input-xen.1* -rm -f $RPM_BUILD_ROOT%{_mandir}/man1/virt-v2v-output-ovirt.1* %endif # Find locale files. @@ -292,6 +310,23 @@ rm -f $RPM_BUILD_ROOT%{_mandir}/man1/virt-v2v-output-ovirt.1* %check +# Check that the binary runs and the features match those configured. +./run virt-v2v --version +./run virt-v2v --machine-readable | tee machine-readable.out +grep "virt-v2v-2.0" machine-readable.out +grep "input:disk" machine-readable.out +%if %{with_block_driver} +grep "block-driver-option" machine-readable.out +%endif +%if %{with_glance} +grep "output:glance" machine-readable.out +%endif +%if %{with_ovirt} +grep "output:ovirt$" machine-readable.out +grep "output:ovirt-upload" machine-readable.out +grep "output:vdsm" machine-readable.out +%endif + %ifarch x86_64 # Only run the tests with non-debug (ie. non-Rawhide) kernels. # XXX This tests for any debug kernel installed. @@ -330,15 +365,17 @@ done %{_mandir}/man1/virt-v2v.1* %{_mandir}/man1/virt-v2v-hacking.1* %{_mandir}/man1/virt-v2v-input-vmware.1* -%if !0%{?rhel} +%if %{with_xen} %{_mandir}/man1/virt-v2v-input-xen.1* +%endif +%if !0%{?rhel} %{_mandir}/man1/virt-v2v-in-place.1* %endif %{_mandir}/man1/virt-v2v-inspector.1* %{_mandir}/man1/virt-v2v-open.1* %{_mandir}/man1/virt-v2v-output-local.1* %{_mandir}/man1/virt-v2v-output-openstack.1* -%if !0%{?rhel} +%if %{with_ovirt} %{_mandir}/man1/virt-v2v-output-ovirt.1* %endif %{_mandir}/man1/virt-v2v-release-notes-1.42.1* @@ -362,54 +399,58 @@ done %changelog -* Thu Apr 23 2026 Richard W.M. Jones - 1:2.8.1-22 -- Stop using maxmem (xfs_repair -m option) - resolves: RHEL-169173 -- Fix CHS geometry error for Veritas/Sun partitions - resolves: RHEL-169224 +* Tue Feb 17 2026 Cole Robinson - 2.10.0-7 +- Attempt 2 to fix sles12sp5 crypttab + resolves: RHEL-93583 -* Fri Apr 03 2026 Richard W.M. Jones - 1:2.8.1-20 -- Add --no-fstrim option - resolves: RHEL-164582 - -* Sun Feb 15 2026 Cole Robinson - 1:2.8.1-19 +* Thu Feb 12 2026 Cole Robinson - 1:2.10.0-6 - Install blnsvr.exe to \Windows\Drivers\VirtIO - resolves: RHEL-149474 + resolves: RHEL-148423 -* Fri Jan 30 2026 Richard W.M. Jones - 1:2.8.1-18 -- Fix import when datastore name has characters like '+' - resolves: RHEL-145321 - -* Thu Jan 29 2026 Richard W.M. Jones - 1:2.8.1-17 -- Fix Debian 12 UEFI conversions - resolves: RHEL-144643 - -* Wed Jan 07 2026 Richard W.M. Jones - 1:2.8.1-16 -- Add --memsize and --smp options - resolves: RHEL-139153 - -* Tue Jan 06 2026 Richard W.M. Jones - 1:2.8.1-15 -- v2v can't convert guest with multiple windows OS on rhel10 -- Add runtime requires for nbdkit-1.44.1-3.el10_1 - resolves: RHEL-137304 - -* Mon Dec 15 2025 Richard W.M. Jones - 1:2.8.1-14 -- Remove cache=none - resolves: RHEL-135750 - -* Mon Nov 17 2025 Richard W.M. Jones - 1:2.8.1-13 -- Fix pnputil driver store after conversion - resolves: RHEL-128908 - -* Wed Oct 29 2025 Richard W.M. Jones - 1:2.8.1-12 +* Wed Feb 11 2026 Richard W.M. Jones - 1:2.10.0-5 +- Rebase to virt-v2v 2.10.0 + resolves: RHEL-111241 +- Synchronize spec file with Fedora. +- Tighten permissions on windows C:\Program Files\Guestfs + resolves: RHEL-104352 +- Don't output floppy XML with qemu lacks support + resolves: RHEL-90175 +- convert: linux: Ignore /etc/lvm/archive/*.vg files + resolves: RHEL-113820 +- mlcustomize/inject_virtio_win.ml: Use viostor.inf instead of guestor + resolves: RHEL-112517 +- Fix for setting boot order for Linux guests based on grub location + resolves: RHEL-115989, RHEL-115990 +- Remove virt-v2v subscription manager options + resolves: RHEL-122308 +- Handle subdirectories in nbdkit vddk export wildcard + resolves: RHEL-121728 +- Further fixes for nbdkit vddk export wildcard + resolves: RHEL-122753 - Fix ESP conversion if C:\Windows\Temp has alternate case - resolves: RHEL-124791 - -* Thu Sep 25 2025 Richard W.M. Jones - 1:2.8.1-10 -- Fix setting boot order for Linux BIOS guests - resolves: RHEL-108991 -- Set boot order for guests in -o kubevirt output mode - resolves: RHEL-110742 + resolves: RHEL-124569 +- setfiles runs out of memory in glibc fts_read (doc fix) + resolves: RHEL-125116 +- Use AV and GPO information from inspection instead of open coding + resolves: RHEL-125956 +- Remove reduce-memory-pressure=on as workaround for Dell Powermax 8000 + resolves: RHEL-135617 +- Hard depend on libnbd 1.24 + resolves: RHEL-140894 +- Add documentation about BitLocker Recovery + resolves: RHEL-103915 +- Fix regression when converting vmx+ssh with snapshots + resolves: RHEL-102938 +- Expose XFS version in virt-v2v-inspector + resolves: RHEL-144075 +- Fix Debian 12 UEFI conversions + resolves: RHEL-144467 +- Fix import when datastore name has characters like '+' + resolves: RHEL-133729 +- Replace /etc/crypttab /dev/sdX with UUID + resolves: RHEL-93583 +- Replace '/' in output name with '_' + resolves: RHEL-136479 * Thu Aug 21 2025 Richard W.M. Jones - 1:2.8.1-9 - Rebase to virt-v2v 2.8.1