]> git.proxmox.com Git - pve-storage.git/blobdiff - PVE/Storage.pm
improve bash completions
[pve-storage.git] / PVE / Storage.pm
index 23780d0891e099911f07dfbf86d960fa705ec1bb..3637de205bede0fad45b4423b0e3de9ddd985765 100755 (executable)
@@ -12,7 +12,7 @@ use File::Path;
 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;
@@ -831,7 +831,7 @@ sub deactivate_storage {
 }
 
 sub activate_volumes {
-    my ($cfg, $vollist, $exclusive) = @_;
+    my ($cfg, $vollist) = @_;
 
     return if !($vollist && scalar(@$vollist));
 
@@ -849,7 +849,7 @@ sub activate_volumes {
        my ($storeid, $volname) = parse_volume_id($volid);
        my $scfg = storage_config($cfg, $storeid);
        my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
-       $plugin->activate_volume($storeid, $scfg, $volname, $exclusive, $cache);
+       $plugin->activate_volume($storeid, $scfg, $volname, $cache);
     }
 }
 
@@ -986,17 +986,19 @@ sub scan_nfs {
 
 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 };
        }
     });
 
@@ -1006,12 +1008,11 @@ sub scan_zfs {
 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;
        }
     }
@@ -1166,4 +1167,25 @@ sub foreach_volid {
     }
 }
 
+# bash completion helper
+
+sub complete_storage {
+   my ($cmdname, $pname, $cvalue) = @_;
+
+   return  $cmdname eq 'add' ? [] : [ PVE::Storage::storage_ids() ];
+}
+
+sub complete_storage_enabled {
+   my ($cmdname, $pname, $cvalue) = @_;
+
+   my $res = [];
+
+   my $cfg = PVE::Storage::config();
+   foreach my $sid (keys %{$cfg->{ids}}) {
+       next if !storage_check_enabled($cfg, $sid, undef, 1);
+       push @$res, $sid;
+   }
+   return $res;
+}
+
 1;