detection into a separate function to reduce code duplication and allow for easier modification.
Signed-off-by: Alwin Antreich <a.antre...@proxmox.com> --- PVE/Storage.pm | 78 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 57 insertions(+), 21 deletions(-) diff --git a/PVE/Storage.pm b/PVE/Storage.pm index 1688077..390b343 100755 --- a/PVE/Storage.pm +++ b/PVE/Storage.pm @@ -1265,6 +1265,52 @@ sub foreach_volid { } } +sub archive_info { + my ($archive, $comp, $format) = @_; + my $type; + + if (!defined($comp) || !defined($format)) { + my $volid = basename($archive); + if ($volid =~ /vzdump-(lxc|openvz|qemu)-\d+-(\d{4})_(\d{2})_(\d{2})-(\d{2})_(\d{2})_(\d{2})\.(tgz|((tar|vma)(\.(gz|lzo))?))$/) { + $type = $1; + + if ($8 eq 'tgz') { + $format = 'tar'; + $comp = 'gz'; + } else { + $format = $10; + $comp = $12 if defined($12); + } + } else { + die "ERROR: couldn't determine format and compression type\n"; + } + } + + my $decompressor = { + gz => { + 'vma' => [ "zcat", $archive ], + 'tar' => [ "tar", "-z", $archive ], + }, + lzo => { + 'vma' => [ "lzop", "-d", "-c", $archive ], + 'tar' => [ "tar", "--lzop", $archive ], + }, + }; + + my $info; + $info->{'format'} = $format; + $info->{'type'} = $type; + $info->{'compression'} = $comp; + + if (defined($comp) && defined($format)) { + my $dcomp = $decompressor->{$comp}->{$format}; + pop(@$dcomp) if !defined($archive); + $info->{'decompressor'} = $dcomp; + } + + return $info; +} + sub extract_vzdump_config_tar { my ($archive, $conf_re) = @_; @@ -1310,16 +1356,12 @@ sub extract_vzdump_config_vma { }; + my $info = archive_info($archive); + $comp //= $info->{compression}; + my $decompressor = $info->{decompressor}; + if ($comp) { - my $uncomp; - if ($comp eq 'gz') { - $uncomp = ["zcat", $archive]; - } elsif ($comp eq 'lzo') { - $uncomp = ["lzop", "-d", "-c", $archive]; - } else { - die "unknown compression method '$comp'\n"; - } - $cmd = [$uncomp, ["vma", "config", "-"]]; + $cmd = [ $decompressor, ["vma", "config", "-"] ]; # in some cases, lzop/zcat exits with 1 when its stdout pipe is # closed early by vma, detect this and ignore the exit code later @@ -1360,20 +1402,14 @@ sub extract_vzdump_config { my ($cfg, $volid) = @_; my $archive = abs_filesystem_path($cfg, $volid); + my $info = archive_info($archive); + my $format = $info->{format}; + my $comp = $info->{compression}; + my $type = $info->{type}; - if ($volid =~ /vzdump-(lxc|openvz)-\d+-(\d{4})_(\d{2})_(\d{2})-(\d{2})_(\d{2})_(\d{2})\.(tgz|(tar(\.(gz|lzo))?))$/) { + if ($type eq 'lxc' || $type eq 'openvz') { return extract_vzdump_config_tar($archive, qr!^(\./etc/vzdump/(pct|vps)\.conf)$!); - } elsif ($volid =~ /vzdump-qemu-\d+-(\d{4})_(\d{2})_(\d{2})-(\d{2})_(\d{2})_(\d{2})\.(tgz|((tar|vma)(\.(gz|lzo))?))$/) { - my $format; - my $comp; - if ($7 eq 'tgz') { - $format = 'tar'; - $comp = 'gz'; - } else { - $format = $9; - $comp = $11 if defined($11); - } - + } elsif ($type eq 'qemu') { if ($format eq 'tar') { return extract_vzdump_config_tar($archive, qr!\(\./qemu-server\.conf\)!); } else { -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel