You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
virt-v2v/SOURCES/0027-v2v-windows-Refactor-u...

135 lines
5.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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