#!/usr/bin/perl -w use strict; use warnings; use JSON; use Getopt::Long; use File::Which; my $what = 'nodes'; my $pretty = 0; GetOptions( 'what=s' => \$what, 'pretty' => \$pretty ); my $pvesh = which('pvesh'); my $json = {}; @{$json->{data}} = (); unless($pvesh){ print to_json($json) . "\n"; exit 0; } # Are we using the new pvesh for which we have to specify the output format ? my $pvesh_opt = (system("$pvesh get /version --output-format=json >/dev/null 2>&1") == 0) ? '--output-format=json' : ''; if ($what eq 'nodes'){ my $cluster_status = from_json(qx($pvesh get /cluster/status $pvesh_opt 2>/dev/null)); foreach my $item (@{$cluster_status}){ next unless ($item->{type} eq 'node'); push @{$json->{data}}, { '{#PVE_NODE_NAME}' => $item->{name}, '{#PVE_NODE_IP}' => $item->{ip}, '{#PVE_NODE_ID}' => $item->{nodeid}, '{#PVE_NODE_LOCAL}' => $item->{local} }; } } elsif ($what eq 'guests'){ my $guests = from_json(qx($pvesh get /cluster/resources --type=vm $pvesh_opt 2>/dev/null)); foreach my $guest (@{$guests}){ push @{$json->{data}}, { '{#PVE_GUEST_ID}' => $guest->{vmid}, '{#PVE_GUEST_NODE}' => $guest->{node}, '{#PVE_GUEST_TYPE}' => $guest->{type}, '{#PVE_GUEST_NAME}' => $guest->{name}, '{#PVE_GUEST_TEMPLATE}' => $guest->{template} }; } } elsif ($what eq 'storage'){ my $stores = from_json(qx($pvesh get /storage $pvesh_opt 2>/dev/null)); foreach my $store (@{$stores}){ push @{$json->{data}}, { '{#PVE_STOR_ID}' => $store->{storage}, '{#PVE_STOR_TYPE}' => $store->{type}, '{#PVE_STOR_STATUS}' => (($store->{disable}) ? 0 : 1), '{#PVE_STOR_SHARED}' => ($store->{shared} || 0), '{#PVE_STOR_CONTENT}' => $store->{content} }; } } elsif ($what eq 'pools'){ my $pools = from_json(qx($pvesh get /pools $pvesh_opt 2>/dev/null)); foreach my $pool (@{$pools}){ push @{$json->{data}}, { '{#PVE_POOL_ID}' => $pool->{poolid}, '{#PVE_POOL_DESC}' => $pool->{comment} }; } } print to_json($json, { pretty => $pretty }) . "\n";