properties => {
node => get_standard_option('pve-node'),
vmid => get_standard_option('pve-vmid'),
- unsecure => {
- optional => 1,
- type => 'boolean',
- description => "disables x509 auth",
- },
websocket => {
optional => 1,
type => 'boolean',
my $vmid = $param->{vmid};
my $node = $param->{node};
- my $unsecure = $param->{unsecure} // 0;
- my $websocket = $param->{websocket} // 0;
+ my $websocket = $param->{websocket};
my $conf = PVE::QemuServer::load_config($vmid, $node); # check if VM exists
if ($conf->{vga} && ($conf->{vga} =~ m/^serial\d+$/)) {
- die "Unsecure mode is not supported in vga serial mode!" if $unsecure;
+ die "Websocket mode is not supported in vga serial mode!" if $websocket;
my $termcmd = [ '/usr/sbin/qm', 'terminal', $vmid, '-iface', $conf->{vga} ];
#my $termcmd = "/usr/bin/qm terminal -iface $conf->{vga}";
'-perm', 'Sys.Console', '-c', @$remcmd, @$termcmd];
} else {
- my $vnc_socket = PVE::QemuServer::vnc_socket($vmid);
-
- if (defined $remip) {
- my $perlcode = "";
- if ($unsecure) {
- $perlcode = qq|
- use PVE::QemuServer;
-
- PVE::QemuServer::vm_mon_cmd($vmid, "change", device => "vnc", target => "unix:$vnc_socket,password");
-
- PVE::QemuServer::vm_mon_cmd($vmid, "set_password", protocol => "vnc", password => "$ticket");
-
- PVE::QemuServer::vm_mon_cmd($vmid, "expire_password", protocol => "vnc", time => "+30");
- |;
- } else {
- $perlcode = qq|
- use PVE::QemuServer;
-
- PVE::QemuServer::vm_mon_cmd($vmid, "change", device => "vnc", target => "unix:$vnc_socket,x509,password");
- |;
- }
-
- PVE::Tools::run_command([@$remcmd, 'perl', '-'], input => $perlcode, outfunc => sub {print shift;}, errfunc => sub {print STDERR shift;});
-
- } else {
- if ($unsecure) {
- PVE::QemuServer::vm_mon_cmd($vmid, "change", device => 'vnc', target => "unix:$vnc_socket,password");
- PVE::QemuServer::vm_mon_cmd($vmid, "set_password", protocol => 'vnc', password => $ticket);
- PVE::QemuServer::vm_mon_cmd($vmid, "expire_password", protocol => 'vnc', time => "+30");
- } else {
- PVE::QemuServer::vm_mon_cmd($vmid, "change", device => 'vnc', target => "unix:$vnc_socket,x509,password");
- }
- }
-
my $qmcmd = [@$remcmd, "/usr/sbin/qm", 'vncproxy', $vmid];
my $qmstr = join(' ', @$qmcmd);
$cmd = ['/bin/nc', '-l', '-p', $port, '-w', $timeout, '-c', "$qmstr 2>/dev/null"];
if ($websocket) {
- $cmd = ["/usr/share/novnc/utils/wsproxy.py", '--run-once', "--timeout=$timeout", "--idle-timeout=$timeout", '--ssl-only', '--cert', '/etc/pve/local/pve-ssl.pem', '--key', '/etc/pve/local/pve-ssl.key', $port, '--', @$cmd];
+ $ENV{LC_PVE_TICKET} = $ticket;
+ $cmd = ["/usr/share/novnc-pve/utils/wsproxy.py", '--run-once', "--timeout=$timeout", "--idle-timeout=$timeout", '--ssl-only', '--cert', '/etc/pve/local/pve-ssl.pem', '--key', '/etc/pve/local/pve-ssl.key', $port, '--', @$cmd];
}
}
my $nodename = PVE::INotify::nodename();
sub run_vnc_proxy {
- my ($vmid) = @_;
-
- my $path = PVE::QemuServer::vnc_socket($vmid);
+ my ($path) = @_;
my $c;
while ( ++$c < 10 && !-e $path ) { sleep(1); }
my ($param) = @_;
my $vmid = $param->{vmid};
+ my $vnc_socket = PVE::QemuServer::vnc_socket($vmid);
+
+ if (my $ticket = $ENV{LC_PVE_TICKET}) { # NOTE: ssh on debian only pass LC_* variables
+ PVE::QemuServer::vm_mon_cmd($vmid, "change", device => 'vnc', target => "unix:$vnc_socket,password");
+ PVE::QemuServer::vm_mon_cmd($vmid, "set_password", protocol => 'vnc', password => $ticket);
+ PVE::QemuServer::vm_mon_cmd($vmid, "expire_password", protocol => 'vnc', time => "+30");
+ } else {
+ PVE::QemuServer::vm_mon_cmd($vmid, "change", device => 'vnc', target => "unix:$vnc_socket,x509,password");
+ }
- run_vnc_proxy ($vmid);
+ run_vnc_proxy($vnc_socket);
return undef;
}});