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);
}
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;
}
}