]>
git.proxmox.com Git - pve-manager.git/blob - PVE/API2Tools.pm
3136e096ee23a12c03cfef0a033f9e68e21ca6b1
1 package PVE
::API2Tools
;
6 use Digest
::MD5
qw(md5_hex);
15 return $hwaddress if defined ($hwaddress);
17 my $fn = '/etc/ssh/ssh_host_rsa_key.pub';
18 my $sshkey = PVE
::Tools
::file_get_contents
($fn);
19 $hwaddress = uc(md5_hex
($sshkey));
24 sub extract_node_stats
{
25 my ($node, $members, $rrd) = @_;
33 if (my $d = $rrd->{"pve2-node/$node"}) {
35 if (!$members || # no cluster
36 ($members->{$node} && $members->{$node}->{online
})) {
37 $entry->{uptime
} = ($d->[0] || 0) + 0;
38 $entry->{cpu
} = ($d->[5] || 0) + 0;
39 $entry->{mem
} = ($d->[8] || 0) + 0;
40 $entry->{disk
} = ($d->[12] || 0) + 0;
42 $entry->{level
} = $d->[1];
43 $entry->{maxcpu
} = ($d->[4] || 0) + 0;
44 $entry->{maxmem
} = ($d->[7] || 0) + 0;
45 $entry->{maxdisk
} = ($d->[11] || 0) + 0;
51 sub extract_vm_stats
{
52 my ($vmid, $data, $rrd) = @_;
55 id
=> "$data->{type}/$vmid",
57 node
=> $data->{node
},
58 type
=> $data->{type
},
63 if ($d = $rrd->{"pve2-vm/$vmid"}) {
65 $entry->{uptime
} = ($d->[0] || 0) + 0;
66 $entry->{name
} = $d->[1];
67 $entry->{status
} = $entry->{uptime
} ?
'running' : 'stopped';
68 $entry->{maxcpu
} = ($d->[3] || 0) + 0;
69 $entry->{cpu
} = ($d->[4] || 0) + 0;
70 $entry->{maxmem
} = ($d->[5] || 0) + 0;
71 $entry->{mem
} = ($d->[6] || 0) + 0;
72 $entry->{maxdisk
} = ($d->[7] || 0) + 0;
73 $entry->{disk
} = ($d->[8] || 0) + 0;
74 $entry->{netin
} = ($d->[9] || 0) + 0;
75 $entry->{netout
} = ($d->[10] || 0) + 0;
76 $entry->{diskread
} = ($d->[11] || 0) + 0;
77 $entry->{diskwrite
} = ($d->[12] || 0) + 0;
79 } elsif ($d = $rrd->{"pve2.3-vm/$vmid"}) {
81 $entry->{uptime
} = ($d->[0] || 0) + 0;
82 $entry->{name
} = $d->[1];
83 $entry->{status
} = $d->[2];
84 $entry->{template
} = $d->[3] + 0;
86 $entry->{maxcpu
} = ($d->[5] || 0) + 0;
87 $entry->{cpu
} = ($d->[6] || 0) + 0;
88 $entry->{maxmem
} = ($d->[7] || 0) + 0;
89 $entry->{mem
} = ($d->[8] || 0) + 0;
90 $entry->{maxdisk
} = ($d->[9] || 0) + 0;
91 $entry->{disk
} = ($d->[10] || 0) + 0;
92 $entry->{netin
} = ($d->[11] || 0) + 0;
93 $entry->{netout
} = ($d->[12] || 0) + 0;
94 $entry->{diskread
} = ($d->[13] || 0) + 0;
95 $entry->{diskwrite
} = ($d->[14] || 0) + 0;
101 sub extract_storage_stats
{
102 my ($storeid, $scfg, $node, $rrd) = @_;
105 id
=> "storage/$node/$storeid",
111 if (my $d = $rrd->{"pve2-storage/$node/$storeid"}) {
112 $entry->{maxdisk
} = ($d->[1] || 0) + 0;
113 $entry->{disk
} = ($d->[2] || 0) + 0;
119 sub parse_http_proxy
{
122 my $uri = URI-
>new($proxyenv);
124 my $scheme = $uri->scheme;
125 my $host = $uri->host;
126 my $port = $uri->port || 3128;
128 my ($username, $password);
130 if (defined(my $p_auth = $uri->userinfo())) {
131 ($username, $password) = map URI
::Escape
::uri_unescape
($_), split(":", $p_auth, 2);
134 return ("$host:$port", $username, $password);
138 my ($authpath, $permissions, $vmid, $node, $proxy, $title, $shcmd) = @_;
140 my $rpcenv = PVE
::RPCEnvironment
::get
();
142 my $authuser = $rpcenv->get_user();
144 my $port = PVE
::Tools
::next_spice_port
();
146 my ($ticket, undef, $remote_viewer_config) =
147 PVE
::AccessControl
::remote_viewer_config
($authuser, $vmid, $node, $proxy, $title, $port);
151 my $cmd = ['/usr/bin/spiceterm', '--port', $port, '--addr', '127.0.0.1',
152 '--timeout', $timeout, '--authpath', $authpath,
153 '--permissions', $permissions];
155 my $dcconf = PVE
::Cluster
::cfs_read_file
('datacenter.cfg');
156 push @$cmd, '--keymap', $dcconf->{keyboard
} if $dcconf->{keyboard
};
158 push @$cmd, '--', @$shcmd;
163 syslog
('info', "starting spiceterm $upid - $title\n");
165 my $cmdstr = join (' ', @$cmd);
166 syslog
('info', "launch command: $cmdstr");
169 foreach my $k (keys %ENV) {
170 next if $k eq 'PATH' || $k eq 'TERM' || $k eq 'USER' || $k eq 'HOME' || $k eq 'LANG' || $k eq 'LANGUAGE' ;
174 $ENV{SPICE_TICKET
} = $ticket;
176 # run_command sets LC_ALL, so we use system() instead
177 system(@$cmd) == 0 ||
178 die "spiceterm failed\n";
181 syslog
('err', $err);
188 $rpcenv->fork_worker('spiceproxy', $vmid, $authuser, $realcmd);
190 $rpcenv->fork_worker('spiceshell', undef, $authuser, $realcmd);
193 PVE
::Tools
::wait_for_vnc_port
($port);
195 return $remote_viewer_config;