X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=src%2FPVE%2FJSONSchema.pm;h=9c261841f4043203728d9d4a4035115b61d7ee01;hb=4d9f4d62e416b0080ccd223c553a967e051d4bab;hp=9c624f694c6f423ee643ef025620c369b713f5bb;hpb=24197a9f6c698985b7255fbf7792b0b6bd8188b5;p=pve-common.git diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm index 9c624f6..9c26184 100644 --- a/src/PVE/JSONSchema.pm +++ b/src/PVE/JSONSchema.pm @@ -508,6 +508,13 @@ sub format_size { return "${tb}T"; }; +sub parse_boolean { + my ($bool) = @_; + return 1 if $bool =~ m/^(1|on|yes|true)$/i; + return 0 if $bool =~ m/^(0|off|no|false)$/i; + return undef; +} + sub parse_property_string { my ($format, $data, $path, $additional_properties) = @_; @@ -546,8 +553,7 @@ sub parse_property_string { die "invalid key in comma-separated list property: $k\n" if !$schema; if ($schema->{type} && $schema->{type} eq 'boolean') { - $v = 1 if $v =~ m/^(1|on|yes|true)$/i; - $v = 0 if $v =~ m/^(0|off|no|false)$/i; + $v = parse_boolean($v) // $v; } $res->{$k} = $v; } elsif ($part !~ /=/) { @@ -1148,11 +1154,21 @@ my $method_schema = { description => "Method needs special privileges - only pvedaemon can execute it", optional => 1, }, + download => { + type => 'boolean', + description => "Method downloads the file content (filename is the return value of the method).", + optional => 1, + }, proxyto => { type => 'string', description => "A parameter name. If specified, all calls to this method are proxied to the host contained in that parameter.", optional => 1, }, + proxyto_callback => { + type => 'coderef', + description => "A function which is called to resolve the proxyto attribute. The default implementaion returns the value of the 'proxyto' parameter.", + optional => 1, + }, permissions => { type => 'object', description => "Required access permissions. By default only 'root' is allowed to access this method.", @@ -1351,8 +1367,21 @@ sub get_options { } } + # decode after Getopt as we are not sure how well it handles unicode foreach my $p (keys %$opts) { - $opts->{$p} = decode('locale', $opts->{$p}); + if (!ref($opts->{$p})) { + $opts->{$p} = decode('locale', $opts->{$p}); + } elsif (ref($opts->{$p}) eq 'ARRAY') { + my $tmp = []; + foreach my $v (@{$opts->{$p}}) { + push @$tmp, decode('locale', $v); + } + $opts->{$p} = $tmp; + } elsif (ref($opts->{$p}) eq 'SCALAR') { + $opts->{$p} = decode('locale', $$opts->{$p}); + } else { + raise("decoding options failed, unknown reference\n", code => HTTP_BAD_REQUEST); + } } foreach my $p (keys %$opts) { @@ -1360,10 +1389,8 @@ sub get_options { if ($pd->{type} eq 'boolean') { if ($opts->{$p} eq '') { $opts->{$p} = 1; - } elsif ($opts->{$p} =~ m/^(1|true|yes|on)$/i) { - $opts->{$p} = 1; - } elsif ($opts->{$p} =~ m/^(0|false|no|off)$/i) { - $opts->{$p} = 0; + } elsif (defined(my $bool = parse_boolean($opts->{$p}))) { + $opts->{$p} = $bool; } else { raise("unable to parse boolean option\n", code => HTTP_BAD_REQUEST); } @@ -1416,8 +1443,7 @@ sub parse_config { if ($schema->{properties}->{$key} && $schema->{properties}->{$key}->{type} eq 'boolean') { - $value = 1 if $value =~ m/^(1|on|yes|true)$/i; - $value = 0 if $value =~ m/^(0|off|no|false)$/i; + $value = parse_boolean($value) // $value; } $cfg->{$key} = $value; } else {