From: Markus Frank <m.frank@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH qemu-server v7 1/5] enable clipboard parameter in vga_fmt
Date: Fri, 21 Apr 2023 12:00:05 +0200 [thread overview]
Message-ID: <20230421100009.98063-2-m.frank@proxmox.com> (raw)
In-Reply-To: <20230421100009.98063-1-m.frank@proxmox.com>
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
next prev parent reply other threads:[~2023-04-21 10:00 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
2023-05-03 7:10 ` [pve-devel] [PATCH qemu-server v7 1/5] enable clipboard parameter in vga_fmt Dominik Csapak
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 ` [pve-devel] [PATCH novnc v7 3/5] added show clipboard button patch to series Markus Frank
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 ` [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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230421100009.98063-2-m.frank@proxmox.com \
--to=m.frank@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox