]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/JSONSchema.pm
cli: more generic interactive parameter definition
[pve-common.git] / src / PVE / JSONSchema.pm
index 9861a8f380d0a07296986026ccc0d45621786025..0e722b81b0812c104a80eef3e526dec746884baa 100644 (file)
@@ -1333,7 +1333,7 @@ sub method_get_child_link {
 # a way to parse command line parameters, using a 
 # schema to configure Getopt::Long
 sub get_options {
-    my ($schema, $args, $arg_param, $fixed_param, $pwcallback) = @_;
+    my ($schema, $args, $arg_param, $fixed_param, $pwcallback, $param_mapping_hash) = @_;
 
     if (!$schema || !$schema->{properties}) {
        raise("too many arguments\n", code => HTTP_BAD_REQUEST)
@@ -1349,13 +1349,20 @@ sub get_options {
        $list_param = $arg_param;
     }
 
+    my @interactive = ();
     my @getopt = ();
     foreach my $prop (keys %{$schema->{properties}}) {
        my $pd = $schema->{properties}->{$prop};
        next if $list_param && $prop eq $list_param;
        next if defined($fixed_param->{$prop});
 
-       if ($prop eq 'password' && $pwcallback) {
+       my $mapping = $param_mapping_hash->{$prop};
+       if ($mapping && $mapping->{interactive}) {
+           # interactive parameters such as passwords: make the argument
+           # optional and call the mapping function afterwards.
+           push @getopt, "$prop:s";
+           push @interactive, [$prop, $mapping->{func}];
+       } elsif ($prop eq 'password' && $pwcallback) {
            # we do not accept plain password on input line, instead
            # we turn this into a boolean option and ask for password below
            # using $pwcallback() (for security reasons).
@@ -1409,6 +1416,15 @@ sub get_options {
        }
     }
 
+    foreach my $entry (@interactive) {
+       my ($opt, $func) = @$entry;
+       my $pd = $schema->{properties}->{$opt};
+       my $value = $opts->{$opt};
+       if (defined($value) || !$pd->{optional}) {
+           $opts->{$opt} = $func->($value);
+       }
+    }
+
     # decode after Getopt as we are not sure how well it handles unicode
     foreach my $p (keys %$opts) {
        if (!ref($opts->{$p})) {