use strict;
use warnings;
+use Data::Dumper;
use POSIX;
use IO::Select;
use Cwd 'abs_path';
use Socket;
-use PVE::Tools qw(run_command file_read_firstline);
+use PVE::Tools qw(run_command file_read_firstline $IPV6RE);
use PVE::Cluster qw(cfs_read_file cfs_lock_file);
use PVE::Exception qw(raise_param_exc);
use PVE::JSONSchema;
my $scfg = storage_config($cfg, $storeid);
my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+
+ # returns ($vtype, $name, $vmid, $basename, $basevmid, $isBase, $format)
+
return $plugin->parse_volname($volname);
}
# 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";
});
}
# lock shared storage
$plugin->cluster_lock_storage($storeid, $scfg->{shared}, undef, sub {
- my ($vtype, $name, $vmid, undef, undef, $isBase) =
+ my ($vtype, $name, $vmid, undef, undef, $isBase, $format) =
$plugin->parse_volname($volname);
if ($isBase) {
my $vollist = $plugin->list_images($storeid, $scfg);
}
}
}
- $cleanup_worker = $plugin->free_image($storeid, $scfg, $volname, $isBase);
+ $cleanup_worker = $plugin->free_image($storeid, $scfg, $volname, $isBase, $format);
});
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);
+ if (defined($content)) {
+ 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 scan_zfs {
- my $cmd = ['zpool', 'list', '-H', '-o', 'name,size,free'];
+ my $cmd = ['zfs', 'list', '-t', 'filesystem', '-H', '-o', 'name,avail,used'];
my $res = [];
run_command($cmd, outfunc => sub {
my $line = shift;
if ($line =~m/^(\S+)\s+(\S+)\s+(\S+)$/) {
- my ($pool, $size_str, $free_str) = ($1, $2, $3);
+ my ($pool, $size_str, $used_str) = ($1, $2, $3);
my $size = PVE::Storage::ZFSPoolPlugin::zfs_parse_size($size_str);
- my $free = PVE::Storage::ZFSPoolPlugin::zfs_parse_size($free_str);
- push @$res, { pool => $pool, size => $size, free => $free };
+ my $used = PVE::Storage::ZFSPoolPlugin::zfs_parse_size($used_str);
+ # ignore subvolumes generated by our ZFSPoolPlugin
+ return if $pool =~ m!/subvol-\d+-[^/]+$!;
+ push @$res, { pool => $pool, size => $size, free => $size-$used };
}
});
sub resolv_portal {
my ($portal, $noerr) = @_;
- if ($portal =~ m/^([^:]+)(:(\d+))?$/) {
- my $server = $1;
- my $port = $3;
-
+ my ($server, $port) = PVE::Tools::parse_host_and_port($portal);
+ if ($server) {
if (my $ip = resolv_server($server)) {
$server = $ip;
+ $server = "[$server]" if $server =~ /^$IPV6RE$/;
return $port ? "$server:$port" : $server;
}
}