This patch adds support to restore archives that have been compressed
with a compressor not natively supported by tar. This had to be added
for zstd support.

Signed-off-by: Alwin Antreich <[email protected]>
---
 src/PVE/LXC/Create.pm | 31 +++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/src/PVE/LXC/Create.pm b/src/PVE/LXC/Create.pm
index 029c940..a7aec9a 100644
--- a/src/PVE/LXC/Create.pm
+++ b/src/PVE/LXC/Create.pm
@@ -71,21 +71,28 @@ sub restore_archive {
     my $archive_fh;
     my $tar_input = '<&STDIN';
     my @compression_opt;
+    my $decomp;
     if ($archive ne '-') {
        # GNU tar refuses to autodetect this... *sigh*
        my %compression_map = (
-           '.gz'  => '-z',
-           '.bz2' => '-j',
-           '.xz'  => '-J',
-           '.lzo'  => '--lzop',
+           'gz'  => '-z',
+           'bz2' => '-j',
+           'xz'  => '-J',
+           'lzo'  => '--lzop',
        );
-       if ($archive =~ /\.tar(\.[^.]+)?$/) {
-           if (defined($1)) {
-               die "unrecognized compression format: $1\n" if 
!defined($compression_map{$1});
-               @compression_opt = $compression_map{$1};
+
+       $archive =~ /\.(tar)\.?([^.]+)?$/;
+           my $format = $1;
+           my $comp = $2;
+
+       if (defined($comp)) {
+           if (defined($compression_map{$comp})) {
+               @compression_opt = $compression_map{$comp};
+           } else {
+               $decomp = PVE::Storage::decompressor_info(undef, $comp);
            }
        } else {
-           die "file does not look like a template archive: $archive\n";
+           die "file does not look like a template archive: $archive\n" if 
($format ne 'tar');
        }
        sysopen($archive_fh, $archive, O_RDONLY)
            or die "failed to open '$archive': $!\n";
@@ -106,8 +113,12 @@ sub restore_archive {
     push @$cmd, '--anchored';
     push @$cmd, '--exclude' , './dev/*';
 
+    $cmd = [$decomp, $cmd] if defined($decomp);
+
     if (defined($bwlimit)) {
-       $cmd = [ ['cstream', '-t', $bwlimit*1024], $cmd ];
+           my $cstream = ['cstream', '-t', $bwlimit*1024];
+           # unpack if $decomp, otherwise to many array levels
+           $cmd = defined($decomp) ? [ $cstream, @$cmd ] : [ $cstream, $cmd ];
     }
 
     if ($archive eq '-') {
-- 
2.11.0


_______________________________________________
pve-devel mailing list
[email protected]
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to