]> git.proxmox.com Git - qemu-server.git/blobdiff - PVE/API2/Qemu.pm
vm status API: return info about spice
[qemu-server.git] / PVE / API2 / Qemu.pm
index 6651d16723b26a3f71993f95888279ad2fcbd619..81669052cc42f1a8d2c9066a0a66eb95ebac2038 100644 (file)
@@ -497,6 +497,7 @@ __PACKAGE__->register_method({
            { subdir => 'rrddata' },
            { subdir => 'monitor' },
            { subdir => 'snapshot' },
+           { subdir => 'spiceproxy' },
            ];
 
        return $res;
@@ -766,9 +767,13 @@ my $vmconfig_update_disk = sub {
                &$safe_num_ne($drive->{iops}, $old_drive->{iops}) ||
                &$safe_num_ne($drive->{iops_rd}, $old_drive->{iops_rd}) ||
                &$safe_num_ne($drive->{iops_wr}, $old_drive->{iops_wr})) {
-               PVE::QemuServer::qemu_block_set_io_throttle($vmid,"drive-$opt", $drive->{mbps}*1024*1024,
-                                                          $drive->{mbps_rd}*1024*1024, $drive->{mbps_wr}*1024*1024,
-                                                          $drive->{iops}, $drive->{iops_rd}, $drive->{iops_wr})
+               PVE::QemuServer::qemu_block_set_io_throttle($vmid,"drive-$opt", 
+                                                          ($drive->{mbps} || 0)*1024*1024,
+                                                          ($drive->{mbps_rd} || 0)*1024*1024, 
+                                                          ($drive->{mbps_wr} || 0)*1024*1024,
+                                                          $drive->{iops} || 0, 
+                                                          $drive->{iops_rd} || 0, 
+                                                          $drive->{iops_wr} || 0)
                   if !PVE::QemuServer::drive_is_cdrom($drive);
             }
        }
@@ -1317,6 +1322,78 @@ __PACKAGE__->register_method({
        };
     }});
 
+__PACKAGE__->register_method({
+    name => 'spiceproxy',
+    path => '{vmid}/spiceproxy',
+    method => 'GET',
+    protected => 1,
+    proxyto => 'node', # fixme: use direct connections or ssh tunnel?
+    permissions => {
+       check => ['perm', '/vms/{vmid}', [ 'VM.Console' ]],
+    },
+    description => "Returns a SPICE configuration to connect to the VM.",
+    parameters => {
+       additionalProperties => 0,
+       properties => {
+           node => get_standard_option('pve-node'),
+           vmid => get_standard_option('pve-vmid'),
+       },
+    },
+    returns => {
+       additionalProperties => 1,
+       properties => {
+           type => { type => 'string' },
+           password => { type => 'string' },
+           proxy => { type => 'string' },
+           host => { type => 'string' },
+           port => { type => 'integer' },
+       },
+    },
+    code => sub {
+       my ($param) = @_;
+
+       my $rpcenv = PVE::RPCEnvironment::get();
+
+       my $authuser = $rpcenv->get_user();
+
+       my $vmid = $param->{vmid};
+       my $node = $param->{node};
+
+        my $remip;
+
+       # Note: we currectly use "proxyto => 'node'", so this code will never trigger
+        if ($node ne 'localhost' && $node ne PVE::INotify::nodename()) {
+            $remip = PVE::Cluster::remote_node_ip($node);
+        }
+
+       my ($ticket, $proxyticket) = PVE::AccessControl::assemble_spice_ticket($authuser, $vmid, $node);
+
+       my $timeout = 10;
+
+       # Note: this only works if VM is on local node
+       PVE::QemuServer::vm_mon_cmd($vmid, "set_password", protocol => 'spice', password => $ticket);
+       PVE::QemuServer::vm_mon_cmd($vmid, "expire_password", protocol => 'spice', time => "+30");
+
+       # allow access for group www-data to the spice socket,
+       # so that spiceproxy can access it
+       my $socket =  PVE::QemuServer::spice_socket($vmid);
+       my $gid = getgrnam('www-data') || die "getgrnam failed - $!\n";
+       chown 0, $gid, $socket;
+       chmod 0770, $socket;
+
+       # fimxe: ??
+       my $host = `hostname -f` || PVE::INotify::nodename();
+       chomp $host;
+
+       return {
+           type => 'spice',
+           host => $proxyticket,
+           proxy => $host,
+           port => 0, # not used for now
+           password => $ticket
+       };
+    }});
+
 __PACKAGE__->register_method({
     name => 'vmcmdidx',
     path => '{vmid}/status',
@@ -1397,6 +1474,10 @@ __PACKAGE__->register_method({
 
        $status->{ha} = &$vm_is_ha_managed($param->{vmid});
 
+       if ($conf->{vga} && ($conf->{vga} eq 'qxl')) {
+           $status->{spice} = 1;
+       }
+
        return $status;
     }});