X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=src%2FPVE%2FJSONSchema.pm;h=47aa2780ca9e356f382babfdf1ad10975c7261f0;hp=d9d254af6e886df4168eed6113c28e1d63d4d8c3;hb=1068aeb3988b7ef080bd812bb1fa330c27e1b9f7;hpb=3c4d612a70d9521345a54f520f183c8551ff3ad4;ds=sidebyside diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm index d9d254a..47aa278 100644 --- a/src/PVE/JSONSchema.pm +++ b/src/PVE/JSONSchema.pm @@ -42,7 +42,7 @@ sub get_standard_option { my $res = $base || {}; foreach my $opt (keys %$std) { - next if $res->{$opt}; + next if defined($res->{$opt}); $res->{$opt} = $std->{$opt}; } @@ -83,6 +83,13 @@ PVE::JSONSchema::register_standard_option('pve-config-digest', { maxLength => 40, # sha1 hex digest lenght is 40 }); +PVE::JSONSchema::register_standard_option('extra-args', { + description => "Extra arguments as array", + type => 'array', + items => { type => 'string' }, + optional => 1 +}); + my $format_list = {}; sub register_format { @@ -810,6 +817,11 @@ my $default_schema_noref = { optional => 1, description => "This indicates the default for the instance property." }, + completion => { + type => 'coderef', + description => "Bash completion function. This function should return a list of possible values.", + optional => 1, + }, disallow => { type => "object", optional => 1, @@ -1070,20 +1082,30 @@ sub get_options { } } + Getopt::Long::Configure('prefix_pattern=(--|-)'); + my $opts = {}; raise("unable to parse option\n", code => HTTP_BAD_REQUEST) if !Getopt::Long::GetOptionsFromArray($args, $opts, @getopt); - if (my $acount = scalar(@$args)) { + if (@$args) { if ($list_param) { $opts->{$list_param} = $args; $args = []; } elsif (ref($arg_param)) { - raise("wrong number of arguments\n", code => HTTP_BAD_REQUEST) - if scalar(@$arg_param) != $acount; - foreach my $p (@$arg_param) { - $opts->{$p} = shift @$args; + foreach my $arg_name (@$arg_param) { + if ($opts->{'extra-args'}) { + raise("internal error: extra-args must be the last argument\n", code => HTTP_BAD_REQUEST); + } + if ($arg_name eq 'extra-args') { + $opts->{'extra-args'} = $args; + $args = []; + next; + } + raise("not enough arguments\n", code => HTTP_BAD_REQUEST) if !@$args; + $opts->{$arg_name} = shift @$args; } + raise("too many arguments\n", code => HTTP_BAD_REQUEST) if @$args; } else { raise("too many arguments\n", code => HTTP_BAD_REQUEST) if scalar(@$args) != 0;