X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=src%2FPVE%2FRESTHandler.pm;h=fc220a6018481d48bc2ab75b8aa39eb3728964b2;hb=534d42709838dce93d7e4258cf84dcb816125c40;hp=6799fde7668e4c2a38b78c883187e877c012fc46;hpb=b0e5e9fa0c6a7a633a2630a9eaf9c33addb26be8;p=pve-common.git diff --git a/src/PVE/RESTHandler.pm b/src/PVE/RESTHandler.pm index 6799fde..fc220a6 100644 --- a/src/PVE/RESTHandler.pm +++ b/src/PVE/RESTHandler.pm @@ -6,7 +6,6 @@ use warnings; use PVE::SafeSyslog; use PVE::Exception qw(raise raise_param_exc); use PVE::JSONSchema; -use PVE::PodParser; use HTTP::Status qw(:constants :is status_message); use Text::Wrap; use Clone qw(clone); @@ -34,13 +33,23 @@ sub api_clone_schema { foreach my $p (keys %$d) { my $pd = $d->{$p}; if ($p =~ m/^([a-z]+)(\d+)$/) { - if ($2 == 0) { - $p = "$1\[n\]"; - } else { - next; + my ($name, $idx) = ($1, $2); + if ($idx == 0) { + $p = "${name}[n]"; + } elsif (defined($d->{"${name}0"})) { + next; # only handle once for -xx0, but only if -xx0 exists + } + } + my $tmp = ref($pd) ? clone($pd) : $pd; + # NOTE: add typetext property for more complex types, to + # make the web api viewer code simpler + if (!(defined($tmp->{enum}) || defined($tmp->{pattern}))) { + my $typetext = PVE::JSONSchema::schema_get_type_text($tmp); + if ($tmp->{type} && ($tmp->{type} ne $typetext)) { + $tmp->{typetext} = $typetext; } } - $res->{$k}->{$p} = ref($pd) ? clone($pd) : $pd; + $res->{$k}->{$p} = $tmp; } } @@ -418,9 +427,14 @@ my $get_property_description = sub { my $descr = $phash->{description} || "no description available"; + if ($phash->{verbose_description} && + ($style eq 'config' || $style eq 'config-sub')) { + $descr = $phash->{verbose_description}; + } + chomp $descr; - my $type = PVE::PodParser::schema_get_type_text($phash); + my $type = PVE::JSONSchema::schema_get_type_text($phash); if ($hidepw && $name eq 'password') { $type = ''; @@ -439,6 +453,8 @@ my $get_property_description = sub { if ($style eq 'config') { $res .= "`$name`: "; + } elsif ($style eq 'config-sub') { + $res .= "`$name`="; } elsif ($style eq 'arg') { $res .= "`-$name` "; } elsif ($style eq 'fixed') { @@ -452,9 +468,14 @@ my $get_property_description = sub { if (defined(my $dv = $phash->{default})) { $res .= "(default=`$dv`)"; } - $res .= "::\n\n"; - my $wdescr = Text::Wrap::wrap('', '', ($descr)); + if ($style eq 'config-sub') { + $res .= ";;\n\n"; + } else { + $res .= "::\n\n"; + } + + my $wdescr = $descr; chomp $wdescr; $wdescr =~ s/^$/+/mg; @@ -568,10 +589,12 @@ sub usage_str { my $base = $k; if ($k =~ m/^([a-z]+)(\d+)$/) { - my $name = $1; + my ($name, $idx) = ($1, $2); next if $idx_param->{$name}; - $idx_param->{$name} = 1; - $base = "${name}[n]"; + if ($idx == 0) { + $idx_param->{$name} = 1; + $base = "${name}[n]"; + } } my $mapping = defined($stringfilemap) ? &$stringfilemap($name) : undef; @@ -627,18 +650,33 @@ sub dump_properties { my $phash = $prop->{$k}; next if defined($filterFn) && &$filterFn($k, $phash); - - my $type = $phash->{type} || 'string'; + next if $phash->{alias}; my $base = $k; if ($k =~ m/^([a-z]+)(\d+)$/) { - my $name = $1; + my ($name, $idx) = ($1, $2); next if $idx_param->{$name}; - $idx_param->{$name} = 1; - $base = "${name}[n]"; + if ($idx == 0) { + $idx_param->{$name} = 1; + $base = "${name}[n]"; + } } $raw .= &$get_property_description($base, $style, $phash, $format, 0); + + next if $style ne 'config'; + + my $prop_fmt = $phash->{format}; + next if !$prop_fmt; + + if (ref($prop_fmt) ne 'HASH') { + $prop_fmt = PVE::JSONSchema::get_format($prop_fmt); + } + + next if !(ref($prop_fmt) && (ref($prop_fmt) eq 'HASH')); + + $raw .= dump_properties($prop_fmt, $format, 'config-sub') + } return $raw;