[pve-devel] [PATCH storage v2 2/3] storage: merge archive format/compressor
Alwin Antreich
a.antreich at proxmox.com
Fri Jan 31 17:01:03 CET 2020
detection into a separate function to reduce code duplication and allow
for easier modification.
Signed-off-by: Alwin Antreich <a.antreich at 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
More information about the pve-devel
mailing list