X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=inspector%2Fvirt-inspector.pl;h=c8c045e12f02728fcab59259e3cb4f4597f697fb;hp=12851c2575f59fe8043eb2929bc1b79a24c7860a;hb=6f2929c4635c3f2af4a9211981d9edd1f58cce69;hpb=5aa57fbd34eb34922719d08712303b9d73ec215f diff --git a/inspector/virt-inspector.pl b/inspector/virt-inspector.pl index 12851c2..c8c045e 100755 --- a/inspector/virt-inspector.pl +++ b/inspector/virt-inspector.pl @@ -113,6 +113,8 @@ my $output = "text"; =item B<--xml> +=item B<--perl> + =item B<--fish> =item B<--ro-fish> @@ -122,6 +124,9 @@ Select the output format. The default is a readable text report. If you select I<--xml> then you get XML output which can be fed to other programs. +If you select I<--perl> then you get Perl structures output which +can be used directly in another Perl program. + If you select I<--fish> then we print a L command line which will automatically mount up the filesystems on the correct mount points. Try this for example: @@ -139,6 +144,7 @@ GetOptions ("help|?" => \$help, "connect|c=s" => \$uri, "force" => \$force, "xml" => sub { $output = "xml" }, + "perl" => sub { $output = "perl" }, "fish" => sub { $output = "fish" }, "guestfish" => sub { $output = "fish" }, "ro-fish" => sub { $output = "ro-fish" }, @@ -442,6 +448,7 @@ sub check_grub #print Dumper (\%fses); +#---------------------------------------------------------------------- # Now find out how many operating systems we've got. Usually just one. my %oses = (); @@ -523,19 +530,121 @@ sub find_filesystem return (); } else { return ($_, $fses{$_}) if exists $fses{$_}; + + if (m{^/dev/hd(.*)} && exists $fses{"/dev/sd$1"}) { + return ("/dev/sd$1", $fses{"/dev/sd$1"}); + } + if (m{^/dev/xvd(.*)} && exists $fses{"/dev/sd$1"}) { + return ("/dev/sd$1", $fses{"/dev/sd$1"}); + } + + return () if m{/dev/cdrom}; + warn "unknown filesystem $_\n"; return (); } } -print Dumper (\%oses); +#print Dumper(\%oses); + +#---------------------------------------------------------------------- +# Mount up the disks so we can check for applications +# and kernels. Skip this if the output is "*fish" because +# we don't need to know. + +if ($output !~ /.*fish$/) { + my $root_dev; + foreach $root_dev (sort keys %oses) { + my $mounts = $oses{$root_dev}->{mounts}; + # Have to mount / first. Luckily '/' is early in the ASCII + # character set, so this should be OK. + foreach (sort keys %$mounts) { + $g->mount_ro ($mounts->{$_}, $_) + if $_ ne "swap" && ($_ eq '/' || $g->is_dir ($_)); + } + + check_for_applications ($root_dev); + check_for_kernels ($root_dev); + + # umount_all in libguestfs is buggy - it doesn't unmount + # filesystems in the correct order. So let's unmount them + # in reverse first before calling umount_all as a last resort. + foreach (sort { $b cmp $a } keys %$mounts) { + eval "\$g->umount ('$_')"; + } + $g->umount_all (); + } +} + +sub check_for_applications +{ + local $_; + my $root_dev = shift; + + # XXX rpm -qa, look in Program Files, or whatever +} + +sub check_for_kernels +{ + local $_; + my $root_dev = shift; + + # XXX +} + +#---------------------------------------------------------------------- +# Output. + +if ($output eq "fish" || $output eq "ro-fish") { + my @osdevs = keys %oses; + # This only works if there is a single OS. + die "--fish output is only possible with a single OS\n" if @osdevs != 1; + + my $root_dev = $osdevs[0]; + + print "guestfish"; + if ($output eq "ro-fish") { + print " --ro"; + } + + print " -a $_" foreach @images; + + my $mounts = $oses{$root_dev}->{mounts}; + # Have to mount / first. Luckily '/' is early in the ASCII + # character set, so this should be OK. + foreach (sort keys %$mounts) { + print " -m $mounts->{$_}:$_" if $_ ne "swap"; + } + print "\n" +} + +# Perl output. +elsif ($output eq "perl") { + print Dumper(\%oses); +} + +# Plain text output (the default). +elsif ($output eq "text") { + # XXX text output. + +} + +# XML output. +elsif ($output eq "xml") { + # XXX XML output. + + + + +} + =head1 SEE ALSO L,