138 lines
5.5 KiB
Diff
138 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. *)
|
||
--
|
||
2.31.1
|
||
|