X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=src%2FPVE%2FJSONSchema.pm;h=f014dc3f15b5c73dbadb05f865d435f70e749916;hb=ff2bf45fab80f839a307d07a5ffa57a47b65b1aa;hp=9861a8f380d0a07296986026ccc0d45621786025;hpb=2d167ad0d47d50df5e14ce6af942196840655e97;p=pve-common.git diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm index 9861a8f..f014dc3 100644 --- a/src/PVE/JSONSchema.pm +++ b/src/PVE/JSONSchema.pm @@ -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). @@ -1399,6 +1406,16 @@ sub get_options { raise("too many arguments\n", code => HTTP_BAD_REQUEST) if scalar(@$args) != 0; } + } else { + if (ref($arg_param)) { + foreach my $arg_name (@$arg_param) { + if ($arg_name eq 'extra-args') { + $opts->{'extra-args'} = []; + } else { + raise("not enough arguments\n", code => HTTP_BAD_REQUEST); + } + } + } } if (my $pd = $schema->{properties}->{password}) { @@ -1409,6 +1426,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})) {