[Libguestfs] [PATCH] convert_windows: uninstall Parallels Tools on first boot
Richard W.M. Jones
rjones at redhat.com
Wed Jan 20 17:35:54 UTC 2016
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 at 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 = "\
> + at 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
More information about the Libguestfs
mailing list