use Switch;
use JSON;
use IO::File;
+use String::ShellQuote 'shell_quote';
my $PROGNAME = "pve-zsync";
my $CONFIG_PATH = "/var/lib/${PROGNAME}/";
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 != $?;
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";
}
}