]> git.proxmox.com Git - pve-storage.git/blobdiff - PVE/Storage.pm
allow templates using .xz compression
[pve-storage.git] / PVE / Storage.pm
index e46bc7767cafad6209a2e8506de295c0db7ccf3e..0452a2de130169e83939e695d104d157f5a6cf7e 100755 (executable)
@@ -29,6 +29,7 @@ use PVE::Storage::ISCSIDirectPlugin;
 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();
@@ -41,6 +42,7 @@ PVE::Storage::ISCSIDirectPlugin->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';
@@ -146,7 +148,7 @@ sub volume_resize {
 
 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);
@@ -160,13 +162,13 @@ sub volume_rollback_is_possible {
 }
 
 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 {
@@ -490,6 +492,37 @@ sub storage_migrate {
        } 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";
     }
@@ -650,9 +683,9 @@ sub template_list {
                    $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))$!;
@@ -897,9 +930,14 @@ sub storage_info {
 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;
 }