Roman Kagan
2016-Jan-20 08:39 UTC
[Libguestfs] [PATCH] convert_windows: uninstall Parallels Tools on first boot
If present, Parallels Tools may stand in the way of proper running the windows guests in non-Parallels hypervisors, so we're better off uninstalling them on the first boot into the new environment. With this patch, the uninstall records for Parallels Tools are looked up in the registry and, if found, corresponding firstboot actions are registered, taking special care that those actions are run fully unattended. Signed-off-by: Roman Kagan <rkagan@virtuozzo.com> --- v2v/convert_windows.ml | 73 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml index a08555f..3ab58c2 100644 --- a/v2v/convert_windows.ml +++ b/v2v/convert_windows.ml @@ -163,12 +163,66 @@ let convert ~keep_serial_console (g : G.guestfs) inspect source Not_found -> None ) in + (* Locate and retrieve all uninstallation commands for Parallels Tools *) + let prltools_uninsts + let uninsts = ref [] in + + Windows.with_hive g software_hive_filename ~write:false + (fun root -> + try + let path = ["Microsoft"; "Windows"; "CurrentVersion"; "Uninstall"] in + let node + match Windows.get_node g root 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 + let valueh = g#hivex_node_get_value uninstnode "DisplayName" in + if valueh = 0L then + raise Not_found; + + let dispname = g#hivex_value_utf8 valueh in + if not (Str.string_match (Str.regexp ".*Parallels Tools.*") + dispname 0) 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 Parallels Tools: registry key 'HKLM\\SOFTWARE\\%s\\%s' with DisplayName '%s' doesn't contain value '%s'") + (String.concat "\\" path) name dispname uninstval; + raise Not_found + ); + + let uninst = (g#hivex_value_utf8 valueh) ^ + " /quiet /norestart /l*v+ \"%~dpn0.log\"" ^ + " REBOOT=ReallySuppress REMOVE=ALL" ^ + (* without these custom Parallels-specific MSI properties the + * uninstaller still shows a no-way-out reboot dialog *) + " PREVENT_REBOOT=Yes LAUNCHED_BY_SETUP_EXE=Yes" in + + uninsts := uninst :: !uninsts + with + Not_found -> () + ) uninstnodes + with + Not_found -> () + ); + + !uninsts + in + (*----------------------------------------------------------------------*) (* Perform the conversion of the Windows guest. *) let rec configure_firstboot () configure_rhev_apt (); - unconfigure_xenpv () + unconfigure_xenpv (); + unconfigure_prltools () and configure_rhev_apt () (* Configure RHEV-APT (the RHEV guest agent). However if it doesn't @@ -203,6 +257,23 @@ echo uninstalling Xen PV driver " uninst in Firstboot.add_firstboot_script g inspect.i_root "uninstall Xen PV" fb_script + + and unconfigure_prltools () + List.iter ( + fun uninst -> + let fb_script = "\ +@echo off + +echo uninstalling Parallels guest tools +" ^ uninst ^ +(* ERROR_SUCCESS_REBOOT_REQUIRED == 3010 is OK too *) +" +if errorlevel 3010 exit /b 0 +" in + + Firstboot.add_firstboot_script g inspect.i_root + "uninstall Parallels tools" fb_script + ) prltools_uninsts in let rec update_system_hive root -- 2.5.0
Richard W.M. Jones
2016-Jan-20 17:35 UTC
Re: [Libguestfs] [PATCH] convert_windows: uninstall Parallels Tools on first boot
On Wed, Jan 20, 2016 at 11:39:43AM +0300, Roman Kagan wrote:> If present, Parallels Tools may stand in the way of proper running the > windows guests in non-Parallels hypervisors, so we're better off > uninstalling them on the first boot into the new environment. > > With this patch, the uninstall records for Parallels Tools are looked up > in the registry and, if found, corresponding firstboot actions are > registered, taking special care that those actions are run fully > unattended. > > Signed-off-by: Roman Kagan <rkagan@virtuozzo.com> > --- > v2v/convert_windows.ml | 73 +++++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 72 insertions(+), 1 deletion(-) > > diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml > index a08555f..3ab58c2 100644 > --- a/v2v/convert_windows.ml > +++ b/v2v/convert_windows.ml > @@ -163,12 +163,66 @@ let convert ~keep_serial_console (g : G.guestfs) inspect source > Not_found -> None > ) in > > + (* Locate and retrieve all uninstallation commands for Parallels Tools *) > + let prltools_uninsts > + let uninsts = ref [] in > + > + Windows.with_hive g software_hive_filename ~write:false > + (fun root -> > + try > + let path = ["Microsoft"; "Windows"; "CurrentVersion"; "Uninstall"] in > + let node > + match Windows.get_node g root 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 > + let valueh = g#hivex_node_get_value uninstnode "DisplayName" in > + if valueh = 0L then > + raise Not_found; > + > + let dispname = g#hivex_value_utf8 valueh in > + if not (Str.string_match (Str.regexp ".*Parallels Tools.*") > + dispname 0) 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 Parallels Tools: registry key 'HKLM\\SOFTWARE\\%s\\%s' with DisplayName '%s' doesn't contain value '%s'") > + (String.concat "\\" path) name dispname uninstval; > + raise Not_found > + ); > + > + let uninst = (g#hivex_value_utf8 valueh) ^ > + " /quiet /norestart /l*v+ \"%~dpn0.log\"" ^ > + " REBOOT=ReallySuppress REMOVE=ALL" ^ > + (* without these custom Parallels-specific MSI properties the > + * uninstaller still shows a no-way-out reboot dialog *) > + " PREVENT_REBOOT=Yes LAUNCHED_BY_SETUP_EXE=Yes" in > + > + uninsts := uninst :: !uninsts > + with > + Not_found -> () > + ) uninstnodes > + with > + Not_found -> () > + ); > + > + !uninsts > + in > + > (*----------------------------------------------------------------------*) > (* Perform the conversion of the Windows guest. *) > > let rec configure_firstboot () > configure_rhev_apt (); > - unconfigure_xenpv () > + unconfigure_xenpv (); > + unconfigure_prltools () > > and configure_rhev_apt () > (* Configure RHEV-APT (the RHEV guest agent). However if it doesn't > @@ -203,6 +257,23 @@ echo uninstalling Xen PV driver > " uninst in > Firstboot.add_firstboot_script g inspect.i_root > "uninstall Xen PV" fb_script > + > + and unconfigure_prltools () > + List.iter ( > + fun uninst -> > + let fb_script = "\ > +@echo off > + > +echo uninstalling Parallels guest tools > +" ^ uninst ^ > +(* ERROR_SUCCESS_REBOOT_REQUIRED == 3010 is OK too *) > +" > +if errorlevel 3010 exit /b 0 > +" in > + > + Firstboot.add_firstboot_script g inspect.i_root > + "uninstall Parallels tools" fb_script > + ) prltools_uninsts > in > > let rec update_system_hive root > --Thanks - pushed. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into KVM guests. http://libguestfs.org/virt-v2v
Possibly Parallel Threads
- [PATCH 0/2] v2v: uninstall the VMware Tools from Windows guests
- [PATCH 1/2] v2v: windows: factor uninstall commands search
- [PATCH v3 15/22] v2v: windows: Convert the Windows-related conversion modules from Str to PCRE.
- [PATCH v12 04/11] New API: Deprecate hivex_value_utf8 and replace with hivex_value_string.
- [PATCH] v2v: recognize Virtuozzo tools as Parallels tools