}
}
+sub volume_snapshot_list {
+ my ($cfg, $volid, $prefix, $ip) = @_;
+
+ my ($storeid, $volname) = parse_volume_id($volid, 1);
+ if ($storeid) {
+ my $scfg = storage_config($cfg, $storeid);
+ my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+ return $plugin->volume_snapshot_list($scfg, $storeid, $volname, $prefix, $ip);
+ } elsif ($volid =~ m|^(/.+)$| && -e $volid) {
+ die "send file/device '$volid' is not possible\n";
+ } else {
+ die "unable to parse volume ID '$volid'\n";
+ }
+ # return an empty array if dataset does not exist.
+ # youngest snap first
+}
+
sub get_image_dir {
my ($cfg, $storeid, $vmid) = @_;
return ($res->{total}, $res->{avail}, $res->{used}, 1);
}
+sub volume_snapshot_list {
+ my ($class, $scfg, $storeid, $volname, $prefix, $ip) = @_;
+
+ # implement in subclass
+ die "Volume_snapshot_list is not implemented for $class";
+
+ # retrun an empty array if dataset does not exist.
+}
+
sub activate_storage {
my ($class, $storeid, $scfg, $cache) = @_;
return undef;
}
+sub volume_snapshot_list {
+ my ($class, $scfg, $storeid, $volname, $prefix, $ip) = @_;
+ # return an empty array if dataset does not exist.
+ die "Volume_snapshot_list is not implemented for ZFS over iSCSI.\n";
+}
+
sub activate_storage {
my ($class, $storeid, $scfg, $cache) = @_;
use PVE::Tools qw(run_command);
use PVE::Storage::Plugin;
use PVE::RPCEnvironment;
+use Net::IP;
use base qw(PVE::Storage::Plugin);
my $cmdrecv = [];
- push @$cmdrecv, 'ssh', '-o', 'BatchMode=yes', "root\@${ip}", '--' if $ip;
+ if ($ip) {
+ $ip = "[$ip]" if Net::IP::ip_is_ipv6($ip);
+ push @$cmdrecv, 'ssh', '-o', 'BatchMode=yes', "root\@${ip}", '--';
+ }
+
push @$cmdrecv, 'zfs', 'recv', '-F', '--';
$zpath = $target_path if defined($target_path);
return 1;
}
+sub volume_snapshot_list {
+ my ($class, $scfg, $storeid, $volname, $prefix, $ip) = @_;
+
+ my ($vtype, $name, $vmid) = $class->parse_volname($volname);
+
+ my $zpath = "$scfg->{pool}/$name";
+
+ $prefix = '' if !defined($prefix);
+ my $snaps = [];
+
+ my $cmd = ['zfs', 'list', '-r', '-H', '-S', 'name', '-t', 'snap', '-o',
+ 'name', $zpath];
+
+ if ($ip) {
+ $ip = "[$ip]" if Net::IP::ip_is_ipv6($ip);
+ unshift @$cmd, 'ssh', '-o', ' BatchMode=yes', "root\@${ip}", '--';
+ }
+
+ my $outfunc = sub {
+ my $line = shift;
+
+ if ($line =~ m/^\Q$zpath\E@(\Q$prefix\E.*)$/) {
+ push @$snaps, $1;
+ }
+ };
+
+ eval { run_command( [$cmd], outfunc => $outfunc , errfunc => sub{}); };
+
+ # return an empty array if dataset does not exist.
+ return $snaps;
+}
+
sub activate_storage {
my ($class, $storeid, $scfg, $cache) = @_;