X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=inspector%2Fvirt-inspector;h=49360688ad5ec0b9c53c1521cd5d64be10983500;hp=71a8884bc54320e028734207bf4a756ac945ed83;hb=233530d3541dd67ce8fec7d9677cdf659c9d2900;hpb=6548a876f367427404a0f9ce9a634b01e0ccac78 diff --git a/inspector/virt-inspector b/inspector/virt-inspector index 71a8884..4936068 100755 --- a/inspector/virt-inspector +++ b/inspector/virt-inspector @@ -305,6 +305,7 @@ sub output_filesystems $xml->startTag ("filesystems"); my @fses = $g->inspect_get_filesystems ($root); + @fses = sort @fses; foreach (@fses) { $xml->startTag ("filesystem", dev => canonicalize ($_)); @@ -338,8 +339,8 @@ sub output_filesystems The related elements Epackage_formatE, Epackage_managementE and EapplicationsE describe applications installed in the virtual machine. At the moment we are -only able to list RPMs installed, but in future we will support other -Linux distros and Windows. +only able to list RPMs and Debian packages installed, but in future we +will support other Linux distros and Windows. Epackage_formatE, if present, describes the packaging system used. Typical values would be C and C. @@ -348,7 +349,7 @@ Epackage_managementE, if present, describes the package manager. Typical values include C, C and C EapplicationsE lists the packages or applications -installed. At present this simply lists them by name: +installed. @@ -356,9 +357,12 @@ installed. At present this simply lists them by name: coreutils + 8.5 + 1 -In future we will also include the version here. +(The version and release fields may not be available for +some package types). =cut @@ -381,6 +385,10 @@ sub output_applications $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"; @@ -403,7 +411,9 @@ sub output_applications if ($package_format eq "rpm") { output_applications_rpm ($root); } - # else no we don't. + elsif ($package_format eq "deb") { + output_applications_deb ($root); + } } } @@ -459,6 +469,58 @@ sub output_applications_rpm } } +sub output_applications_deb +{ + local $_; + my $root = shift; + + 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; + $xml->startTag ("applications"); + foreach (@applications) { + $xml->startTag ("application"); + $xml->dataElement (name => $_->[0]); + $xml->dataElement (version => $_->[1]); + $xml->dataElement (release => $_->[2]); + $xml->endTag ("application"); + } + $xml->endTag ("applications"); + } +} + # The reverse of device name translation, see # BLOCK DEVICE NAMING in guestfs(3). sub canonicalize