X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=src%2FPVE%2FJSONSchema.pm;h=0e722b81b0812c104a80eef3e526dec746884baa;hp=9861a8f380d0a07296986026ccc0d45621786025;hb=c7171ff272c9070958c8db1135b9305d6197f307;hpb=3defa1690b966585534135e01f743edae7b8cb41 diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm index 9861a8f..0e722b8 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). @@ -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})) {