generator: Missing newline character.
[libguestfs.git] / inspector / virt-inspector
index dc8847f..04a0771 100755 (executable)
@@ -27,6 +27,7 @@ use Pod::Usage;
 use Getopt::Long;
 use Data::Dumper;
 use XML::Writer;
+use String::ShellQuote qw(shell_quote);
 use Locale::TextDomain 'libguestfs';
 
 # Optional:
@@ -54,10 +55,6 @@ para-virtualized (PV), what applications are installed and more.
 Virt-inspector can produce output in several formats, including a
 readable text report, and XML for feeding into other programs.
 
-Virt-inspector should only be run on I<inactive> virtual machines.
-The program tries to determine that the machine is inactive and will
-refuse to run if it thinks you are trying to inspect a running domain.
-
 In the normal usage, use C<virt-inspector domname> where C<domname> is
 the libvirt domain (see: C<virsh list --all>).
 
@@ -168,13 +165,11 @@ my $windows_registry;
 
 =item B<--windows-registry>
 
-If this item is passed, I<and> the guest is Windows, I<and> the
-external program C<reged> is available (see SEE ALSO section), then we
-attempt to parse the Windows registry.  This allows much more
-information to be gathered for Windows guests.
+This flag is ignored for compatibility with earlier releases of the
+software.
 
-This is quite an expensive and slow operation, so we don't do it by
-default.
+In this version, if L<Win::Hivex(3)> is available, then we attempt to
+parse information out of the Registry for any Windows guest.
 
 =back
 
@@ -247,10 +242,9 @@ Windows), the distribution and version.
 The diagram above shows what we return for each OS.
 
 With the I<--xml> option the output is mapped into an XML document.
-Unfortunately there is no clear schema for this document
-(contributions welcome) but you can get an idea of the format by
-looking at other documents and as a last resort the source for this
-program.
+There is a RELAX-NG schema for this XML in the file
+I<virt-inspector.rng> which normally ships with virt-inspector, or can
+be found in the source.
 
 With the I<--fish> or I<--ro-fish> option the mount points are mapped to
 L<guestfish(1)> command line parameters, so that you can go in
@@ -267,8 +261,7 @@ my @partitions = get_partitions ($g);
 
 # Now query each one to build up a picture of what's in it.
 my %fses =
-    inspect_all_partitions ($g, \@partitions,
-      use_windows_registry => $windows_registry);
+    inspect_all_partitions ($g, \@partitions);
 
 #print "fses -----------\n";
 #print Dumper(\%fses);
@@ -306,13 +299,17 @@ if ($output eq "fish" || $output eq "ro-fish") {
         print "--ro ";
     }
 
-    print "-a $_ " foreach @images;
+    foreach (@images) {
+        printf "-a %s ", shell_quote ($_);
+    }
 
     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" && $_ ne "none";
+        if ($_ ne "swap" && $_ ne "none") {
+            printf "-m %s ", shell_quote ("$mounts->{$_}:$_");
+        }
     }
     print "\n"
 }
