--- /dev/null
+#!/usr/bin/perl
+
+# NOTE: In development; not actually used yet.
+
+#Collates the results of listvms from multiple VM servers. Part of the xvm
+#suite.
+
+use Net::Remctl ();
+use JSON;
+
+our @servers = qw/black-mesa.mit.edu sx-blade-2.mit.edu/;
+
+our %connections;
+
+sub openConnections() {
+ foreach (@servers) { openConnection($_); }
+}
+
+sub openConnection($) {
+ my ($server) = @_;
+ my $remctl = Net::Remctl->new;
+ $remctl->open($server)
+ or die "Cannot connect to $server: ", $remctl->error, "\n";
+ $connections{$server} = $remctl;
+}
+
+sub doListVMs() {
+ foreach my $remctl (values %connections) {
+ $remctl->command("remote", "web", "listvms", "--json");
+ }
+ my %vmstate;
+ foreach my $server (keys %connections) {
+ my $remctl = $connections{$server};
+ my $jsonData = '';
+ do {
+ $output = $remctl->output;
+ if ($output->type eq 'output') {
+ if ($output->stream == 1) {
+ $jsonData .= $output->data;
+ } elsif ($output->stream == 2) {
+ print STDERR $output->data;
+ }
+ } elsif ($output->type eq 'error') {
+ warn $output->error, "\n";
+ } elsif ($output->type eq 'status') {
+ if ($output->status != 0) {
+ warn "Exit status was ".$output->status;
+ }
+ } elsif ($output->type eq 'done') {
+ #next;
+ } else {
+ die "Unknown output token from library: ", $output->type, "\n";
+ }
+ } while ($output->type ne 'done');
+ my $vmlist = jsonToObj($jsonData);
+ foreach my $key (keys %$vmlist) {
+ $vmstate{$key} = $vmlist->{$key};
+ $vmstate{$key}{"host"} = $server;
+ }
+ }
+ return %vmstate;
+}
+
+openConnections();
+
+use Data::Dumper;
+use Benchmark;
+print Dumper({doListVMs()});
+timethis(100, sub {doListVMs()});
+
+# vim:et:sw=4:ts=4