2f9214744a
- Don't comment out patch 0029 (the common submodule update). - Use a common/.gitattributes trick to exclude files from the common patch that are not included in virt-v2v tarball. This also requires some sed hacking. NB: I tried using ':(exclude)...' stuff and it does not work for submodules, at least not with the git version in RHEL 8. For more info see private email thread "Customer case requiring our assistance" in 2023. Reviewed-by: Laszlo Ersek <lersek@redhat.com> resolves: rhbz#2184183
135 lines
5.5 KiB
Diff
135 lines
5.5 KiB
Diff
From 9c81b523857e057b8361cbbcc4647ed02b572ca0 Mon Sep 17 00:00:00 2001
|
||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||
Date: Tue, 19 Jan 2021 11:38:46 +0000
|
||
Subject: [PATCH] v2v: windows: Refactor uninstallation_commands function.
|
||
|
||
Simplify and shorten this function:
|
||
|
||
- Remove unnecessary use of Not_found exception and generally
|
||
simplify flow control.
|
||
|
||
- Use sprintf.
|
||
|
||
This shouldn't change what the function does.
|
||
|
||
(cherry picked from commit d48530209a79725f26d6e25101bed6f228f45e8d)
|
||
---
|
||
v2v/convert_windows.ml | 89 ++++++++++++++++++------------------------
|
||
1 file changed, 37 insertions(+), 52 deletions(-)
|
||
|
||
diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml
|
||
index f2f7b95c..84db742f 100644
|
||
--- a/v2v/convert_windows.ml
|
||
+++ b/v2v/convert_windows.ml
|
||
@@ -135,56 +135,41 @@ let convert (g : G.guestfs) inspect _ output rcaps static_ips =
|
||
(* Locate and retrieve all the uninstallation commands for installed
|
||
* applications.
|
||
*)
|
||
- let uninstallation_commands pretty_name matchfn extra_uninstall_string =
|
||
- let uninsts = ref [] in
|
||
+ let uninstallation_commands pretty_name matchfn extra_uninstall_params =
|
||
+ let path = ["Microsoft"; "Windows"; "CurrentVersion"; "Uninstall"] in
|
||
+ let uninstval = "UninstallString" in
|
||
+ let ret = ref [] in
|
||
|
||
- Registry.with_hive_readonly g inspect.i_windows_software_hive
|
||
- (fun reg ->
|
||
- try
|
||
- let path = ["Microsoft"; "Windows"; "CurrentVersion"; "Uninstall"] in
|
||
- let node =
|
||
- match Registry.get_node reg path with
|
||
- | None -> raise Not_found
|
||
- | Some node -> node in
|
||
- let uninstnodes = g#hivex_node_children node in
|
||
-
|
||
- Array.iter (
|
||
- fun { G.hivex_node_h = uninstnode } ->
|
||
- try
|
||
+ Registry.with_hive_readonly g inspect.i_windows_software_hive (
|
||
+ fun reg ->
|
||
+ match Registry.get_node reg path with
|
||
+ | None -> ()
|
||
+ | Some node ->
|
||
+ let uninstnodes = g#hivex_node_children node in
|
||
+ Array.iter (
|
||
+ fun { G.hivex_node_h = uninstnode } ->
|
||
let valueh = g#hivex_node_get_value uninstnode "DisplayName" in
|
||
- if valueh = 0L then
|
||
- raise Not_found;
|
||
-
|
||
- let dispname = g#hivex_value_string valueh in
|
||
- if not (matchfn dispname) then
|
||
- raise Not_found;
|
||
-
|
||
- let uninstval = "UninstallString" in
|
||
- let valueh = g#hivex_node_get_value uninstnode uninstval in
|
||
- if valueh = 0L then (
|
||
- let name = g#hivex_node_name uninstnode in
|
||
- warning (f_"cannot uninstall %s: registry key ‘HKLM\\SOFTWARE\\%s\\%s’ with DisplayName ‘%s’ doesn't contain value ‘%s’")
|
||
- pretty_name (String.concat "\\" path) name dispname uninstval;
|
||
- raise Not_found
|
||
- );
|
||
-
|
||
- let uninst = (g#hivex_value_string valueh) ^
|
||
- " /quiet /norestart /l*v+ \"%~dpn0.log\"" ^
|
||
- " REBOOT=ReallySuppress REMOVE=ALL" in
|
||
- let uninst =
|
||
- match extra_uninstall_string with
|
||
- | None -> uninst
|
||
- | Some s -> uninst ^ " " ^ s in
|
||
-
|
||
- List.push_front uninst uninsts
|
||
- with
|
||
- Not_found -> ()
|
||
- ) uninstnodes
|
||
- with
|
||
- Not_found -> ()
|
||
- );
|
||
-
|
||
- !uninsts
|
||
+ if valueh <> 0L then (
|
||
+ let dispname = g#hivex_value_string valueh in
|
||
+ if matchfn dispname then (
|
||
+ let valueh = g#hivex_node_get_value uninstnode uninstval in
|
||
+ if valueh <> 0L then (
|
||
+ let reg_cmd = g#hivex_value_string valueh in
|
||
+ let cmd =
|
||
+ sprintf "%s /quiet /norestart /l*v+ \"%%~dpn0.log\" REBOOT=ReallySuppress REMOVE=ALL %s"
|
||
+ reg_cmd extra_uninstall_params in
|
||
+ List.push_front cmd ret
|
||
+ )
|
||
+ else
|
||
+ let name = g#hivex_node_name uninstnode in
|
||
+ warning (f_"cannot uninstall %s: registry key ‘HKLM\\SOFTWARE\\%s\\%s’ with DisplayName ‘%s’ doesn't contain value ‘%s’")
|
||
+ pretty_name (String.concat "\\" path) name
|
||
+ dispname uninstval
|
||
+ )
|
||
+ )
|
||
+ ) uninstnodes
|
||
+ ) (* with_hive_readonly *);
|
||
+ !ret
|
||
in
|
||
|
||
(* Locate and retrieve all uninstallation commands for Parallels Tools. *)
|
||
@@ -196,16 +181,16 @@ let convert (g : G.guestfs) inspect _ output rcaps static_ips =
|
||
(* Without these custom Parallels-specific MSI properties the
|
||
* uninstaller still shows a no-way-out reboot dialog.
|
||
*)
|
||
- let extra_uninstall_string =
|
||
- Some "PREVENT_REBOOT=Yes LAUNCHED_BY_SETUP_EXE=Yes" in
|
||
- uninstallation_commands "Parallels Tools" matchfn extra_uninstall_string in
|
||
+ let extra_uninstall_params =
|
||
+ "PREVENT_REBOOT=Yes LAUNCHED_BY_SETUP_EXE=Yes" in
|
||
+ uninstallation_commands "Parallels Tools" matchfn extra_uninstall_params in
|
||
|
||
(* Locate and retrieve all uninstallation commands for VMware Tools. *)
|
||
let vmwaretools_uninst =
|
||
let matchfn s =
|
||
String.find s "VMware Tools" != -1
|
||
in
|
||
- uninstallation_commands "VMware Tools" matchfn None in
|
||
+ uninstallation_commands "VMware Tools" matchfn "" in
|
||
|
||
(*----------------------------------------------------------------------*)
|
||
(* Perform the conversion of the Windows guest. *)
|