|
|
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. *)
|