Pino Toscano
2016-Oct-04 12:57 UTC
[Libguestfs] [PATCH] v2v: linux: try to fix removal of VMware tools
Try to improve the way packages of VMware tools are removed from YUM-based guests: - when filtering the package itself from its providers, do a stricter check so either the provide is the unversioned package, or it is exactly its own name - if the package has no other providers, then going further will cause the invocation of 'yum install' with no packages, and thus the package itself will not be added to the list of packages to be removed; to overcome this issue, just mark the package as "to be removed" in that case Related to: RHBZ#1155150 --- v2v/convert_linux.ml | 56 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/v2v/convert_linux.ml b/v2v/convert_linux.ml index 6b4197d..8771869 100644 --- a/v2v/convert_linux.ml +++ b/v2v/convert_linux.ml @@ -252,29 +252,41 @@ let rec convert ~keep_serial_console (g : G.guestfs) inspect source rcaps (* The packages provide themselves, filter this out. *) let provides - List.filter (fun s -> String.find s library = -1) provides in - - (* Trim whitespace. *) - let rex = Str.regexp "^[ \t]*\\([^ \t]+\\)[ \t]*$" in - let provides = List.map (Str.replace_first rex "\\1") provides in - - (* Install the dependencies with yum. Use yum explicitly - * because we don't have package names and local install is - * impractical. + List.filter ( + fun s -> + not (library = s || String.is_prefix s (library ^ " = ")) + ) provides in + + (* If the package provides something other than itself, then + * proceed installing the replacements; in the other case, + * just mark the package for removal, as it means no other + * package can depend on something provided. *) - let cmd = ["yum"; "-q"; "resolvedep"] @ provides in - let cmd = Array.of_list cmd in - let replacements = g#command_lines cmd in - let replacements = Array.to_list replacements in - - let cmd = [ "yum"; "install"; "-y" ] @ replacements in - let cmd = Array.of_list cmd in - (try - ignore (g#command cmd); - push_front library remove - with G.Error msg -> - eprintf "%s: could not install replacement for %s. Error was: %s. %s was not removed.\n" - prog library msg library + if provides <> [] then ( + (* Trim whitespace. *) + let rex = Str.regexp "^[ \t]*\\([^ \t]+\\)[ \t]*$" in + let provides = List.map (Str.replace_first rex "\\1") provides in + + (* Install the dependencies with yum. Use yum explicitly + * because we don't have package names and local install is + * impractical. + *) + let cmd = ["yum"; "-q"; "resolvedep"] @ provides in + let cmd = Array.of_list cmd in + let replacements = g#command_lines cmd in + let replacements = Array.to_list replacements in + + let cmd = [ "yum"; "install"; "-y" ] @ replacements in + let cmd = Array.of_list cmd in + (try + ignore (g#command cmd); + push_front library remove + with G.Error msg -> + eprintf "%s: could not install replacement for %s. Error was: %s. %s was not removed.\n" + prog library msg library + ); + ) else ( + push_front library remove; ); ) libraries ) -- 2.7.4
Richard W.M. Jones
2016-Oct-04 13:04 UTC
Re: [Libguestfs] [PATCH] v2v: linux: try to fix removal of VMware tools
On Tue, Oct 04, 2016 at 02:57:53PM +0200, Pino Toscano wrote:> Try to improve the way packages of VMware tools are removed from > YUM-based guests: > > - when filtering the package itself from its providers, do a stricter > check so either the provide is the unversioned package, or it is > exactly its own name > > - if the package has no other providers, then going further will cause > the invocation of 'yum install' with no packages, and thus the package > itself will not be added to the list of packages to be removed; to > overcome this issue, just mark the package as "to be removed" in that > case > > Related to: RHBZ#1155150This patch is a bit nicer to look at when viewed with the '-w' flag. ACK. That said, I don't know if this is going to work. Is there some plan to test it? Rich.> --- > v2v/convert_linux.ml | 56 +++++++++++++++++++++++++++++++--------------------- > 1 file changed, 34 insertions(+), 22 deletions(-) > > diff --git a/v2v/convert_linux.ml b/v2v/convert_linux.ml > index 6b4197d..8771869 100644 > --- a/v2v/convert_linux.ml > +++ b/v2v/convert_linux.ml > @@ -252,29 +252,41 @@ let rec convert ~keep_serial_console (g : G.guestfs) inspect source rcaps > > (* The packages provide themselves, filter this out. *) > let provides > - List.filter (fun s -> String.find s library = -1) provides in > - > - (* Trim whitespace. *) > - let rex = Str.regexp "^[ \t]*\\([^ \t]+\\)[ \t]*$" in > - let provides = List.map (Str.replace_first rex "\\1") provides in > - > - (* Install the dependencies with yum. Use yum explicitly > - * because we don't have package names and local install is > - * impractical. > + List.filter ( > + fun s -> > + not (library = s || String.is_prefix s (library ^ " = ")) > + ) provides in > + > + (* If the package provides something other than itself, then > + * proceed installing the replacements; in the other case, > + * just mark the package for removal, as it means no other > + * package can depend on something provided. > *) > - let cmd = ["yum"; "-q"; "resolvedep"] @ provides in > - let cmd = Array.of_list cmd in > - let replacements = g#command_lines cmd in > - let replacements = Array.to_list replacements in > - > - let cmd = [ "yum"; "install"; "-y" ] @ replacements in > - let cmd = Array.of_list cmd in > - (try > - ignore (g#command cmd); > - push_front library remove > - with G.Error msg -> > - eprintf "%s: could not install replacement for %s. Error was: %s. %s was not removed.\n" > - prog library msg library > + if provides <> [] then ( > + (* Trim whitespace. *) > + let rex = Str.regexp "^[ \t]*\\([^ \t]+\\)[ \t]*$" in > + let provides = List.map (Str.replace_first rex "\\1") provides in > + > + (* Install the dependencies with yum. Use yum explicitly > + * because we don't have package names and local install is > + * impractical. > + *) > + let cmd = ["yum"; "-q"; "resolvedep"] @ provides in > + let cmd = Array.of_list cmd in > + let replacements = g#command_lines cmd in > + let replacements = Array.to_list replacements in > + > + let cmd = [ "yum"; "install"; "-y" ] @ replacements in > + let cmd = Array.of_list cmd in > + (try > + ignore (g#command cmd); > + push_front library remove > + with G.Error msg -> > + eprintf "%s: could not install replacement for %s. Error was: %s. %s was not removed.\n" > + prog library msg library > + ); > + ) else ( > + push_front library remove; > ); > ) libraries > ) > -- > 2.7.4 > > _______________________________________________ > Libguestfs mailing list > Libguestfs@redhat.com > https://www.redhat.com/mailman/listinfo/libguestfs-- 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
Maybe Matching Threads
- [PATCH] v2v: fix provides list whitespace trim
- [PATCH 2/7] v2v: add basic support for the "deb" package manager
- Re: [PATCH 2/8] v2v: add basic support for the "deb" package manager
- Re: [PATCH 2/8] v2v: add basic support for the "deb" package manager
- Re: [PATCH 8/8] v2v: linux: correctly reconfigure the initrd on Debian