virt-uname works.
authorRichard Jones <rjones@trick.home.annexia.org>
Tue, 29 Sep 2009 15:40:25 +0000 (16:40 +0100)
committerRichard Jones <rjones@trick.home.annexia.org>
Tue, 29 Sep 2009 15:40:25 +0000 (16:40 +0100)
tools/virt-tools-get-transport.pl
tools/virt-uname.pl

index b6bf480..1f4a57a 100755 (executable)
 use Sys::Virt;
 use Sys::Guestfs;
 use Sys::Guestfs::Lib qw(open_guest get_partitions);
+use Net::SNMP;
+
+use Data::Dumper;
+
 use Pod::Usage;
 use Getopt::Long;
+
 use Locale::TextDomain 'virt-tools';
-use Net::SNMP;
 
 =encoding utf8
 
@@ -288,7 +292,42 @@ sub test_transport
        close PIPE;
     }
 
-    print "XXX PING XXX\n";
+    my ($hostname, $port, $domain);
+    if ($transport =~ /^udp:(.*):(.*)/) {
+       $domain = "udp";
+       $hostname = $1;
+       $port = $2;
+    } elsif ($transport =~ /^tcp:(.*):(.*)/) {
+       $domain = "tcp";
+       $hostname = $1;
+       $port = $2;
+    } else {
+       die __x("unknown transport type: {t}", t => $transport);
+    }
+
+    if ($verbose) {
+       print STDERR "creating Net::SNMP session to $domain:$hostname:$port with key $key\n"
+    }
+
+    my ($session, $error) = Net::SNMP->session (
+       -version => 3,
+       -username => "virttools",
+       -authpassword => $key,
+       -authprotocol => "sha",
+       -privpassword => $key,
+       -privprotocol => "aes",
+       -hostname => $hostname,
+       -port => $port,
+       -domain => $domain,
+       );
+    return 0 unless $session;
+
+    my $sysUpTime = "1.3.6.1.2.1.1.3.0";
+    my $r = $session->get_request (-varbindlist => [$sysUpTime])
+       or return 0;
+    print STDERR "test_transport: sysUpTime = $r->{$sysUpTime}\n" if $verbose;
+
+    $session->close ();
 
     1;
 }
index 9a383bb..b1d305b 100755 (executable)
@@ -198,7 +198,7 @@ the guest.
 
 sub title_uname
 {
-    print_row (__"Guest");
+    print_row (__"Guest", __"System name");
 }
 
 sub do_uname
@@ -207,8 +207,12 @@ sub do_uname
     my $key = shift;
     my $transport = shift;
 
-
-
+    my $session = get_snmp_session ($key, $transport);
+    my $sysDescr = "1.3.6.1.2.1.1.1.0";
+    my $r = $session->get_request (-varbindlist => [$sysDescr])
+       or die __x("SNMP error: {e}", $session->error);
+    print_row ($domname, $r->{$sysDescr});
+    $session->close;
 }
 
 =head1 virt-ps
@@ -271,12 +275,12 @@ sub print_row
     my $comma = 0;
 
     foreach (@fields) {
-       print "," if $comma;
-       $comma = 1;
-
        if (!$csv) {
            printf "%-16s ", $_
        } else {
+           print "," if $comma;
+           $comma = 1;
+
            # XXX Use Text::CSV here.
            if ($_ =~ /"/) {
                s/"/""/;
@@ -533,6 +537,46 @@ machine in a form which is a de facto standard).
 To determine what precise queries are sent, run the tools in verbose
 mode or examine the source.
 
+=cut
+
+sub get_snmp_session
+{
+    my $key = shift;
+    my $transport = shift;
+
+    my ($hostname, $port, $domain);
+    if ($transport =~ /^udp:(.*):(.*)/) {
+       $domain = "udp";
+       $hostname = $1;
+       $port = $2;
+    } elsif ($transport =~ /^tcp:(.*):(.*)/) {
+       $domain = "tcp";
+       $hostname = $1;
+       $port = $2;
+    } else {
+       die __x("unknown transport type: {t}", t => $transport);
+    }
+
+    if ($verbose) {
+       print STDERR "creating Net::SNMP session to $domain:$hostname:$port with key $key\n"
+    }
+
+    my ($session, $error) = Net::SNMP->session (
+       -version => 3,
+       -username => "virttools",
+       -authpassword => $key,
+       -authprotocol => "sha",
+       -privpassword => $key,
+       -privprotocol => "aes",
+       -hostname => $hostname,
+       -port => $port,
+       -domain => $domain,
+       );
+    die __x("SNMP failure: {e}", e => $error) unless $session;
+
+    $session;
+}
+
 =head2 RUNNING YOUR OWN SNMP SERVER IN A GUEST
 
 I<(To be written)>