X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=inspector%2Fvirt-inspector;h=c721b1d6fb9122e1ca125e32771ad7624a95bd05;hp=49360688ad5ec0b9c53c1521cd5d64be10983500;hb=60a62788d48e1d45fcb75cf0bcc7d375c42b83ba;hpb=233530d3541dd67ce8fec7d9677cdf659c9d2900 diff --git a/inspector/virt-inspector b/inspector/virt-inspector index 4936068..c721b1d 100755 --- a/inspector/virt-inspector +++ b/inspector/virt-inspector @@ -189,6 +189,8 @@ $xml->startTag ("operatingsystems"); my $root; foreach $root (@roots) { + # Note that output_applications requires the filesystems + # to be mounted up. my %fses = $g->inspect_get_mountpoints ($root); my @fses = sort { length $a <=> length $b } keys %fses; foreach (@fses) { @@ -200,19 +202,23 @@ foreach $root (@roots) { # Basic OS fields. $xml->dataElement (root => canonicalize ($root)); - my ($s, $distro, $major_version); + my $s; $s = $g->inspect_get_type ($root); $xml->dataElement (name => $s) if $s ne "unknown"; $s = $g->inspect_get_arch ($root); $xml->dataElement (arch => $s) if $s ne "unknown"; - $distro = $g->inspect_get_distro ($root); - $xml->dataElement (distro => $distro) if $distro ne "unknown"; + $s = $g->inspect_get_distro ($root); + $xml->dataElement (distro => $s) if $s ne "unknown"; $s = $g->inspect_get_product_name ($root); $xml->dataElement (product_name => $s) if $s ne "unknown"; - $major_version = $g->inspect_get_major_version ($root); - $xml->dataElement (major_version => $major_version); + $s = $g->inspect_get_major_version ($root); + $xml->dataElement (major_version => $s); $s = $g->inspect_get_minor_version ($root); $xml->dataElement (minor_version => $s); + $s = $g->inspect_get_package_format ($root); + $xml->dataElement (package_format => $s) if $s ne "unknown"; + $s = $g->inspect_get_package_management ($root); + $xml->dataElement (package_management => $s) if $s ne "unknown"; eval { $s = $g->inspect_get_windows_systemroot ($root); @@ -226,7 +232,7 @@ foreach $root (@roots) { output_filesystems ($root); # Package format / management and applications. - output_applications ($root, $distro, $major_version); + output_applications ($root); $xml->endTag("operatingsystem"); @@ -361,8 +367,9 @@ installed. 1 -(The version and release fields may not be available for -some package types). +The version and release fields may not be available for some types +guests. Other fields are possible, see +L. =cut @@ -370,151 +377,34 @@ sub output_applications { local $_; my $root = shift; - my $distro = shift; - my $major_version = shift; - - # Based on the distro, take a guess at the package format - # and package management. - my ($package_format, $package_management); - if (defined $distro) { - if ($distro eq "debian") { - $package_format = "deb"; - $package_management = "apt"; - } - elsif ($distro eq "fedora") { - $package_format = "rpm"; - $package_management = "yum"; - } - elsif ($distro eq "pardus") { - $package_format = "pisi"; - $package_management = "pisi"; - } - elsif ($distro =~ /redhat/ || $distro =~ /rhel/) { - if ($major_version >= 5) { - $package_format = "rpm"; - $package_management = "yum"; - } else { - $package_format = "rpm"; - $package_management = "up2date"; - } - } - # else unknown. - } - - $xml->dataElement (package_format => $package_format) - if defined $package_format; - $xml->dataElement (package_management => $package_management) - if defined $package_management; - - # Do we know how to get a list of applications? - if (defined $package_format) { - if ($package_format eq "rpm") { - output_applications_rpm ($root); - } - elsif ($package_format eq "deb") { - output_applications_deb ($root); - } - } -} - -sub output_applications_rpm -{ - local $_; - my $root = shift; - - # Previous virt-inspector ran the 'rpm' program from the guest. - # This is insecure, and unnecessary because we can get the same - # information directly from the RPM database. - - my @applications; - - eval { - my ($fh, $filename) = tempfile (UNLINK => 1); - my $fddev = "/dev/fd/" . fileno ($fh); - $g->download ("/var/lib/rpm/Name", $fddev); - close $fh or die "close: $!"; - - # Read the database with the Berkeley DB dump tool. - my $cmd = "db_dump -p '$filename'"; - open PIPE, "$cmd |" or die "close: $!"; - while () { - chomp; - last if /^HEADER=END$/; - } - while () { - chomp; - last if /^DATA=END$/; - - # First character on each data line is a space. - if (length $_ > 0 && substr ($_, 0, 1) eq ' ') { - $_ = substr ($_, 1); - } - # Name should never contain non-printable chars. - die "name contains non-printable chars" if /\\/; - push @applications, $_; - - $_ = ; # discard value - } - close PIPE or die "close: $!"; - }; - if (!$@ && @applications > 0) { - @applications = sort @applications; - $xml->startTag ("applications"); - foreach (@applications) { - $xml->startTag ("application"); - $xml->dataElement (name => $_); - $xml->endTag ("application"); - } - $xml->endTag ("applications"); - } -} -sub output_applications_deb -{ - local $_; - my $root = shift; + my @apps = $g->inspect_list_applications ($root); - my @applications; - - eval { - my ($fh, $filename) = tempfile (UNLINK => 1); - my $fddev = "/dev/fd/" . fileno ($fh); - $g->download ("/var/lib/dpkg/status", $fddev); - close $fh or die "close: $!"; - - # Read the file. Each package is separated by a blank line. - open FILE, $filename or die "$filename: $!"; - my ($name, $installed, $version, $release); - while () { - chomp; - if (/^Package: (.*)/) { - $name = $1; - } elsif (/^Status: .*\binstalled\b/) { - $installed = 1; - } elsif (/^Version: (.*?)-(.*)/) { - $version = $1; - $release = $2; - } elsif ($_ eq "") { - if ($installed && - defined $name && defined $version && defined $release) { - push @applications, [ $name, $version, $release ]; - } - $name = undef; - $installed = undef; - $version = undef; - $release = undef; - } - } - close FILE or die "$filename: $!"; - }; - if (!$@ && @applications > 0) { - @applications = sort { $a->[0] cmp $b->[0] } @applications; + if (@apps) { $xml->startTag ("applications"); - foreach (@applications) { + foreach (@apps) { $xml->startTag ("application"); - $xml->dataElement (name => $_->[0]); - $xml->dataElement (version => $_->[1]); - $xml->dataElement (release => $_->[2]); + $xml->dataElement (name => $_->{app_name}); + $xml->dataElement (display_name => $_->{app_display_name}) + if $_->{app_display_name} ne ""; + $xml->dataElement (epoch => $_->{app_epoch}) + if $_->{app_epoch} != 0; + $xml->dataElement (version => $_->{app_version}) + if $_->{app_version} ne ""; + $xml->dataElement (release => $_->{app_release}) + if $_->{app_release} ne ""; + $xml->dataElement (install_path => $_->{app_install_path}) + if $_->{app_install_path} ne ""; + $xml->dataElement (publisher => $_->{app_publisher}) + if $_->{app_publisher} ne ""; + $xml->dataElement (url => $_->{app_url}) + if $_->{app_url} ne ""; + $xml->dataElement (source_package => $_->{app_source_package}) + if $_->{app_source_package} ne ""; + $xml->dataElement (summary => $_->{app_summary}) + if $_->{app_summary} ne ""; + $xml->dataElement (description => $_->{app_description}) + if $_->{app_description} ne ""; $xml->endTag ("application"); } $xml->endTag ("applications");