[pve-devel] [RFC pve-container 6/6] vzdump: use the new run_command variant

Wolfgang Bumiller w.bumiller at proxmox.com
Tue Sep 15 10:07:22 CEST 2015


Use the array-of-array version of run_command to build the
pipe, this should deal with most quoting issues.
Note that tar handles glob patterns in --exclude itself, so
quoting patterns instead of letting the shell resolve them
is also actually more correct.
---
 src/PVE/VZDump/LXC.pm | 31 +++++++++++++++----------------
 1 file changed, 15 insertions(+), 16 deletions(-)

diff --git a/src/PVE/VZDump/LXC.pm b/src/PVE/VZDump/LXC.pm
index 83e2ab7..8dfc7cc 100644
--- a/src/PVE/VZDump/LXC.pm
+++ b/src/PVE/VZDump/LXC.pm
@@ -267,42 +267,41 @@ sub archive {
     my $snapdir = $task->{snapdir};
     my $tmpdir = $task->{tmpdir};
 
-    my $taropts = "--totals --sparse --numeric-owner --xattrs --one-file-system";
+    my $tar = ['tar', 'cpf', '-',
+               '--totals', '--sparse', '--numeric-owner', '--xattrs',
+               '--one-file-system'];
 
     # note: --remove-files does not work because we do not 
     # backup all files (filters). tar complains:
     # Cannot rmdir: Directory not empty
     # we we disable this optimization for now
     #if ($snapdir eq $task->{tmpdir} && $snapdir =~ m|^$opts->{dumpdir}/|) {
-    #       $taropts .= " --remove-files"; # try to save space
+    #       push @$tar, "--remove-files"; # try to save space
     #}
 
-    my $cmd = "tar cpf - $taropts ";
     # The directory parameter can give a alternative directory as source.
     # the second parameter gives the structure in the tar.
-    $cmd .= "--directory=$tmpdir ./etc/vzdump/pct.conf ";
-    $cmd .= "--directory=$snapdir";
-
-    foreach my $exclude (@{$self->{vzdump}->{findexcl}}) {
-	$cmd .= " --exclude=.$exclude";
-    }
+    push @$tar, "--directory=$tmpdir", './etc/vzdump/pct.conf';
+    push @$tar, "--directory=$snapdir";
+    push @$tar, map { "--exclude=.$_" } @{$self->{vzdump}->{findexcl}};
 
     # add every enabled mountpoint (since we use --one-file-system)
     my $disks = $task->{disks};
     # mp already starts with a / so we only need to add the dot
-    foreach my $disk (@$disks) {
-	$cmd .= " .$disk->{mp}";
-    }
+    push @$tar, map { '.' . $_->{mp} } @$disks;
+
+    my $cmd = [ $tar ];
 
     my $bwl = $opts->{bwlimit}*1024; # bandwidth limit for cstream
-    $cmd .= "|cstream -t $bwl" if $opts->{bwlimit};
-    $cmd .= "|$comp" if $comp;
+    push @$cmd, [ 'cstream', '-t', $bwl ] if $opts->{bwlimit};
+    push @$cmd, [ $comp ] if $comp;
 
     if ($opts->{stdout}) {
-	$self->cmd ($cmd, output => ">&" . fileno($opts->{stdout}));
+	push @{$cmd->[-1]}, \(">&" . fileno($opts->{stdout}));
     } else {
-	$self->cmd ("$cmd >" . PVE::Tools::shellquote($filename));
+	push @{$cmd->[-1]}, \(">" . PVE::Tools::shellquote($filename));
     }
+    $self->cmd($cmd);
 }
 
 sub cleanup {
-- 
2.1.4




More information about the pve-devel mailing list