$data->{$k} = ref($d) ? clone($d) : $d;
}
}
- }
+ }
$res->{info}->{$info->{method}} = $data;
};
}
$errprefix = "register method ${self}/$info->{path} -";
$info->{method} = 'GET' if !$info->{method};
$method = $info->{method};
+
+ # apply default value
+ $info->{allowtoken} = 1 if !defined($info->{allowtoken});
}
$method_path_lookup->{$self} = {} if !defined($method_path_lookup->{$self});
my $path_lookup = $method_path_lookup->{$self};
die "$errprefix no path" if !defined($info->{path});
-
+
foreach my $comp (split(/\/+/, $info->{path})) {
die "$errprefix path compoment has zero length\n" if $comp eq '';
my ($name, $regex);
}
if ($regex) {
- $path_lookup->{regex} = {} if !defined($path_lookup->{regex});
+ $path_lookup->{regex} = {} if !defined($path_lookup->{regex});
my $old_name = $path_lookup->{regex}->{match_name};
die "$errprefix found changed regex match name\n"
if defined($old_re) && ($old_re ne $regex);
$path_lookup->{regex}->{match_name} = $name;
$path_lookup->{regex}->{match_re} = $regex;
-
+
die "$errprefix path match error - regex and fixed items\n"
if defined($path_lookup->{folders});
$path_lookup = $path_lookup->{regex};
-
+
} else {
- $path_lookup->{folders}->{$name} = {} if !defined($path_lookup->{folders}->{$name});
+ $path_lookup->{folders}->{$name} = {} if !defined($path_lookup->{folders}->{$name});
die "$errprefix path match error - regex and fixed items\n"
if defined($path_lookup->{regex});
}
}
- die "$errprefix duplicate method definition\n"
+ die "$errprefix duplicate method definition\n"
if defined($path_lookup->{$method});
if ($method eq 'SUBCLASS') {
my ($this) = @_;
# also see "man perldiag"
-
+
my $sub = $AUTOLOAD;
(my $method = $sub) =~ s/.*:://;
} else {
die "internal error";
}
-
+
return undef if !$path_lookup;
if (my $info = $path_lookup->{SUBCLASS}) {
if (defined($fd)) {
# we only support the empty string '' (match whole URI)
- die "unsupported fragmentDelimiter '$fd'"
+ die "unsupported fragmentDelimiter '$fd'"
if $fd ne '';
$stack = [ join ('/', @$stack) ] if scalar(@$stack) > 1;
# untaint data (already validated)
my $extra = delete $param->{'extra-args'};
while (my ($key, $val) = each %$param) {
- ($param->{$key}) = $val =~ /^(.*)$/s;
+ if (defined($val)) {
+ ($param->{$key}) = $val =~ /^(.*)$/s;
+ } else {
+ $param->{$key} = undef;
+ }
}
$param->{'extra-args'} = [map { /^(.*)$/ } @$extra] if $extra;
}
die "unknown style '$style'";
}
- my $tmp = sprintf " %-10s %s$defaulttxt\n", $display_name, "$type_text";
+ my $tmp = sprintf " %-10s %s%s\n", $display_name, "$type_text", "$defaulttxt";
my $indend = " ";
$res .= Text::Wrap::wrap('', $indend, ($tmp));
#
# $info ... method info
# $prefix ... usually something like "$exename $cmd" ('pvesm add')
-# $arg_param ... list of parameters we want to get as ordered arguments
+# $arg_param ... list of parameters we want to get as ordered arguments
# on the command line (or single parameter name for lists)
# $fixed_param ... do not generate and info about those parameters
# $format:
my $schema = $info->{parameters};
my $name = $info->{name};
- my $prop = { %{$schema->{properties}} }; # copy
+ my $prop = {};
+ if ($schema->{properties}) {
+ $prop = { %{$schema->{properties}} }; # copy
+ }
my $has_output_format_option = $formatter_properties->{'output-format'} ? 1 : 0;
$args .= " " if $args;
$args .= "--$base <$type_text>"
}
- }
+ }
if ($format eq 'asciidoc') {
$out .= "*${prefix}*";
my $raw = '';
$style //= 'config';
-
+
my $idx_param = {}; # -vlan\d+ -scsi\d+
foreach my $k (sort keys %$prop) {
next if !(ref($prop_fmt) && (ref($prop_fmt) eq 'HASH'));
$raw .= dump_properties($prop_fmt, $format, 'config-sub')
-
+
}
return $raw;
my $ec = ref($err);
die $err if !$ec || $ec ne "PVE::Exception" || !$err->is_param_exc();
-
+
$err->{usage} = $self->usage_str($name, $prefix, $arg_param, $fixed_param, 'short', $param_cb, $formatter_properties);
die $err;