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

Reply via email to