]> git.proxmox.com Git - pve-zsync.git/blobdiff - pve-zsync
run_cmd: array support
[pve-zsync.git] / pve-zsync
index 9de01d2de0cf34b2879009bdbd4a8f87b81db9c9..9fac2fdd0c748288834e6e89cf63f7d6c670a072 100644 (file)
--- a/pve-zsync
+++ b/pve-zsync
@@ -10,6 +10,7 @@ use File::Path qw(make_path);
 use Switch;
 use JSON;
 use IO::File;
+use String::ShellQuote 'shell_quote';
 
 my $PROGNAME = "pve-zsync";
 my $CONFIG_PATH = "/var/lib/${PROGNAME}/";
@@ -672,6 +673,9 @@ sub run_cmd {
     my ($cmd) = @_;
     print "Start CMD\n" if $DEBUG;
     print Dumper $cmd if $DEBUG;
+    if (ref($cmd) eq 'ARRAY') {
+       $cmd = join(' ', map { ref($_) ? $$_ : shell_quote($_) } @$cmd);
+    }
     my $output = `$cmd 2>&1`;
 
     die "COMMAND:\n\t$cmd\nGET ERROR:\n\t$output" if 0 != $?;
@@ -690,48 +694,40 @@ sub parse_disks {
     my $num = 0;
     while ($text && $text =~ s/^(.*?)(\n|$)//) {
        my $line = $1;
+
+       next if $line =~ /cdrom|none/;
+       next if $line !~ m/^(?:virtio|ide|scsi|sata)\d+: /;
+
        my $disk = undef;
        my $stor = undef;
-       my $is_disk = $line =~ m/^(virtio|ide|scsi|sata){1}\d+: /;
-       if($line =~ m/^(virtio\d+: )(.+:)([A-Za-z0-9\-]+),(.*)$/) {
-           $disk = $3;
-           $stor = $2;
-       } elsif($line =~ m/^(ide\d+: )(.+:)([A-Za-z0-9\-]+),(.*)$/) {
-           $disk = $3;
-           $stor = $2;
-       } elsif($line =~ m/^(scsi\d+: )(.+:)([A-Za-z0-9\-]+),(.*)$/) {
-           $disk = $3;
-           $stor = $2;
-       } elsif($line =~ m/^(sata\d+: )(.+:)([A-Za-z0-9\-]+),(.*)$/) {
-           $disk = $3;
-           $stor = $2;
+       if($line =~ m/^(?:virtio|ide|scsi|sata)\d+: (.+:)([A-Za-z0-9\-]+),(.*)$/) {
+           $disk = $2;
+           $stor = $1;
+       } else {
+           die "disk is not on ZFS Storage\n";
        }
 
-       die "disk is not on ZFS Storage\n" if $is_disk && !$disk && $line !~ m/cdrom/;
-
-       if($disk && $line !~ m/none/ && $line !~ m/cdrom/ ) {
-           my $cmd = "";
-           $cmd .= "ssh root\@$ip " if $ip;
-           $cmd .= "pvesm path $stor$disk";
-           my $path = run_cmd($cmd);
+       my $cmd = "";
+       $cmd .= "ssh root\@$ip " if $ip;
+       $cmd .= "pvesm path $stor$disk";
+       my $path = run_cmd($cmd);
 
-           if ($path =~ m/^\/dev\/zvol\/(\w+).*(\/$disk)$/) {
+       if ($path =~ m/^\/dev\/zvol\/(\w+.*)(\/$disk)$/) {
 
-               my @array = split('/', $1);
-               $disks->{$num}->{pool} = pop(@array);
-               $disks->{$num}->{all} = $disks->{$num}->{pool};
-               if (0 < @array) {
-                   $disks->{$num}->{path} = join('/', @array);
-                   $disks->{$num}->{all} .= "\/$disks->{$num}->{path}";
-               }
-               $disks->{$num}->{last_part} = $disk;
-               $disks->{$num}->{all} .= "\/$disk";
+           my @array = split('/', $1);
+           $disks->{$num}->{pool} = shift(@array);
+           $disks->{$num}->{all} = $disks->{$num}->{pool};
+           if (0 < @array) {
+               $disks->{$num}->{path} = join('/', @array);
+               $disks->{$num}->{all} .= "\/$disks->{$num}->{path}";
+           }
+           $disks->{$num}->{last_part} = $disk;
+           $disks->{$num}->{all} .= "\/$disk";
 
-               $num++;
+           $num++;
 
-           } else {
-               die "ERROR: in path\n";
-           }
+       } else {
+           die "ERROR: in path\n";
        }
     }