use PVE::Storage::GlusterfsPlugin;
use PVE::Storage::ZFSPoolPlugin;
use PVE::Storage::ZFSPlugin;
+use PVE::Storage::DRBDPlugin;
# load and initialize all plugins
PVE::Storage::DirPlugin->register();
PVE::Storage::GlusterfsPlugin->register();
PVE::Storage::ZFSPoolPlugin->register();
PVE::Storage::ZFSPlugin->register();
+PVE::Storage::DRBDPlugin->register();
PVE::Storage::Plugin->init();
my $UDEVADM = '/sbin/udevadm';
sub volume_rollback_is_possible {
my ($cfg, $volid, $snap) = @_;
-
+
my ($storeid, $volname) = parse_volume_id($volid, 1);
if ($storeid) {
my $scfg = storage_config($cfg, $storeid);
}
sub volume_snapshot {
- my ($cfg, $volid, $snap, $running) = @_;
+ my ($cfg, $volid, $snap) = @_;
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($scfg, $storeid, $volname, $snap, $running);
+ return $plugin->volume_snapshot($scfg, $storeid, $volname, $snap);
} elsif ($volid =~ m|^(/.+)$| && -e $volid) {
die "snapshot file/device '$volid' is not possible\n";
} else {
} else {
die "$errstr - target type '$tcfg->{type}' not implemented\n";
}
+
+ } elsif ($scfg->{type} eq 'zfspool') {
+
+ if ($tcfg->{type} eq 'zfspool') {
+
+ die "$errstr - pool on target has not same name as source!"
+ if $tcfg->{pool} ne $scfg->{pool};
+
+ my (undef, $volname) = parse_volname($cfg, $volid);
+
+ my $zfspath = "$scfg->{pool}\/$volname";
+
+ my $snap = "zfs snapshot $zfspath\@__migration__";
+
+ my $send = "zfs send -v $zfspath\@__migration__ \| ssh root\@$target_host zfs recv $zfspath";
+
+ my $destroy_target = "ssh root\@$target_host zfs destroy $zfspath\@__migration__";
+ run_command($snap);
+ eval{
+ run_command($send);
+ };
+ my $err;
+ if ($err = $@){
+ run_command("zfs destroy $zfspath\@__migration__");
+ die $err;
+ }
+ run_command($destroy_target);
+
+ } else {
+ die "$errstr - target type $tcfg->{type} is not valid\n";
+ }
} else {
die "$errstr - source type '$scfg->{type}' not implemented\n";
}
# lock shared storage
return $plugin->cluster_lock_storage($storeid, $scfg->{shared}, undef, sub {
- my $volname = $plugin->alloc_image($storeid, $scfg, $vmid, $fmt, $name, $size);
+ my $old_umask = umask(umask|0037);
+ my $volname = eval { $plugin->alloc_image($storeid, $scfg, $vmid, $fmt, $name, $size) };
+ my $err = $@;
+ umask $old_umask;
+ die $err if $err;
return "$storeid:$volname";
});
}
}
}
}
- my $cleanup_worker = $plugin->free_image($storeid, $scfg, $volname, $isBase);
+ $cleanup_worker = $plugin->free_image($storeid, $scfg, $volname, $isBase);
});
return if !$cleanup_worker;
$info = { volid => "$sid:iso/$1", format => 'iso' };
} elsif ($tt eq 'vztmpl') {
- next if $fn !~ m!/([^/]+\.tar\.gz)$!;
+ next if $fn !~ m!/([^/]+\.tar\.([gx]z))$!;
- $info = { volid => "$sid:vztmpl/$1", format => 'tgz' };
+ $info = { volid => "$sid:vztmpl/$1", format => "t$2" };
} elsif ($tt eq 'backup') {
next if $fn !~ m!/([^/]+\.(tar|tar\.gz|tar\.lzo|tgz|vma|vma\.gz|vma\.lzo))$!;
my $ids = $cfg->{ids};
my $info = {};
-
+
+ my @ctypes = PVE::Tools::split_list($content);
+
my $slist = [];
foreach my $storeid (keys %$ids) {
- next if $content && !$ids->{$storeid}->{content}->{$content};
-
next if !storage_check_enabled($cfg, $storeid, undef, 1);
+ my $want_ctype = 0;
+ foreach my $ctype (@ctypes) {
+ if ($ids->{$storeid}->{content}->{$ctype}) {
+ $want_ctype = 1;
+ last;
+ }
+ }
+ next if !$want_ctype;
+
my $type = $ids->{$storeid}->{type};
$info->{$storeid} = {
sub resolv_server {
my ($server) = @_;
- my $packed_ip = gethostbyname($server);
+ my ($packed_ip, $family);
+ eval {
+ my @res = PVE::Tools::getaddrinfo_all($server);
+ $family = $res[0]->{family};
+ $packed_ip = (PVE::Tools::unpack_sockaddr_in46($res[0]->{addr}))[2];
+ };
if (defined $packed_ip) {
- return inet_ntoa($packed_ip);
+ return Socket::inet_ntop($family, $packed_ip);
}
return undef;
}