]>
git.proxmox.com Git - pve-manager.git/blob - PVE/API2Tools.pm
1 package PVE
::API2Tools
;
9 use Digest
::MD5
qw(md5_hex);
18 return $hwaddress if defined ($hwaddress);
20 my $fn = '/etc/ssh/ssh_host_rsa_key.pub';
21 my $sshkey = PVE
::Tools
::file_get_contents
($fn);
22 $hwaddress = uc(md5_hex
($sshkey));
27 sub extract_node_stats
{
28 my ($node, $members, $rrd) = @_;
36 if (my $d = $rrd->{"pve2-node/$node"}) {
38 if (!$members || # no cluster
39 ($members->{$node} && $members->{$node}->{online
})) {
40 $entry->{uptime
} = ($d->[0] || 0) + 0;
41 $entry->{cpu
} = ($d->[5] || 0) + 0;
42 $entry->{mem
} = ($d->[8] || 0) + 0;
43 $entry->{disk
} = ($d->[12] || 0) + 0;
45 $entry->{level
} = $d->[1];
46 $entry->{maxcpu
} = ($d->[4] || 0) + 0;
47 $entry->{maxmem
} = ($d->[7] || 0) + 0;
48 $entry->{maxdisk
} = ($d->[11] || 0) + 0;
54 sub extract_vm_stats
{
55 my ($vmid, $data, $rrd) = @_;
58 id
=> "$data->{type}/$vmid",
60 node
=> $data->{node
},
61 type
=> $data->{type
},
66 if ($d = $rrd->{"pve2-vm/$vmid"}) {
68 $entry->{uptime
} = ($d->[0] || 0) + 0;
69 $entry->{name
} = $d->[1];
70 $entry->{status
} = $entry->{uptime
} ?
'running' : 'stopped';
71 $entry->{maxcpu
} = ($d->[3] || 0) + 0;
72 $entry->{cpu
} = ($d->[4] || 0) + 0;
73 $entry->{maxmem
} = ($d->[5] || 0) + 0;
74 $entry->{mem
} = ($d->[6] || 0) + 0;
75 $entry->{maxdisk
} = ($d->[7] || 0) + 0;
76 $entry->{disk
} = ($d->[8] || 0) + 0;
77 $entry->{netin
} = ($d->[9] || 0) + 0;
78 $entry->{netout
} = ($d->[10] || 0) + 0;
79 $entry->{diskread
} = ($d->[11] || 0) + 0;
80 $entry->{diskwrite
} = ($d->[12] || 0) + 0;
82 } elsif ($d = $rrd->{"pve2.3-vm/$vmid"}) {
84 $entry->{uptime
} = ($d->[0] || 0) + 0;
85 $entry->{name
} = $d->[1];
86 $entry->{status
} = $d->[2];
87 $entry->{template
} = $d->[3] + 0;
89 $entry->{maxcpu
} = ($d->[5] || 0) + 0;
90 $entry->{cpu
} = ($d->[6] || 0) + 0;
91 $entry->{maxmem
} = ($d->[7] || 0) + 0;
92 $entry->{mem
} = ($d->[8] || 0) + 0;
93 $entry->{maxdisk
} = ($d->[9] || 0) + 0;
94 $entry->{disk
} = ($d->[10] || 0) + 0;
95 $entry->{netin
} = ($d->[11] || 0) + 0;
96 $entry->{netout
} = ($d->[12] || 0) + 0;
97 $entry->{diskread
} = ($d->[13] || 0) + 0;
98 $entry->{diskwrite
} = ($d->[14] || 0) + 0;
104 sub extract_storage_stats
{
105 my ($storeid, $scfg, $node, $rrd) = @_;
108 id
=> "storage/$node/$storeid",
114 if (my $d = $rrd->{"pve2-storage/$node/$storeid"}) {
115 $entry->{maxdisk
} = ($d->[1] || 0) + 0;
116 $entry->{disk
} = ($d->[2] || 0) + 0;
122 sub parse_http_proxy
{
125 my $uri = URI-
>new($proxyenv);
127 my $scheme = $uri->scheme;
128 my $host = $uri->host;
129 my $port = $uri->port || 3128;
131 my ($username, $password);
133 if (defined(my $p_auth = $uri->userinfo())) {
134 ($username, $password) = map URI
::Escape
::uri_unescape
($_), split(":", $p_auth, 2);
137 return ("$host:$port", $username, $password);
141 my ($authpath, $permissions, $vmid, $node, $proxy, $title, $shcmd) = @_;
143 my $rpcenv = PVE
::RPCEnvironment
::get
();
145 my $authuser = $rpcenv->get_user();
147 my $nodename = PVE
::INotify
::nodename
();
148 my $family = PVE
::Tools
::get_host_address_family
($nodename);
149 my $port = PVE
::Tools
::next_spice_port
($family);
151 my ($ticket, undef, $remote_viewer_config) =
152 PVE
::AccessControl
::remote_viewer_config
($authuser, $vmid, $node, $proxy, $title, $port);
156 my $cmd = ['/usr/bin/spiceterm', '--port', $port, '--addr', '127.0.0.1',
157 '--timeout', $timeout, '--authpath', $authpath,
158 '--permissions', $permissions];
160 my $dcconf = PVE
::Cluster
::cfs_read_file
('datacenter.cfg');
161 push @$cmd, '--keymap', $dcconf->{keyboard
} if $dcconf->{keyboard
};
163 push @$cmd, '--', @$shcmd;
168 syslog
('info', "starting spiceterm $upid - $title\n");
170 my $cmdstr = join (' ', @$cmd);
171 syslog
('info', "launch command: $cmdstr");
174 foreach my $k (keys %ENV) {
175 next if $k eq 'PATH' || $k eq 'TERM' || $k eq 'USER' || $k eq 'HOME' || $k eq 'LANG' || $k eq 'LANGUAGE' ;
179 $ENV{SPICE_TICKET
} = $ticket;
181 PVE
::Tools
::run_command
($cmd, errmsg
=> 'spiceterm failed\n', keeplocale
=> 1);
184 syslog
('err', $err);
191 $rpcenv->fork_worker('spiceproxy', $vmid, $authuser, $realcmd);
193 $rpcenv->fork_worker('spiceshell', undef, $authuser, $realcmd);
196 PVE
::Tools
::wait_for_vnc_port
($port);
198 return $remote_viewer_config;
201 sub read_proxy_config
{
203 my $conffile = "/etc/default/pveproxy";
205 # Note: evaluate with bash
206 my $shcmd = ". $conffile;\n";
207 $shcmd .= 'echo \"ALLOW_FROM:\$ALLOW_FROM\";';
208 $shcmd .= 'echo \"DENY_FROM:\$DENY_FROM\";';
209 $shcmd .= 'echo \"POLICY:\$POLICY\";';
210 $shcmd .= 'echo \"CIPHERS:\$CIPHERS\";';
211 $shcmd .= 'echo \"DHPARAMS:\$DHPARAMS\";';
213 my $data = -f
$conffile ?
`bash -c "$shcmd"` : '';
217 while ($data =~ s/^(.*)\n//) {
218 my ($key, $value) = split(/:/, $1, 2);
220 if ($key eq 'ALLOW_FROM' || $key eq 'DENY_FROM') {
222 foreach my $ip (split(/,/, $value)) {
223 $ip = "0/0" if $ip eq 'all';
224 push @$ips, Net
::IP-
>new($ip) || die Net
::IP
::Error
() . "\n";
227 } elsif ($key eq 'POLICY') {
228 die "unknown policy '$value'\n" if $value !~ m/^(allow|deny)$/;
229 $res->{$key} = $value;
230 } elsif ($key eq 'CIPHERS') {
231 $res->{$key} = $value;
232 } elsif ($key eq 'DHPARAMS') {
233 $res->{$key} = $value;
235 # silently skip everythin else?