use PVE::APIClient::Helpers;
use PVE::APIClient::Config;
-use PVE::JSONSchema qw(get_standard_option);
+use PVE::APIClient::JSONSchema qw(get_standard_option);
-use PVE::CLIHandler;
+use File::Temp qw(tempfile);
-use base qw(PVE::CLIHandler);
+use PVE::APIClient::CLIHandler;
+
+use base qw(PVE::APIClient::CLIHandler);
my $guest_status_command = sub {
my ($remote, $vmid, $cmd, $param) = @_,
code => sub {
my ($param) = @_;
- my $remote = PVE::Tools::extract_param($param, 'remote');
- my $vmid = PVE::Tools::extract_param($param, 'vmid');
+ my $remote = PVE::APIClient::Tools::extract_param($param, 'remote');
+ my $vmid = PVE::APIClient::Tools::extract_param($param, 'vmid');
$guest_status_command->($remote, $vmid, 'start', $param);
code => sub {
my ($param) = @_;
+ my $remote = PVE::APIClient::Tools::extract_param($param, 'remote');
+ my $vmid = PVE::APIClient::Tools::extract_param($param, 'vmid');
+
+ $guest_status_command->($remote, $vmid, 'stop', $param);
+
+ return undef;
+ }});
+
+__PACKAGE__->register_method ({
+ name => 'spice',
+ path => 'spice',
+ method => 'POST',
+ description => "Run the spice client for a guest (VM/Container)",
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ remote => get_standard_option('pveclient-remote-name'),
+ vmid => get_standard_option('pve-vmid'),
+ },
+ },
+ returns => { type => 'null'},
+ code => sub {
+ my ($param) = @_;
+
my $remote = PVE::Tools::extract_param($param, 'remote');
my $vmid = PVE::Tools::extract_param($param, 'vmid');
- $guest_status_command->($remote, $vmid, 'stop', $param);
+ my $config = PVE::APIClient::Config->load();
+ my $conn = PVE::APIClient::Config->remote_conn($config, $remote);
+
+ my $resource = PVE::APIClient::Helpers::get_vmid_resource($conn, $vmid);
+
+ my $res = $conn->post("api2/json/nodes/$resource->{node}/$resource->{type}/$resource->{vmid}/spiceproxy", {});
+
+ my $vvsetup = "[virt-viewer]\n";
+ foreach my $k (keys %$res) {
+ $vvsetup .= "$k=$res->{$k}\n";
+ }
+
+ my ($fh, $filename) = tempfile( "tempXXXXX", SUFFIX => '.vv', TMPDIR => 1);
+ syswrite($fh, $vvsetup);
+
+ system("nohup remote-viewer $filename 1>/dev/null 2>&1 &");
+ if ($? != 0) {
+ print "failed to execute remote-viewer: $!\n";
+ }
return undef;
}});