* [pve-devel] [PATCH qemu-server v7 1/5] enable clipboard parameter in vga_fmt
2023-04-21 10:00 [pve-devel] [PATCH qemu-server/manager/novnc/docs v7 0/5] Feature noVNC-Clipboard Markus Frank
@ 2023-04-21 10:00 ` Markus Frank
2023-05-03 7:10 ` Dominik Csapak
2023-04-21 10:00 ` [pve-devel] [PATCH qemu-server v7 2/5] test cases for clipboard spice & std Markus Frank
` (4 subsequent siblings)
5 siblings, 1 reply; 8+ messages in thread
From: Markus Frank @ 2023-04-21 10:00 UTC (permalink / raw)
To: pve-devel
added option to use the qemu vdagent implementation to enable the noVNC
clipboard. When enabled with SPICE the spice-vdagent gets replaced with the qemu
implementation.
This patch does not solve #1406, but does allow copy and paste with
a running X-session, when spice-vdagent is installed on the guest.
added clipboard variable to return at status/current
By that noVNC is able to check if clipboard is active.
Signed-off-by: Markus Frank <m.frank@proxmox.com>
---
PVE/API2/Qemu.pm | 13 +++++++++
PVE/QemuServer.pm | 68 ++++++++++++++++++++++++++++++++---------------
2 files changed, 60 insertions(+), 21 deletions(-)
diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 587bb22..267527a 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -970,6 +970,9 @@ __PACKAGE__->register_method({
$conf->{boot} = PVE::QemuServer::print_bootorder($devs);
}
+ my $vga = PVE::QemuServer::parse_vga($conf->{vga});
+ PVE::QemuServer::assert_vnc_clipboard_config($vga);
+
# auto generate uuid if user did not specify smbios1 option
if (!$conf->{smbios1}) {
$conf->{smbios1} = PVE::QemuServer::generate_smbios1_uuid();
@@ -1760,6 +1763,10 @@ my $update_vm_api = sub {
die "only root can modify '$opt' config for real devices\n";
}
$conf->{pending}->{$opt} = $param->{$opt};
+ } elsif ($opt eq 'vga') {
+ my $vga = PVE::QemuServer::parse_vga($param->{$opt});
+ PVE::QemuServer::assert_vnc_clipboard_config($vga);
+ $conf->{pending}->{$opt} = $param->{$opt};
} elsif ($opt =~ m/^usb\d+/) {
if ((!defined($conf->{$opt}) || $conf->{$opt} =~ m/spice/) && $param->{$opt} =~ m/spice/) {
$rpcenv->check_vm_perm($authuser, $vmid, undef, ['VM.Config.HWType']);
@@ -2580,6 +2587,11 @@ __PACKAGE__->register_method({
type => 'boolean',
optional => 1,
},
+ vnc_clipboard => {
+ description => "QEMU clipboard for noVNC is enabled in config.",
+ type => 'boolean',
+ optional => 1,
+ },
},
},
code => sub {
@@ -2598,6 +2610,7 @@ __PACKAGE__->register_method({
my $spice = defined($vga->{type}) && $vga->{type} =~ /^virtio/;
$spice ||= PVE::QemuServer::vga_conf_has_spice($conf->{vga});
$status->{spice} = 1 if $spice;
+ $status->{vnc_clipboard} = $vga->{vnc_clipboard};
}
$status->{agent} = 1 if PVE::QemuServer::get_qga_key($conf, 'enabled');
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 40be44d..f9928b7 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -193,8 +193,16 @@ my $vga_fmt = {
minimum => 4,
maximum => 512,
},
+ vnc_clipboard => {
+ description => "enable VNC clipboard (requires spice tools in the guest)",
+ type => 'boolean',
+ optional => 1,
+ default => 0
+ }
};
+my $vnc_clipboard_regex = qr/^(std|cirrus|vmware|virtio|qxl)/;
+
my $ivshmem_fmt = {
size => {
type => 'integer',
@@ -1405,6 +1413,14 @@ sub pve_verify_hotplug_features {
die "unable to parse hotplug option\n";
}
+sub assert_vnc_clipboard_config {
+ my ($vga) = @_;
+
+ if ($vga->{vnc_clipboard} && $vga->{type} && $vga->{type} !~ $vnc_clipboard_regex) {
+ die "vga type $vga->{type} is not compatible with VNC clipboard\n";
+ }
+}
+
sub scsi_inquiry {
my($fh, $noerr) = @_;
@@ -3933,9 +3949,13 @@ sub config_to_command {
push @$devices, '-device', "virtio-rng-pci,rng=rng0$limiter_str$rng_addr";
}
+ my $spicedevices = [];
my $spice_port;
- if ($qxlnum || $vga->{type} =~ /^virtio/) {
+ assert_vnc_clipboard_config($vga);
+
+ if ($qxlnum || $vga->{type} =~ /^virtio/
+ || ($vga->{vnc_clipboard} && $vga->{type} =~ $vnc_clipboard_regex)) {
if ($qxlnum > 1) {
if ($winversion){
for (my $i = 1; $i < $qxlnum; $i++){
@@ -3953,34 +3973,40 @@ sub config_to_command {
push @$cmd, '-global', "qxl-vga.vram_size=$vram";
}
}
-
my $pciaddr = print_pci_addr("spice", $bridges, $arch, $machine_type);
- my $pfamily = PVE::Tools::get_host_address_family($nodename);
- my @nodeaddrs = PVE::Tools::getaddrinfo_all('localhost', family => $pfamily);
- die "failed to get an ip address of type $pfamily for 'localhost'\n" if !@nodeaddrs;
+ push @$spicedevices, '-device', "virtio-serial,id=spice$pciaddr";
+ if ($vga->{vnc_clipboard}) {
+ push @$spicedevices, '-chardev', 'qemu-vdagent,id=vdagent,name=vdagent,clipboard=on';
+ } elsif ($vga->{type} =~ /^virtio/ || $qxlnum) {
+ push @$spicedevices, '-chardev', 'spicevmc,id=vdagent,name=vdagent';
+ }
+ push @$spicedevices, '-device', "virtserialport,chardev=vdagent,name=com.redhat.spice.0";
- push @$devices, '-device', "virtio-serial,id=spice$pciaddr";
- push @$devices, '-chardev', "spicevmc,id=vdagent,name=vdagent";
- push @$devices, '-device', "virtserialport,chardev=vdagent,name=com.redhat.spice.0";
+ if ($qxlnum || $vga->{type} =~ /^virtio/) {
+ my $pfamily = PVE::Tools::get_host_address_family($nodename);
+ my @nodeaddrs = PVE::Tools::getaddrinfo_all('localhost', family => $pfamily);
+ die "failed to get an ip address of type $pfamily for 'localhost'\n" if !@nodeaddrs;
- my $localhost = PVE::Network::addr_to_ip($nodeaddrs[0]->{addr});
- $spice_port = PVE::Tools::next_spice_port($pfamily, $localhost);
+ my $localhost = PVE::Network::addr_to_ip($nodeaddrs[0]->{addr});
+ $spice_port = PVE::Tools::next_spice_port($pfamily, $localhost);
- my $spice_enhancement_str = $conf->{spice_enhancements} // '';
- my $spice_enhancement = parse_property_string($spice_enhancements_fmt, $spice_enhancement_str);
- if ($spice_enhancement->{foldersharing}) {
- push @$devices, '-chardev', "spiceport,id=foldershare,name=org.spice-space.webdav.0";
- push @$devices, '-device', "virtserialport,chardev=foldershare,name=org.spice-space.webdav.0";
- }
-
- my $spice_opts = "tls-port=${spice_port},addr=$localhost,tls-ciphers=HIGH,seamless-migration=on";
- $spice_opts .= ",streaming-video=$spice_enhancement->{videostreaming}"
- if $spice_enhancement->{videostreaming};
+ my $spice_enhancement_str = $conf->{spice_enhancements} // '';
+ my $spice_enhancement = parse_property_string($spice_enhancements_fmt, $spice_enhancement_str);
+ if ($spice_enhancement->{foldersharing}) {
+ push @$spicedevices, '-chardev', "spiceport,id=foldershare,name=org.spice-space.webdav.0";
+ push @$spicedevices, '-device', "virtserialport,chardev=foldershare,name=org.spice-space.webdav.0";
+ }
- push @$devices, '-spice', "$spice_opts";
+ my $spice_opts = "tls-port=${spice_port},addr=$localhost,tls-ciphers=HIGH,seamless-migration=on";
+ $spice_opts .= ",streaming-video=$spice_enhancement->{videostreaming}"
+ if $spice_enhancement->{videostreaming};
+ push @$spicedevices, '-spice', "$spice_opts";
+ }
}
+ push @$devices, @$spicedevices;
+
# enable balloon by default, unless explicitly disabled
if (!defined($conf->{balloon}) || $conf->{balloon}) {
my $pciaddr = print_pci_addr("balloon0", $bridges, $arch, $machine_type);
--
2.30.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [pve-devel] [PATCH qemu-server v7 1/5] enable clipboard parameter in vga_fmt
2023-04-21 10:00 ` [pve-devel] [PATCH qemu-server v7 1/5] enable clipboard parameter in vga_fmt Markus Frank
@ 2023-05-03 7:10 ` Dominik Csapak
0 siblings, 0 replies; 8+ messages in thread
From: Dominik Csapak @ 2023-05-03 7:10 UTC (permalink / raw)
To: Proxmox VE development discussion, Markus Frank
hi,
a few comments inline, hopefully we're soon at the finish line ;)
On 4/21/23 12:00, Markus Frank wrote:
> added option to use the qemu vdagent implementation to enable the noVNC
> clipboard. When enabled with SPICE the spice-vdagent gets replaced with the qemu
> implementation.
>
> This patch does not solve #1406, but does allow copy and paste with
> a running X-session, when spice-vdagent is installed on the guest.
>
> added clipboard variable to return at status/current
>
> By that noVNC is able to check if clipboard is active.
>
> Signed-off-by: Markus Frank <m.frank@proxmox.com>
> ---
> PVE/API2/Qemu.pm | 13 +++++++++
> PVE/QemuServer.pm | 68 ++++++++++++++++++++++++++++++++---------------
> 2 files changed, 60 insertions(+), 21 deletions(-)
>
> diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
> index 587bb22..267527a 100644
> --- a/PVE/API2/Qemu.pm
> +++ b/PVE/API2/Qemu.pm
> @@ -970,6 +970,9 @@ __PACKAGE__->register_method({
> $conf->{boot} = PVE::QemuServer::print_bootorder($devs);
> }
>
> + my $vga = PVE::QemuServer::parse_vga($conf->{vga});
> + PVE::QemuServer::assert_vnc_clipboard_config($vga);
> +
> # auto generate uuid if user did not specify smbios1 option
> if (!$conf->{smbios1}) {
> $conf->{smbios1} = PVE::QemuServer::generate_smbios1_uuid();
> @@ -1760,6 +1763,10 @@ my $update_vm_api = sub {
> die "only root can modify '$opt' config for real devices\n";
> }
> $conf->{pending}->{$opt} = $param->{$opt};
> + } elsif ($opt eq 'vga') {
> + my $vga = PVE::QemuServer::parse_vga($param->{$opt});
> + PVE::QemuServer::assert_vnc_clipboard_config($vga);
> + $conf->{pending}->{$opt} = $param->{$opt};
> } elsif ($opt =~ m/^usb\d+/) {
> if ((!defined($conf->{$opt}) || $conf->{$opt} =~ m/spice/) && $param->{$opt} =~ m/spice/) {
> $rpcenv->check_vm_perm($authuser, $vmid, undef, ['VM.Config.HWType']);
> @@ -2580,6 +2587,11 @@ __PACKAGE__->register_method({
> type => 'boolean',
> optional => 1,
> },
> + vnc_clipboard => {
> + description => "QEMU clipboard for noVNC is enabled in config.",
> + type => 'boolean',
> + optional => 1,
> + },
> },
> },
> code => sub {
> @@ -2598,6 +2610,7 @@ __PACKAGE__->register_method({
> my $spice = defined($vga->{type}) && $vga->{type} =~ /^virtio/;
> $spice ||= PVE::QemuServer::vga_conf_has_spice($conf->{vga});
> $status->{spice} = 1 if $spice;
> + $status->{vnc_clipboard} = $vga->{vnc_clipboard};
> }
> $status->{agent} = 1 if PVE::QemuServer::get_qga_key($conf, 'enabled');
>
> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
> index 40be44d..f9928b7 100644
> --- a/PVE/QemuServer.pm
> +++ b/PVE/QemuServer.pm
> @@ -193,8 +193,16 @@ my $vga_fmt = {
> minimum => 4,
> maximum => 512,
> },
> + vnc_clipboard => {
> + description => "enable VNC clipboard (requires spice tools in the guest)",
> + type => 'boolean',
> + optional => 1,
> + default => 0
> + }
> };
>
> +my $vnc_clipboard_regex = qr/^(std|cirrus|vmware|virtio|qxl)/;
> +
> my $ivshmem_fmt = {
> size => {
> type => 'integer',
> @@ -1405,6 +1413,14 @@ sub pve_verify_hotplug_features {
> die "unable to parse hotplug option\n";
> }
>
> +sub assert_vnc_clipboard_config {
> + my ($vga) = @_;
> +
> + if ($vga->{vnc_clipboard} && $vga->{type} && $vga->{type} !~ $vnc_clipboard_regex) {
> + die "vga type $vga->{type} is not compatible with VNC clipboard\n";
> + }
> +}
> +
> sub scsi_inquiry {
> my($fh, $noerr) = @_;
>
> @@ -3933,9 +3949,13 @@ sub config_to_command {
> push @$devices, '-device', "virtio-rng-pci,rng=rng0$limiter_str$rng_addr";
> }
>
> + my $spicedevices = [];
i don't think this is necessary, you replaced all pushes to @$devices below
with @$spicedevices, and push them all after that into @$devices
you should be able to push directly into @$devices, or am i missing something?
> my $spice_port;
>
> - if ($qxlnum || $vga->{type} =~ /^virtio/) {
> + assert_vnc_clipboard_config($vga);
> +
> + if ($qxlnum || $vga->{type} =~ /^virtio/
> + || ($vga->{vnc_clipboard} && $vga->{type} =~ $vnc_clipboard_regex)) {
isn't that second part of the clipboard check redundant since you call
the 'assert_vnc_clipboard_config' above?
so at this point the type must be a match or the assert would have triggered?
(would make the condition a bit more readable if we can omit the type check)
also if the type would be not set, this would generate a perl warning i guess?
> if ($qxlnum > 1) {
> if ($winversion){
> for (my $i = 1; $i < $qxlnum; $i++){
> @@ -3953,34 +3973,40 @@ sub config_to_command {
> push @$cmd, '-global', "qxl-vga.vram_size=$vram";
> }
> }
> -
> my $pciaddr = print_pci_addr("spice", $bridges, $arch, $machine_type);
>
> - my $pfamily = PVE::Tools::get_host_address_family($nodename);
> - my @nodeaddrs = PVE::Tools::getaddrinfo_all('localhost', family => $pfamily);
> - die "failed to get an ip address of type $pfamily for 'localhost'\n" if !@nodeaddrs;
> + push @$spicedevices, '-device', "virtio-serial,id=spice$pciaddr";
> + if ($vga->{vnc_clipboard}) {
> + push @$spicedevices, '-chardev', 'qemu-vdagent,id=vdagent,name=vdagent,clipboard=on';
> + } elsif ($vga->{type} =~ /^virtio/ || $qxlnum) {
> + push @$spicedevices, '-chardev', 'spicevmc,id=vdagent,name=vdagent';
> + }
> + push @$spicedevices, '-device', "virtserialport,chardev=vdagent,name=com.redhat.spice.0";
>
this looks a bit confusing:
we are in the case where we definitely have either a vnc clipboard or spice configured
so either condition must always be true? if i understood that correclty
it would make more sense imho to simply drop the condition in the else path
you even reference the chardev in the unconditional code afterwards so having such a condition
looks like there might be a way to have neither
also does the order of these devices/chardevs really matter (aside from our regression tests?)
if not, we could simply add the required devices up front, and reuse the
if (qxlnum || ..)
path below to add the spicevmc and keep only the if (vnc_clipboard) above
> - push @$devices, '-device', "virtio-serial,id=spice$pciaddr";
> - push @$devices, '-chardev', "spicevmc,id=vdagent,name=vdagent";
> - push @$devices, '-device', "virtserialport,chardev=vdagent,name=com.redhat.spice.0";
> + if ($qxlnum || $vga->{type} =~ /^virtio/) {
this check could maybe be factored out, since it's used at least twice and is rather
non-trivial (a regex that looks like it matches only 'virtio' but is only anchored at
the beginning so it matches more than one)
> + my $pfamily = PVE::Tools::get_host_address_family($nodename);
> + my @nodeaddrs = PVE::Tools::getaddrinfo_all('localhost', family => $pfamily);
> + die "failed to get an ip address of type $pfamily for 'localhost'\n" if !@nodeaddrs;
>
> - my $localhost = PVE::Network::addr_to_ip($nodeaddrs[0]->{addr});
> - $spice_port = PVE::Tools::next_spice_port($pfamily, $localhost);
> + my $localhost = PVE::Network::addr_to_ip($nodeaddrs[0]->{addr});
> + $spice_port = PVE::Tools::next_spice_port($pfamily, $localhost);
>
> - my $spice_enhancement_str = $conf->{spice_enhancements} // '';
> - my $spice_enhancement = parse_property_string($spice_enhancements_fmt, $spice_enhancement_str);
> - if ($spice_enhancement->{foldersharing}) {
> - push @$devices, '-chardev', "spiceport,id=foldershare,name=org.spice-space.webdav.0";
> - push @$devices, '-device', "virtserialport,chardev=foldershare,name=org.spice-space.webdav.0";
> - }
> -
> - my $spice_opts = "tls-port=${spice_port},addr=$localhost,tls-ciphers=HIGH,seamless-migration=on";
> - $spice_opts .= ",streaming-video=$spice_enhancement->{videostreaming}"
> - if $spice_enhancement->{videostreaming};
> + my $spice_enhancement_str = $conf->{spice_enhancements} // '';
> + my $spice_enhancement = parse_property_string($spice_enhancements_fmt, $spice_enhancement_str);
> + if ($spice_enhancement->{foldersharing}) {
> + push @$spicedevices, '-chardev', "spiceport,id=foldershare,name=org.spice-space.webdav.0";
> + push @$spicedevices, '-device', "virtserialport,chardev=foldershare,name=org.spice-space.webdav.0";
> + }
>
> - push @$devices, '-spice', "$spice_opts";
> + my $spice_opts = "tls-port=${spice_port},addr=$localhost,tls-ciphers=HIGH,seamless-migration=on";
> + $spice_opts .= ",streaming-video=$spice_enhancement->{videostreaming}"
> + if $spice_enhancement->{videostreaming};
> + push @$spicedevices, '-spice', "$spice_opts";
> + }
> }
>
> + push @$devices, @$spicedevices;
> +
> # enable balloon by default, unless explicitly disabled
> if (!defined($conf->{balloon}) || $conf->{balloon}) {
> my $pciaddr = print_pci_addr("balloon0", $bridges, $arch, $machine_type);
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pve-devel] [PATCH qemu-server v7 2/5] test cases for clipboard spice & std
2023-04-21 10:00 [pve-devel] [PATCH qemu-server/manager/novnc/docs v7 0/5] Feature noVNC-Clipboard Markus Frank
2023-04-21 10:00 ` [pve-devel] [PATCH qemu-server v7 1/5] enable clipboard parameter in vga_fmt Markus Frank
@ 2023-04-21 10:00 ` Markus Frank
2023-04-21 10:00 ` [pve-devel] [PATCH novnc v7 3/5] added show clipboard button patch to series Markus Frank
` (3 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Markus Frank @ 2023-04-21 10:00 UTC (permalink / raw)
To: pve-devel
added one test case for a spice display and one for std
Signed-off-by: Markus Frank <m.frank@proxmox.com>
---
test/cfg2cmd/VNC-clipboard-spice.conf | 1 +
test/cfg2cmd/VNC-clipboard-spice.conf.cmd | 27 +++++++++++++++++++++++
test/cfg2cmd/VNC-clipboard-std.conf | 1 +
test/cfg2cmd/VNC-clipboard-std.conf.cmd | 27 +++++++++++++++++++++++
4 files changed, 56 insertions(+)
create mode 100644 test/cfg2cmd/VNC-clipboard-spice.conf
create mode 100644 test/cfg2cmd/VNC-clipboard-spice.conf.cmd
create mode 100644 test/cfg2cmd/VNC-clipboard-std.conf
create mode 100644 test/cfg2cmd/VNC-clipboard-std.conf.cmd
diff --git a/test/cfg2cmd/VNC-clipboard-spice.conf b/test/cfg2cmd/VNC-clipboard-spice.conf
new file mode 100644
index 0000000..dfc4be7
--- /dev/null
+++ b/test/cfg2cmd/VNC-clipboard-spice.conf
@@ -0,0 +1 @@
+vga: qxl,vnc_clipboard=1
diff --git a/test/cfg2cmd/VNC-clipboard-spice.conf.cmd b/test/cfg2cmd/VNC-clipboard-spice.conf.cmd
new file mode 100644
index 0000000..f24cc7f
--- /dev/null
+++ b/test/cfg2cmd/VNC-clipboard-spice.conf.cmd
@@ -0,0 +1,27 @@
+/usr/bin/kvm \
+ -id 8006 \
+ -name 'vm8006,debug-threads=on' \
+ -no-shutdown \
+ -chardev 'socket,id=qmp,path=/var/run/qemu-server/8006.qmp,server=on,wait=off' \
+ -mon 'chardev=qmp,mode=control' \
+ -chardev 'socket,id=qmp-event,path=/var/run/qmeventd.sock,reconnect=5' \
+ -mon 'chardev=qmp-event,mode=control' \
+ -pidfile /var/run/qemu-server/8006.pid \
+ -daemonize \
+ -smp '1,sockets=1,cores=1,maxcpus=1' \
+ -nodefaults \
+ -boot 'menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg' \
+ -vnc 'unix:/var/run/qemu-server/8006.vnc,password=on' \
+ -cpu kvm64,enforce,+kvm_pv_eoi,+kvm_pv_unhalt,+lahf_lm,+sep \
+ -m 512 \
+ -device 'pci-bridge,id=pci.1,chassis_nr=1,bus=pci.0,addr=0x1e' \
+ -device 'pci-bridge,id=pci.2,chassis_nr=2,bus=pci.0,addr=0x1f' \
+ -device 'piix3-usb-uhci,id=uhci,bus=pci.0,addr=0x1.0x2' \
+ -device 'qxl-vga,id=vga,max_outputs=4,bus=pci.0,addr=0x2' \
+ -device 'virtio-serial,id=spice,bus=pci.0,addr=0x9' \
+ -chardev 'qemu-vdagent,id=vdagent,name=vdagent,clipboard=on' \
+ -device 'virtserialport,chardev=vdagent,name=com.redhat.spice.0' \
+ -spice 'tls-port=61000,addr=127.0.0.1,tls-ciphers=HIGH,seamless-migration=on' \
+ -device 'virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3,free-page-reporting=on' \
+ -iscsi 'initiator-name=iqn.1993-08.org.debian:01:aabbccddeeff' \
+ -machine 'type=pc+pve0'
diff --git a/test/cfg2cmd/VNC-clipboard-std.conf b/test/cfg2cmd/VNC-clipboard-std.conf
new file mode 100644
index 0000000..414895b
--- /dev/null
+++ b/test/cfg2cmd/VNC-clipboard-std.conf
@@ -0,0 +1 @@
+vga: std,vnc_clipboard=1
diff --git a/test/cfg2cmd/VNC-clipboard-std.conf.cmd b/test/cfg2cmd/VNC-clipboard-std.conf.cmd
new file mode 100644
index 0000000..c0c6cd2
--- /dev/null
+++ b/test/cfg2cmd/VNC-clipboard-std.conf.cmd
@@ -0,0 +1,27 @@
+/usr/bin/kvm \
+ -id 8006 \
+ -name 'vm8006,debug-threads=on' \
+ -no-shutdown \
+ -chardev 'socket,id=qmp,path=/var/run/qemu-server/8006.qmp,server=on,wait=off' \
+ -mon 'chardev=qmp,mode=control' \
+ -chardev 'socket,id=qmp-event,path=/var/run/qmeventd.sock,reconnect=5' \
+ -mon 'chardev=qmp-event,mode=control' \
+ -pidfile /var/run/qemu-server/8006.pid \
+ -daemonize \
+ -smp '1,sockets=1,cores=1,maxcpus=1' \
+ -nodefaults \
+ -boot 'menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg' \
+ -vnc 'unix:/var/run/qemu-server/8006.vnc,password=on' \
+ -cpu kvm64,enforce,+kvm_pv_eoi,+kvm_pv_unhalt,+lahf_lm,+sep \
+ -m 512 \
+ -device 'pci-bridge,id=pci.1,chassis_nr=1,bus=pci.0,addr=0x1e' \
+ -device 'pci-bridge,id=pci.2,chassis_nr=2,bus=pci.0,addr=0x1f' \
+ -device 'piix3-usb-uhci,id=uhci,bus=pci.0,addr=0x1.0x2' \
+ -device 'usb-tablet,id=tablet,bus=uhci.0,port=1' \
+ -device 'VGA,id=vga,bus=pci.0,addr=0x2' \
+ -device 'virtio-serial,id=spice,bus=pci.0,addr=0x9' \
+ -chardev 'qemu-vdagent,id=vdagent,name=vdagent,clipboard=on' \
+ -device 'virtserialport,chardev=vdagent,name=com.redhat.spice.0' \
+ -device 'virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3,free-page-reporting=on' \
+ -iscsi 'initiator-name=iqn.1993-08.org.debian:01:aabbccddeeff' \
+ -machine 'type=pc+pve0'
--
2.30.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pve-devel] [PATCH novnc v7 3/5] added show clipboard button patch to series
2023-04-21 10:00 [pve-devel] [PATCH qemu-server/manager/novnc/docs v7 0/5] Feature noVNC-Clipboard Markus Frank
2023-04-21 10:00 ` [pve-devel] [PATCH qemu-server v7 1/5] enable clipboard parameter in vga_fmt Markus Frank
2023-04-21 10:00 ` [pve-devel] [PATCH qemu-server v7 2/5] test cases for clipboard spice & std Markus Frank
@ 2023-04-21 10:00 ` Markus Frank
2023-04-21 10:00 ` [pve-devel] [PATCH manager v7 4/5] added clipboard checkbox to VM Options Markus Frank
` (2 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Markus Frank @ 2023-04-21 10:00 UTC (permalink / raw)
To: pve-devel
Signed-off-by: Markus Frank <m.frank@proxmox.com>
---
.../patches/0019-show-clipboard-button.patch | 30 +++++++++++++++++++
debian/patches/series | 1 +
2 files changed, 31 insertions(+)
create mode 100644 debian/patches/0019-show-clipboard-button.patch
diff --git a/debian/patches/0019-show-clipboard-button.patch b/debian/patches/0019-show-clipboard-button.patch
new file mode 100644
index 0000000..f3d8d64
--- /dev/null
+++ b/debian/patches/0019-show-clipboard-button.patch
@@ -0,0 +1,30 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Markus Frank <m.frank@proxmox.com>
+Date: Fri, 28 Oct 2022 13:57:57 +0200
+Subject: [PATCH] show clipboard button
+
+show button when clipboard at status/current is true
+
+Signed-off-by: Markus Frank <m.frank@proxmox.com>
+---
+ app/pve.js | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/app/pve.js b/app/pve.js
+index 287615f..5d6fa26 100644
+--- a/app/pve.js
++++ b/app/pve.js
+@@ -411,6 +411,10 @@ PVEUI.prototype = {
+ document.getElementById('pve_start_dlg')
+ .classList.add("noVNC_open");
+ }
++ if (result.data.vnc_clipboard) {
++ document.getElementById('noVNC_clipboard_button')
++ .classList.remove('pve_hidden');
++ }
+ },
+ failure: function(msg, code) {
+ if (code === 403) {
+--
+2.30.2
+
diff --git a/debian/patches/series b/debian/patches/series
index 085e2b4..212add7 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -16,3 +16,4 @@
0016-hide-fullscreen-button-on-isFullscreen-get-variable.patch
0017-make-error-hideable.patch
0018-show-start-button-on-not-running-vm-ct.patch
+0019-show-clipboard-button.patch
--
2.30.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pve-devel] [PATCH manager v7 4/5] added clipboard checkbox to VM Options
2023-04-21 10:00 [pve-devel] [PATCH qemu-server/manager/novnc/docs v7 0/5] Feature noVNC-Clipboard Markus Frank
` (2 preceding siblings ...)
2023-04-21 10:00 ` [pve-devel] [PATCH novnc v7 3/5] added show clipboard button patch to series Markus Frank
@ 2023-04-21 10:00 ` Markus Frank
2023-04-21 10:00 ` [pve-devel] [PATCH docs v7 5/5] added noVNC clipboard documentation Markus Frank
2023-04-24 16:24 ` [pve-devel] [PATCH qemu-server/manager/novnc/docs v7 0/5] Feature noVNC-Clipboard Friedrich Weber
5 siblings, 0 replies; 8+ messages in thread
From: Markus Frank @ 2023-04-21 10:00 UTC (permalink / raw)
To: pve-devel
Signed-off-by: Markus Frank <m.frank@proxmox.com>
---
www/manager6/qemu/DisplayEdit.js | 8 +++++++
www/manager6/qemu/Options.js | 37 ++++++++++++++++++++++++++++++++
2 files changed, 45 insertions(+)
diff --git a/www/manager6/qemu/DisplayEdit.js b/www/manager6/qemu/DisplayEdit.js
index 9bb1763e..ca5baa25 100644
--- a/www/manager6/qemu/DisplayEdit.js
+++ b/www/manager6/qemu/DisplayEdit.js
@@ -4,6 +4,9 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
onlineHelp: 'qm_display',
onGetValues: function(values) {
+ if (typeof this.originalConfig.vnc_clipboard !== 'undefined') {
+ values.vnc_clipboard = this.originalConfig.vnc_clipboard;
+ }
let ret = PVE.Parser.printPropertyString(values, 'type');
if (ret === '') {
return { 'delete': 'vga' };
@@ -11,6 +14,11 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
return { vga: ret };
},
+ onSetValues: function(values) {
+ this.originalConfig = values;
+ return values;
+ },
+
items: [{
name: 'type',
xtype: 'proxmoxKVComboBox',
diff --git a/www/manager6/qemu/Options.js b/www/manager6/qemu/Options.js
index 7b112400..c2943e3c 100644
--- a/www/manager6/qemu/Options.js
+++ b/www/manager6/qemu/Options.js
@@ -154,6 +154,43 @@ Ext.define('PVE.qemu.Options', {
},
} : undefined,
},
+ vga: {
+ header: gettext('Use VNC clipboard'),
+ defaultValue: false,
+ renderer: function(value) {
+ let vga = PVE.Parser.parsePropertyString(value, 'type');
+ return vga.vnc_clipboard ? Proxmox.Utils.yesText : Proxmox.Utils.noText;
+ },
+ editor: caps.vms['VM.Config.HWType'] ? {
+ xtype: 'proxmoxWindowEdit',
+ subject: gettext('Use VNC clipboard'),
+ onlineHelp: 'qm_display',
+ items: {
+ xtype: 'pveDisplayInputPanel',
+ items: {
+ xtype: 'proxmoxcheckbox',
+ name: 'vnc_clipboard',
+ uncheckedValue: 0,
+ defaultValue: 0,
+ itemId: 'clipboardBox',
+ fieldLabel: gettext('Enabled'),
+ },
+ onGetValues: function(values) {
+ values = Ext.apply(this.originalConfig, values);
+ PVE.Utils.delete_if_default(values, 'vnc_clipboard', 0, 1);
+ let ret = PVE.Parser.printPropertyString(values, 'type');
+ if (ret === '') {
+ return { 'delete': 'vga' };
+ }
+ return { vga: ret };
+ },
+ onSetValues: function(values) {
+ this.originalConfig = PVE.Parser.parsePropertyString(values.vga, 'type');
+ return this.originalConfig;
+ },
+ },
+ } : undefined,
+ },
hotplug: {
header: gettext('Hotplug'),
defaultValue: 'disk,network,usb',
--
2.30.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pve-devel] [PATCH docs v7 5/5] added noVNC clipboard documentation
2023-04-21 10:00 [pve-devel] [PATCH qemu-server/manager/novnc/docs v7 0/5] Feature noVNC-Clipboard Markus Frank
` (3 preceding siblings ...)
2023-04-21 10:00 ` [pve-devel] [PATCH manager v7 4/5] added clipboard checkbox to VM Options Markus Frank
@ 2023-04-21 10:00 ` Markus Frank
2023-04-24 16:24 ` [pve-devel] [PATCH qemu-server/manager/novnc/docs v7 0/5] Feature noVNC-Clipboard Friedrich Weber
5 siblings, 0 replies; 8+ messages in thread
From: Markus Frank @ 2023-04-21 10:00 UTC (permalink / raw)
To: pve-devel
Signed-off-by: Markus Frank <m.frank@proxmox.com>
---
qm.adoc | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/qm.adoc b/qm.adoc
index f28043f..8214bdd 100644
--- a/qm.adoc
+++ b/qm.adoc
@@ -717,6 +717,24 @@ Selecting `serialX` as display 'type' disables the VGA output, and redirects
the Web Console to the selected serial port. A configured display 'memory'
setting will be ignored in that case.
+.noVNC clipboard
+You can enable the VNC clipboard by setting `vnc_clipboard` to 1.
+
+----
+# qm set <vmid> -vga <displaytype>,vnc_clipboard=1
+----
+
+In order to use the clipboard feature, you must first install the
+SPICE guest tools. On Debian-based distributions, this can be achieved
+by installing `spice-vdagent`. For other Operating Systems search for it
+in the offical repositories or see: https://www.spice-space.org/download.html
+
+Once you have installed the spice guest tools, you can use the clipboard
+function in the noVNC console panel. However, if you're using
+SPICE, virtio or virgl, you'll need to choose which clipboard to use.
+This is because the default *SPICE* clipboard will be replaced by the
+*VNC* clipboard, if `vnc_clipboard` is set to 1.
+
[[qm_usb_passthrough]]
USB Passthrough
~~~~~~~~~~~~~~~
--
2.30.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [pve-devel] [PATCH qemu-server/manager/novnc/docs v7 0/5] Feature noVNC-Clipboard
2023-04-21 10:00 [pve-devel] [PATCH qemu-server/manager/novnc/docs v7 0/5] Feature noVNC-Clipboard Markus Frank
` (4 preceding siblings ...)
2023-04-21 10:00 ` [pve-devel] [PATCH docs v7 5/5] added noVNC clipboard documentation Markus Frank
@ 2023-04-24 16:24 ` Friedrich Weber
5 siblings, 0 replies; 8+ messages in thread
From: Friedrich Weber @ 2023-04-24 16:24 UTC (permalink / raw)
To: Proxmox VE development discussion, Markus Frank
Can confirm the UI glitch from v6 (the empty "Display" option) is gone
and the noVNC clipboard works (browser->VM and vice-versa) -- modulo the
additional null byte issue which cannot be addressed in this patch
series (see my v6 review for more details).
Tested-by: Friedrich Weber <f.weber@proxmox.com>
^ permalink raw reply [flat|nested] 8+ messages in thread