[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[fedora-virt] [PATCH] Cleanup XML output of virt-inspector



The attached patch makes some changes to the XML output of virt-inspector. Firstly, it changes the output code to use XML:Writer. This changes:

* Single quotes for attributes become double quotes
* All data is properly escaped
* Indentation

In practise, these should be invisible. It also changes the output semantically in 2 ways:

* /operatingsystems/operatingsystem/os is renamed to
  /operatingsystems/operatingsystem/name

* /operatingsystems/kernels/version becomes an attribute of
  /operatingsystems/kernel for consistency with initrds

Are these changes likely to cause problems?

Matt
--
Matthew Booth, RHCA, RHCSS
Red Hat Engineering, Virtualisation Team

M:       +44 (0)7977 267231
GPG ID:  D33C3490
GPG FPR: 3733 612D 2D05 5458 8A8A 1600 3441 EA19 D33C 3490
>From 7734295dbfe8a1b1fa47dde28c2759b14dd25904 Mon Sep 17 00:00:00 2001
From: Matthew Booth <mbooth redhat com>
Date: Fri, 26 Jun 2009 11:29:14 +0100
Subject: [PATCH] Clean up XML output

This change makes XML use XML::Writer, and modifies the output in the
following 2 ways:

* /operatingsystems/operatingsystem/os is renamed to
  /operatingsystems/operatingsystem/name

* /operatingsystems/kernels/version becomes an attribute of
  /operatingsystems/kernel for consistency with initrds
---
 inspector/virt-inspector.pl |  122 +++++++++++++++++++++----------------------
 1 files changed, 60 insertions(+), 62 deletions(-)

diff --git a/inspector/virt-inspector.pl b/inspector/virt-inspector.pl
index 8417675..810a3e3 100755
--- a/inspector/virt-inspector.pl
+++ b/inspector/virt-inspector.pl
@@ -30,6 +30,7 @@ eval "use Sys::Virt;";
 eval "use XML::XPath;";
 eval "use XML::XPath::XMLParser;";
 eval "use YAML::Any;";
+eval "use XML::Writer;";
 
 =encoding utf8
 
@@ -1078,55 +1079,64 @@ sub output_text_os
 
 sub output_xml
 {
-    print "<operatingsystems>\n";
-    output_xml_os ($oses{$_}) foreach sort keys %oses;
-    print "</operatingsystems>\n";
+    die "virt-inspector: no XML output support (install XML::Writer)\n"
+	unless exists $INC{"XML/Writer.pm"};
+
+    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 "<operatingsystem>\n";
+    $xml->startTag("operatingsystem");
 
-    print "<os>", $os->{os}, "</os>\n" if exists $os->{os};
-    print "<distro>", $os->{distro}, "</distro>\n" if exists $os->{distro};
-    print "<version>", $os->{version}, "</version>\n" if exists $os->{version};
-    print "<root>", $os->{root_device}, "</root>\n";
+    foreach ( [ "name" => "os" ],
+              [ "distro" => "distro" ],
+              [ "version" => "version" ],
+              [ "root" => "root_device" ] ) {
+        $xml->dataElement($_->[0], $os->{$_->[1]}) if exists $os->{$_->[1]};
+    }
 
-    print "<mountpoints>\n";
+    $xml->startTag("mountpoints");
     my $mounts = $os->{mounts};
     foreach (sort keys %$mounts) {
-	printf "<mountpoint dev='%s'>%s</mountpoint>\n",
-	  $mounts->{$_}, $_
+        $xml->dataElement("mountpoint", $_, "dev" => $mounts->{$_});
     }
-    print "</mountpoints>\n";
+    $xml->endTag("mountpoints");
 
-    print "<filesystems>\n";
+    $xml->startTag("filesystems");
     my $filesystems = $os->{filesystems};
     foreach (sort keys %$filesystems) {
-	print "<filesystem dev='$_'>\n";
-	print "<label>$filesystems->{$_}{label}</label>\n"
-	    if exists $filesystems->{$_}{label};
-	print "<uuid>$filesystems->{$_}{uuid}</uuid>\n"
-	    if exists $filesystems->{$_}{uuid};
-	print "<type>$filesystems->{$_}{fstype}</type>\n"
-	    if exists $filesystems->{$_}{fstype};
-	print "<content>$filesystems->{$_}{content}</content>\n"
-	    if exists $filesystems->{$_}{content};
-	print "</filesystem>\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 "</filesystems>\n";
+    $xml->endTag("filesystems");
 
     if (exists $os->{modprobe_aliases}) {
 	my %aliases = %{$os->{modprobe_aliases}};
 	my @keys = sort keys %aliases;
 	if (@keys) {
-	    print "<modprobealiases>\n";
+            $xml->startTag("modprobealiases");
 	    foreach (@keys) {
-		printf "<alias device=\"%s\">%s</alias>\n", $_, $aliases{$_}
+                $xml->dataElement("alias", $aliases{$_}, "device" => $_);
 	    }
-	    print "</modprobealiases>\n";
+            $xml->endTag("modprobealiases");
 	}
     }
 
@@ -1134,63 +1144,51 @@ sub output_xml_os
 	my %modvers = %{$os->{initrd_modules}};
 	my @keys = sort keys %modvers;
 	if (@keys) {
-	    print "<initrds>\n";
+            $xml->startTag("initrds");
 	    foreach (@keys) {
 		my @modules = @{$modvers{$_}};
-		print "<initrd version=\"$_\">\n";
-		print "<module>$_</module>\n" foreach @modules;
-		print "</initrd>\n";
+                $xml->startTag("initrd", "version" => $_);
+                $xml->dataElement("module", $_) foreach @modules;
+                $xml->endTag("initrd");
 	    }
-	    print "</initrds>\n";
+            $xml->endTag("initrds");
 	}
     }
 
-    print "<applications>\n";
+    $xml->startTag("applications");
     my @apps =  @{$os->{apps}};
     foreach (@apps) {
-	print "<application>\n";
-	print "<name>$_->{name}</name><version>$_->{version}</version>\n";
-	print "</application>\n";
+        $xml->startTag("application");
+        $xml->dataElement("name", $_->{name});
+        $xml->dataElement("version", $_->{version});
+        $xml->endTag("application");
     }
-    print "</applications>\n";
+    $xml->endTag("applications");
 
-    print "<kernels>\n";
+    $xml->startTag("kernels");
     my @kernels = @{$os->{kernels}};
     foreach (@kernels) {
-	print "<kernel>\n";
-	print "<version>$_->{version}</version>\n";
-	print "<modules>\n";
+        $xml->startTag("kernel", "version" => $_->{version});
+        $xml->startTag("modules");
 	my @modules = @{$_->{modules}};
 	foreach (@modules) {
-	    print "<module>$_</module>\n";
+            $xml->dataElement("module", $_);
 	}
-	print "</modules>\n";
-	print "</kernel>\n";
+        $xml->endTag("modules");
+        $xml->endTag("kernel");
     }
-    print "</kernels>\n";
+    $xml->endTag("kernels");
 
     if (exists $os->{root}->{registry}) {
-	print "<windowsregistryentries>\n";
+        $xml->startTag("windowsregistryentries");
 	# These are just lumps of text - dump them out.
 	foreach (@{$os->{root}->{registry}}) {
-	    print "<windowsregistryentry>\n";
-	    print escape_xml($_), "\n";
-	    print "</windowsregistryentry>\n";
+            $xml->dataElement("windowsregistryentry", $_);
 	}
-	print "</windowsregistryentries>\n";
+        $xml->endTag("windowsregistryentries");
     }
 
-    print "</operatingsystem>\n";
-}
-
-sub escape_xml
-{
-    local $_ = shift;
-
-    s/&/&amp;/g;
-    s/</&lt;/g;
-    s/>/&gt;/g;
-    return $_;
+    $xml->endTag("operatingsystem");
 }
 
 =head1 QUERY MODE
-- 
1.6.2.5


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]