X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=inspector%2Fvirt-inspector.pl;h=bd8de7034ed2d53c38738c6e7bc04fc0797868ff;hb=b2ed0f4c55c2bd3d07341ba2207f0cb238eb4e18;hp=28bee77818e221dc58f5dff2e615674bb4b7a4b7;hpb=67a469c3eb68cbf735749118249ea6cd2c892486;p=libguestfs.git diff --git a/inspector/virt-inspector.pl b/inspector/virt-inspector.pl index 28bee77..bd8de70 100755 --- a/inspector/virt-inspector.pl +++ b/inspector/virt-inspector.pl @@ -24,11 +24,13 @@ use Pod::Usage; use Getopt::Long; use Data::Dumper; use File::Temp qw/tempdir/; +use XML::Writer; # Optional: eval "use Sys::Virt;"; eval "use XML::XPath;"; eval "use XML::XPath::XMLParser;"; +eval "use YAML::Any;"; =encoding utf8 @@ -134,6 +136,11 @@ Produce no output at all. If you select I<--xml> then you get XML output which can be fed to other programs. +=item B<--yaml> + +If you select I<--yaml> then you get YAML output which can be fed +to other programs. + =item B<--perl> If you select I<--perl> then you get Perl structures output which @@ -183,6 +190,7 @@ GetOptions ("help|?" => \$help, "text" => sub { $output = "text" }, "none" => sub { $output = "none" }, "xml" => sub { $output = "xml" }, + "yaml" => sub { $output = "yaml" }, "perl" => sub { $output = "perl" }, "fish" => sub { $output = "fish" }, "guestfish" => sub { $output = "fish" }, @@ -837,14 +845,47 @@ sub check_for_modprobe_aliases local $_; my $root_dev = shift; - my @lines; - eval { @lines = $g->read_lines ("/etc/modprobe.conf"); }; - return if $@ || !@lines; + # Initialise augeas + my $success = 0; + $success = $g->aug_init("/", 16); + + # Register /etc/modules.conf and /etc/conf.modules to the Modprobe lens + my @results; + @results = $g->aug_match("/augeas/load/Modprobe/incl"); + + # Calculate the next index of /augeas/load/Modprobe/incl + my $i = 1; + foreach ( @results ) { + next unless m{/augeas/load/Modprobe/incl\[(\d*)]}; + $i = $1 + 1 if ($1 == $i); + } + + $success = $g->aug_set("/augeas/load/Modprobe/incl[$i]", + "/etc/modules.conf"); + $i++; + $success = $g->aug_set("/augeas/load/Modprobe/incl[$i]", + "/etc/conf.modules"); + + # Make augeas reload + $success = $g->aug_load(); my %modprobe_aliases; - foreach (@lines) { - $modprobe_aliases{$1} = $2 if /^\s*alias\s+(\S+)\s+(\S+)/; + for my $pattern qw(/files/etc/conf.modules/alias + /files/etc/modules.conf/alias + /files/etc/modprobe.conf/alias + /files/etc/modprobe.d/*/alias) { + @results = $g->aug_match($pattern); + + for my $path ( @results ) { + my $alias; + $alias = $g->aug_get($path); + + my $modulename; + $modulename = $g->aug_get($path.'/modulename'); + + $modprobe_aliases{$alias} = $modulename; + } } $oses{$root_dev}->{modprobe_aliases} = \%modprobe_aliases; @@ -930,6 +971,14 @@ elsif ($output eq "perl") { print Dumper(\%oses); } +# YAML output +elsif ($output eq "yaml") { + die "virt-inspector: no YAML support\n" + unless exists $INC{"YAML/Any.pm"}; + + print Dump(\%oses); +} + # Plain text output (the default). elsif ($output eq "text") { output_text (); @@ -1030,55 +1079,61 @@ sub output_text_os sub output_xml { - print "\n"; - output_xml_os ($oses{$_}) foreach sort keys %oses; - print "\n"; + my $xml = new XML::Writer(DATA_MODE => 1, DATA_INDENT => 2); + + $xml->startTag("operatingsystems"); + output_xml_os ($oses{$_}, $xml) foreach sort keys %oses; + $xml->endTag("operatingsystems"); + + $xml->end(); } sub output_xml_os { - my $os = shift; + my ($os, $xml) = @_; - print "\n"; + $xml->startTag("operatingsystem"); - print "", $os->{os}, "\n" if exists $os->{os}; - print "", $os->{distro}, "\n" if exists $os->{distro}; - print "", $os->{version}, "\n" if exists $os->{version}; - print "", $os->{root_device}, "\n"; + foreach ( [ "name" => "os" ], + [ "distro" => "distro" ], + [ "version" => "version" ], + [ "root" => "root_device" ] ) { + $xml->dataElement($_->[0], $os->{$_->[1]}) if exists $os->{$_->[1]}; + } - print "\n"; + $xml->startTag("mountpoints"); my $mounts = $os->{mounts}; foreach (sort keys %$mounts) { - printf "%s\n", - $mounts->{$_}, $_ + $xml->dataElement("mountpoint", $_, "dev" => $mounts->{$_}); } - print "\n"; + $xml->endTag("mountpoints"); - print "\n"; + $xml->startTag("filesystems"); my $filesystems = $os->{filesystems}; foreach (sort keys %$filesystems) { - print "\n"; - print "\n" - if exists $filesystems->{$_}{label}; - print "$filesystems->{$_}{uuid}\n" - if exists $filesystems->{$_}{uuid}; - print "$filesystems->{$_}{fstype}\n" - if exists $filesystems->{$_}{fstype}; - print "$filesystems->{$_}{content}\n" - if exists $filesystems->{$_}{content}; - print "\n"; + $xml->startTag("filesystem", "dev" => $_); + + foreach my $field ( [ "label" => "label" ], + [ "uuid" => "uuid" ], + [ "type" => "fstype" ], + [ "content" => "content" ] ) { + $xml->dataElement($field->[0], $filesystems->{$_}{$field->[1]}) + if exists $filesystems->{$_}{$field->[1]}; + } + + $xml->endTag("filesystem"); } - print "\n"; + $xml->endTag("filesystems"); if (exists $os->{modprobe_aliases}) { my %aliases = %{$os->{modprobe_aliases}}; my @keys = sort keys %aliases; if (@keys) { - print "\n"; + $xml->startTag("modprobealiases"); foreach (@keys) { - printf "%s\n", $_, $aliases{$_} + $xml->dataElement("alias", $aliases{$_}, "device" => $_); } - print "\n"; + $xml->endTag("modprobealiases"); } } @@ -1086,63 +1141,51 @@ sub output_xml_os my %modvers = %{$os->{initrd_modules}}; my @keys = sort keys %modvers; if (@keys) { - print "\n"; + $xml->startTag("initrds"); foreach (@keys) { my @modules = @{$modvers{$_}}; - print "\n"; - print "$_\n" foreach @modules; - print "\n"; + $xml->startTag("initrd", "version" => $_); + $xml->dataElement("module", $_) foreach @modules; + $xml->endTag("initrd"); } - print "\n"; + $xml->endTag("initrds"); } } - print "\n"; + $xml->startTag("applications"); my @apps = @{$os->{apps}}; foreach (@apps) { - print "\n"; - print "$_->{name}$_->{version}\n"; - print "\n"; + $xml->startTag("application"); + $xml->dataElement("name", $_->{name}); + $xml->dataElement("version", $_->{version}); + $xml->endTag("application"); } - print "\n"; + $xml->endTag("applications"); - print "\n"; + $xml->startTag("kernels"); my @kernels = @{$os->{kernels}}; foreach (@kernels) { - print "\n"; - print "$_->{version}\n"; - print "\n"; + $xml->startTag("kernel", "version" => $_->{version}); + $xml->startTag("modules"); my @modules = @{$_->{modules}}; foreach (@modules) { - print "$_\n"; + $xml->dataElement("module", $_); } - print "\n"; - print "\n"; + $xml->endTag("modules"); + $xml->endTag("kernel"); } - print "\n"; + $xml->endTag("kernels"); if (exists $os->{root}->{registry}) { - print "\n"; + $xml->startTag("windowsregistryentries"); # These are just lumps of text - dump them out. foreach (@{$os->{root}->{registry}}) { - print "\n"; - print escape_xml($_), "\n"; - print "\n"; + $xml->dataElement("windowsregistryentry", $_); } - print "\n"; + $xml->endTag("windowsregistryentries"); } - print "\n"; -} - -sub escape_xml -{ - local $_ = shift; - - s/&/&/g; - s//>/g; - return $_; + $xml->endTag("operatingsystem"); } =head1 QUERY MODE