The PBS password is saved as UTF-8 and decoded to Perl's internal string representation upon reading from the password file. When the password contains multi-byte UTF-8 characters, backing up a diskless VM would fail with: > Error: error building client for repository XXX - > PBS_PASSWORD contains bad characters and restoring would fail with: > restore failed: invalid utf-8 sequence of 1 bytes from index 0
This is fixed by properly encoding the value for the PBS_PASSWORD environment variable value again as UTF-8. Signed-off-by: Fiona Ebner <[email protected]> --- src/PVE/QemuServer.pm | 4 ++++ src/PVE/VZDump/QemuServer.pm | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm index 7d5ab718..a57eecd5 100644 --- a/src/PVE/QemuServer.pm +++ b/src/PVE/QemuServer.pm @@ -5,6 +5,7 @@ use warnings; use Cwd 'abs_path'; use Digest::SHA; +use Encode qw(encode); use Fcntl ':flock'; use Fcntl; use File::Basename; @@ -6971,6 +6972,9 @@ sub restore_proxmox_backup_archive { # This is only used for `pbs-restore` and the QEMU PBS driver (live-restore) my $password = PVE::Storage::PBSPlugin::pbs_get_password($scfg, $storeid); + # The password is saved as UTF-8 and is decoded upon reading. Need to re-encode when setting the + # environment variable. + $password = encode('UTF-8', $password, 1); local $ENV{PBS_PASSWORD} = $password; local $ENV{PBS_FINGERPRINT} = $fingerprint if defined($fingerprint); diff --git a/src/PVE/VZDump/QemuServer.pm b/src/PVE/VZDump/QemuServer.pm index 5b94c369..30a77ea9 100644 --- a/src/PVE/VZDump/QemuServer.pm +++ b/src/PVE/VZDump/QemuServer.pm @@ -3,6 +3,7 @@ package PVE::VZDump::QemuServer; use strict; use warnings; +use Encode qw(encode); use Fcntl qw(:mode); use File::Basename; use File::Path qw(make_path remove_tree); @@ -737,6 +738,9 @@ sub archive_pbs { if (!$diskcount) { $self->loginfo("backup contains no disks"); + # The password is saved as UTF-8 and is decoded upon reading. Need to re-encode when setting + # the environment variable. + $password = encode('UTF-8', $password, 1); local $ENV{PBS_PASSWORD} = $password; local $ENV{PBS_FINGERPRINT} = $fingerprint if defined($fingerprint); my $cmd = [ -- 2.47.3 _______________________________________________ pve-devel mailing list [email protected] https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
