[pve-devel] [PATCH 3/3] api2 : add spice ticket

Alexandre Derumier aderumier at odiso.com
Wed Apr 10 13:08:11 CEST 2013


fixme :
- ticket string maxlengh is 60 characters.
  encrypt it generate a too big string.

Signed-off-by: Alexandre Derumier <aderumier at odiso.com>
---
 PVE/API2/Qemu.pm |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 qm               |    2 ++
 2 files changed, 54 insertions(+)

diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index ebf502a..ce298e6 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -5,6 +5,7 @@ use strict;
 use warnings;
 use Cwd 'abs_path';
 use JSON;
+use MIME::Base64;
 
 use PVE::Cluster qw (cfs_read_file cfs_write_file);;
 use PVE::SafeSyslog;
@@ -815,6 +816,57 @@ __PACKAGE__->register_method({
     }});
 
 __PACKAGE__->register_method({
+    name => 'spiceticket',
+    path => '{vmid}/spiceticket',
+    method => 'GET',
+    protected => 1,
+    permissions => {
+	check => ['perm', '/vms/{vmid}', [ 'VM.Console' ]],
+    },
+    description => "Generate spice ticket",
+    parameters => {
+	additionalProperties => 0,
+	properties => {
+	    node => get_standard_option('pve-node'),
+	    vmid => get_standard_option('pve-vmid'),
+	},
+    },
+    returns => { type => 'object' },
+    code => sub {
+	my ($param) = @_;
+
+	my $node = extract_param($param, 'node');
+
+	my $vmid = extract_param($param, 'vmid');
+
+	my $rpcenv = PVE::RPCEnvironment::get();
+
+	my $authuser = $rpcenv->get_user();
+	my $authpath = "/vms/$vmid";
+
+	my $timestamp = sprintf("%08X", time());
+
+	my $plain = "PVESPICE:$timestamp";
+
+	my $path = PVE::AccessControl::normalize_path($authpath);
+
+	my $full = "$plain:$authuser:$path";
+	#fixme : password seem to be limited to 60 characters (client? server?), encrypt with certificate generated a too long string
+	my $ticket = encode_base64($full);
+	chomp $ticket;
+
+	PVE::QemuServer::vm_mon_cmd($vmid, "expire_password", protocol => "spice", time => "+20");
+
+	PVE::QemuServer::vm_mon_cmd($vmid, "set_password", protocol => "spice", password => $ticket);
+
+	my $config = {};
+	$config->{password} = $ticket;
+
+	print to_json($config);
+	return $config;
+    }});
+
+__PACKAGE__->register_method({
     name => 'vm_config',
     path => '{vmid}/config',
     method => 'GET',
diff --git a/qm b/qm
index fb77858..d6df4dc 100755
--- a/qm
+++ b/qm
@@ -410,6 +410,8 @@ my $cmddef = {
 
     monitor  => [ __PACKAGE__, 'monitor', ['vmid']],
 
+    spiceticket => [ "PVE::API2::Qemu", 'spiceticket', ['vmid']],
+
     mtunnel => [ __PACKAGE__, 'mtunnel', []],	
 };
 
-- 
1.7.10.4



More information about the pve-devel mailing list