From 06f6cc32f02c25b88e763237332b17dc7c6c6837 Mon Sep 17 00:00:00 2001 From: Matthew Booth Date: Mon, 20 Jul 2009 11:16:55 +0100 Subject: [PATCH 1/1] Replace 'distrofamily' with feature tags It turns out that the distribution hierarchy is not as reliable concept as you might think. This patch removes distrofamily again. Instead of distrofamily, we will add feature tags. This patch adds 2 feature tags for Linux distributions: package_format (eg rpm/dpkg) package_management (eg rhn/yum/apt) This change is reflected in the output of virt-inspector --- inspector/virt-inspector.pl | 4 ++-- perl/lib/Sys/Guestfs/Lib.pm | 39 ++++++++++++++++++++++++++++++--------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/inspector/virt-inspector.pl b/inspector/virt-inspector.pl index 5f612e3..cd53bcb 100755 --- a/inspector/virt-inspector.pl +++ b/inspector/virt-inspector.pl @@ -353,7 +353,6 @@ sub output_text_os print $os->{os}, " " if exists $os->{os}; print $os->{distro}, " " if exists $os->{distro}; print $os->{version}, " " if exists $os->{version}; - print "(".$os->{distrofamily}." family)", " " if exists $os->{distrofamily}; print "on ", $os->{root_device}, ":\n"; print __" Mountpoints:\n"; @@ -444,8 +443,9 @@ sub output_xml_os foreach ( [ "name" => "os" ], [ "distro" => "distro" ], - [ "distrofamily" => "distrofamily" ], [ "version" => "version" ], + [ "package_format" => "package_format" ], + [ "package_management" => "package_management" ], [ "root" => "root_device" ] ) { $xml->dataElement($_->[0], $os->{$_->[1]}) if exists $os->{$_->[1]}; } diff --git a/perl/lib/Sys/Guestfs/Lib.pm b/perl/lib/Sys/Guestfs/Lib.pm index df3bbe1..f084090 100644 --- a/perl/lib/Sys/Guestfs/Lib.pm +++ b/perl/lib/Sys/Guestfs/Lib.pm @@ -478,10 +478,16 @@ Filesystem content, if we could determine it. One of: "linux-grub", Operating system distribution. One of: "fedora", "rhel", "centos", "scientific", "debian". -=item osdistrofamily +=item package_format (For Linux root partitions only) -Operating system distribution family. One of: "redhat", "debian". +The package format used by the guest distribution. One of: "rpm", "dpkg". + +=item package_management + +(For Linux root partitions only) +The package management tool used by the guest distribution. One of: "rhn", +"yum", "apt". =item osversion @@ -614,12 +620,13 @@ sub _check_linux_root # Look into /etc to see if we recognise the operating system. if ($g->is_file ("/etc/redhat-release")) { - $r->{osdistrofamily} = "redhat"; + $r->{package_format} = "rpm"; $_ = $g->cat ("/etc/redhat-release"); if (/Fedora release (\d+\.\d+)/) { $r->{osdistro} = "fedora"; - $r->{osversion} = "$1" + $r->{osversion} = "$1"; + $r->{package_management} = "yum"; } elsif (/(Red Hat Enterprise Linux|CentOS|Scientific Linux)/) { @@ -631,10 +638,12 @@ sub _check_linux_root elsif($distro eq "CentOS") { $r->{osdistro} = "centos"; + $r->{package_management} = "yum"; } elsif($distro eq "Scientific Linux") { $r->{osdistro} = "scientific"; + $r->{package_management} = "yum"; } # Shouldn't be possible @@ -647,13 +656,23 @@ sub _check_linux_root elsif (/$distro.*release (\d+(?:\.(?:\d+))?)/) { $r->{osversion} = "$1"; } + + # Package management in RHEL changed in version 5 + if ($r->{osdistro} eq "rhel") { + if ($r->{osversion} >= 5) { + $r->{package_management} = "yum"; + } else { + $r->{package_management} = "rhn"; + } + } } else { $r->{osdistro} = "redhat-based"; } } elsif ($g->is_file ("/etc/debian_version")) { - $r->{osdistrofamily} = "debian"; + $r->{package_format} = "dpkg"; + $r->{package_management} = "apt"; $_ = $g->cat ("/etc/debian_version"); if (/(\d+\.\d+)/) { @@ -915,9 +934,11 @@ sub _get_os_version $r->{os} = $r->{root}->{fsos} if exists $r->{root}->{fsos}; $r->{distro} = $r->{root}->{osdistro} if exists $r->{root}->{osdistro}; - $r->{distrofamily} = $r->{root}->{osdistrofamily} - if exists $r->{root}->{osdistrofamily}; $r->{version} = $r->{root}->{osversion} if exists $r->{root}->{osversion}; + $r->{package_format} = $r->{root}->{package_format} + if exists $r->{root}->{package_format}; + $r->{package_management} = $r->{root}->{package_management} + if exists $r->{root}->{package_management}; } sub _assign_mount_points @@ -1097,8 +1118,8 @@ sub _check_for_applications my $osn = $os->{os}; if ($osn eq "linux") { - my $family = $os->{distrofamily}; - if (defined $family && $family eq "redhat") { + my $package_format = $os->{package_format}; + if (defined $package_format && $package_format eq "rpm") { my @lines = $g->command_lines (["rpm", "-q", "-a", -- 1.8.3.1