@@ -324,7 +321,7 @@ elsif ($output eq "perl") {
 
 # YAML output
 elsif ($output eq "yaml") {
-    die __"virt-inspector: no YAML support\n"
+    die __"virt-inspector: no YAML support, try installing perl-YAML or libyaml-perl\n"
         unless exists $INC{"YAML/Any.pm"};
 
     print Dump(%$oses);
@@ -359,6 +356,7 @@ sub output_text_os
     print $os->{arch}, " " if exists $os->{arch};
     print $os->{major_version} if exists $os->{major_version};
     print ".", $os->{minor_version} if exists $os->{minor_version};
+    print " (", $os->{product_name}, ")" if exists $os->{product_name};
     print " ";
     print "on ", $os->{root_device}, ":\n";
 
@@ -412,13 +410,15 @@ sub output_text_os
         print "    $_->{name} $_->{version}\n"
     }
 
-    print __"  Kernels:\n";
-    my @kernels = @{$os->{kernels}};
-    foreach (@kernels) {
-        print "    $_->{version} ($_->{arch})\n";
-        my @modules = @{$_->{modules}};
-        foreach (@modules) {
-            print "      $_\n";
+    if ($os->{kernels}) {
+        print __"  Kernels:\n";
+        my @kernels = @{$os->{kernels}};
+        foreach (@kernels) {
+            print "    $_->{version} ($_->{arch})\n";
+            my @modules = @{$_->{modules}};
+            foreach (@modules) {
+                print "      $_\n";
+            }
         }
     }
 
@@ -450,6 +450,7 @@ sub output_xml_os
 
     foreach ( [ "name" => "os" ],
               [ "distro" => "distro" ],
+              [ "product_name" => "product_name" ],
               [ "arch" => "arch" ],
               [ "major_version" => "major_version" ],
               [ "minor_version" => "minor_version" ],
@@ -524,7 +525,10 @@ sub output_xml_os
     foreach (@apps) {
         $xml->startTag("application");
         $xml->dataElement("name", $_->{name});
+        $xml->dataElement("epoch", $_->{epoch}) if defined $_->{epoch};
         $xml->dataElement("version", $_->{version});
+        $xml->dataElement("release", $_->{release});
+        $xml->dataElement("arch", $_->{arch});
         $xml->endTag("application");
     }
     $xml->endTag("applications");
@@ -551,23 +555,23 @@ sub output_xml_os
     }
 
     if ($os->{kernels}) {
-       $xml->startTag("kernels");
-       my @kernels = @{$os->{kernels}};
-       foreach (@kernels) {
-           $xml->startTag("kernel",
-                          "version" => $_->{version},
-                          "arch" => $_->{arch});
-           $xml->startTag("modules");
-           my @modules = @{$_->{modules}};
-           foreach (@modules) {
-               $xml->dataElement("module", $_);
-           }
-           $xml->endTag("modules");
-           $xml->dataElement("path", $_->{path}) if(defined($_->{path}));
-           $xml->dataElement("package", $_->{package}) if(defined($_->{package}));
-           $xml->endTag("kernel");
-       }
-       $xml->endTag("kernels");
+        $xml->startTag("kernels");
+        my @kernels = @{$os->{kernels}};
+        foreach (@kernels) {
+            $xml->startTag("kernel",
+                           "version" => $_->{version},
+                           "arch" => $_->{arch});
+            $xml->startTag("modules");
+            my @modules = @{$_->{modules}};
+            foreach (@modules) {
+                $xml->dataElement("module", $_);
+            }
+            $xml->endTag("modules");
+            $xml->dataElement("path", $_->{path}) if(defined($_->{path}));
+            $xml->dataElement("package", $_->{package}) if(defined($_->{package}));
+            $xml->endTag("kernel");
+        }
+        $xml->endTag("kernels");
     }
 
     if (exists $os->{root}->{registry}) {
@@ -839,6 +843,13 @@ sub output_query_kernel_arch
 
 =back
 
+=head1 SHELL QUOTING
+
+Libvirt guest names can contain arbitrary characters, some of which
+have meaning to the shell such as C<#> and space.  You may need to
+quote or escape these characters on the command line.  See the shell
+manual page L<sh(1)> for details.
+
 =head1 SEE ALSO
 
 L<guestfs(3)>,
@@ -848,12 +859,9 @@ L<Sys::Guestfs::Lib(3)>,
 L<Sys::Virt(3)>,
 L<http://libguestfs.org/>.
 
-For Windows registry parsing we require the C<reged> program
-from L<http://home.eunet.no/~pnordahl/ntpasswd/>.
-
-=head1 AUTHOR
+=head1 AUTHORS
 
-Richard W.M. Jones L<http://et.redhat.com/~rjones/>
+Richard W.M. Jones L<http://people.redhat.com/~rjones/>
 
 Matthew Booth L<mbooth@redhat.com>