use strict;
use warnings;
+use Net::IP;
+
+use PVE::Exception qw(raise_param_exc);
use PVE::Tools;
+use PVE::INotify;
+use PVE::Cluster;
+use PVE::DataCenterConfig;
+use PVE::RPCEnvironment;
use Digest::MD5 qw(md5_hex);
use URI;
use URI::Escape;
use PVE::SafeSyslog;
+use PVE::Storage::Plugin;
my $hwaddress;
sub get_hwaddress {
-
+
return $hwaddress if defined ($hwaddress);
my $fn = '/etc/ssh/ssh_host_rsa_key.pub';
}
sub extract_node_stats {
- my ($node, $members, $rrd) = @_;
+ my ($node, $members, $rrd, $exclude_stats) = @_;
my $entry = {
id => "node/$node",
node => $node,
type => "node",
+ status => 'unknown',
};
if (my $d = $rrd->{"pve2-node/$node"}) {
-
+
if (!$members || # no cluster
($members->{$node} && $members->{$node}->{online})) {
- $entry->{uptime} = ($d->[0] || 0) + 0;
- $entry->{cpu} = ($d->[5] || 0) + 0;
- $entry->{mem} = ($d->[8] || 0) + 0;
- $entry->{disk} = ($d->[12] || 0) + 0;
+ if (!$exclude_stats) {
+ $entry->{uptime} = ($d->[0] || 0) + 0;
+ $entry->{cpu} = ($d->[5] || 0) + 0;
+ $entry->{mem} = ($d->[8] || 0) + 0;
+ $entry->{disk} = ($d->[12] || 0) + 0;
+ }
+ $entry->{status} = 'online';
}
$entry->{level} = $d->[1];
- $entry->{maxcpu} = ($d->[4] || 0) + 0;
- $entry->{maxmem} = ($d->[7] || 0) + 0;
- $entry->{maxdisk} = ($d->[11] || 0) + 0;
+ if (!$exclude_stats) {
+ $entry->{maxcpu} = ($d->[4] || 0) + 0;
+ $entry->{maxmem} = ($d->[7] || 0) + 0;
+ $entry->{maxdisk} = ($d->[11] || 0) + 0;
+ }
+ }
+
+ if ($members && $members->{$node} &&
+ !$members->{$node}->{online}) {
+ $entry->{status} = 'offline';
}
return $entry;
my $entry = {
id => "$data->{type}/$vmid",
- vmid => $vmid + 0,
+ vmid => $vmid + 0,
node => $data->{node},
type => $data->{type},
+ status => 'unknown',
};
my $d;
$entry->{netout} = ($d->[10] || 0) + 0;
$entry->{diskread} = ($d->[11] || 0) + 0;
$entry->{diskwrite} = ($d->[12] || 0) + 0;
-
+
} elsif ($d = $rrd->{"pve2.3-vm/$vmid"}) {
$entry->{uptime} = ($d->[0] || 0) + 0;
};
return $entry;
-};
+}
sub extract_storage_stats {
my ($storeid, $scfg, $node, $rrd) = @_;
+ my $content = PVE::Storage::Plugin::content_hash_to_string($scfg->{content});
+
my $entry = {
id => "storage/$node/$storeid",
- storage => $storeid,
- node => $node,
- type => 'storage',
- };
+ storage => $storeid,
+ node => $node,
+ type => 'storage',
+ plugintype => $scfg->{type},
+ status => 'unknown',
+ shared => $scfg->{shared} || 0,
+ content => $content,
+ };
if (my $d = $rrd->{"pve2-storage/$node/$storeid"}) {
$entry->{maxdisk} = ($d->[1] || 0) + 0;
$entry->{disk} = ($d->[2] || 0) + 0;
+ $entry->{status} = 'available';
}
return $entry;
-};
+}
sub parse_http_proxy {
my ($proxyenv) = @_;
my $authuser = $rpcenv->get_user();
- my $port = PVE::Tools::next_spice_port();
-
- my ($ticket, undef, $remote_viewer_config) =
+ my $nodename = PVE::INotify::nodename();
+ my $family = PVE::Tools::get_host_address_family($nodename);
+ my $port = PVE::Tools::next_spice_port($family);
+
+ my ($ticket, undef, $remote_viewer_config) =
PVE::AccessControl::remote_viewer_config($authuser, $vmid, $node, $proxy, $title, $port);
- my $timeout = 10;
+ my $timeout = 40;
- my $cmd = ['/usr/bin/spiceterm', '--port', $port, '--addr', '127.0.0.1',
- '--timeout', $timeout, '--authpath', $authpath,
+ my $cmd = ['/usr/bin/spiceterm', '--port', $port, '--addr', 'localhost',
+ '--timeout', $timeout, '--authpath', $authpath,
'--permissions', $permissions];
my $dcconf = PVE::Cluster::cfs_read_file('datacenter.cfg');
my $cmdstr = join (' ', @$cmd);
syslog ('info', "launch command: $cmdstr");
- eval {
+ eval {
foreach my $k (keys %ENV) {
- next if $k eq 'PATH' || $k eq 'TERM' || $k eq 'USER' || $k eq 'HOME';
+ next if $k eq 'PATH' || $k eq 'TERM' || $k eq 'USER' || $k eq 'HOME' || $k eq 'LANG' || $k eq 'LANGUAGE' ;
delete $ENV{$k};
}
$ENV{PWD} = '/';
$ENV{SPICE_TICKET} = $ticket;
- PVE::Tools::run_command($cmd, errmsg => "spiceterm failed");
+
+ PVE::Tools::run_command($cmd, errmsg => 'spiceterm failed\n', keeplocale => 1);
};
if (my $err = $@) {
syslog ('err', $err);
return $remote_viewer_config;
}
+sub resolve_proxyto {
+ my ($rpcenv, $proxyto_callback, $proxyto, $uri_param) = @_;
+
+ my $node;
+ if ($proxyto_callback) {
+ $node = $proxyto_callback->($rpcenv, $proxyto, $uri_param);
+ die "internal error - proxyto_callback returned nothing\n"
+ if !$node;
+ } else {
+ $node = $uri_param->{$proxyto};
+ raise_param_exc({ $proxyto => "proxyto parameter does not exist"})
+ if !$node;
+ }
+ return $node;
+}
+
+sub get_resource_pool_guest_members {
+ my ($pool) = @_;
+
+ my $usercfg = PVE::Cluster::cfs_read_file("user.cfg");
+
+ my $vmlist = PVE::Cluster::get_vmlist() || {};
+ my $idlist = $vmlist->{ids} || {};
+
+ my $data = $usercfg->{pools}->{$pool};
+
+ die "pool '$pool' does not exist\n" if !$data;
+
+ my $pool_members = [ grep { $idlist->{$_} } keys %{$data->{vms}} ];
+
+ return $pool_members;
+}
+
1;