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 is not valid UTF-8 in Perl's internal representation, which for example happens with a password like 'ääääöööö', 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]> --- Changes in v2: * Improve commit message - the ENV issues only happen when Perl's internal representation is not valid UTF-8 itself. 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 38f34f80..dbc5e5ea 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; @@ -6880,6 +6881,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 55fb6dc4..afac1496 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); @@ -738,6 +739,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
