#!/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