]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/RESTHandler.pm
fix #1819: fork_worker: ensure sync'ed workers control terminal
[pve-common.git] / src / PVE / RESTHandler.pm
index 61dee20072090ac1f0aaf7f30eeb2ff2543b6282..c303c389e4da1273122786a2e9274ccd00c4a0d6 100644 (file)
@@ -432,7 +432,7 @@ sub handle {
 # $style: 'config', 'config-sub', 'arg' or 'fixed'
 # $mapdef: parameter mapping ({ desc => XXX, func => sub {...} })
 my $get_property_description = sub {
-    my ($name, $style, $phash, $format, $hidepw, $mapdef) = @_;
+    my ($name, $style, $phash, $format, $mapdef) = @_;
 
     my $res = '';
 
@@ -449,10 +449,6 @@ my $get_property_description = sub {
 
     my $type_text = PVE::JSONSchema::schema_get_type_text($phash, $style);
 
-    if ($hidepw && $name eq 'password') {
-       $type_text = '';
-    }
-
     if ($mapdef && $phash->{type} eq 'string') {
        $type_text = $mapdef->{desc};
     }
@@ -580,10 +576,9 @@ my $compute_param_mapping_hash = sub {
 #   'short'    ... command line only (text, one line)
 #   'full'     ... text, include description
 #   'asciidoc' ... generate asciidoc for man pages (like 'full')
-# $hidepw      ... hide password option (use this if you provide a read passwork callback)
-# $param_mapping_func ... mapping for string parameters to file path parameters
+# $param_cb ... mapping for string parameters to file path parameters
 sub usage_str {
-    my ($self, $name, $prefix, $arg_param, $fixed_param, $format, $hidepw, $param_mapping_func) = @_;
+    my ($self, $name, $prefix, $arg_param, $fixed_param, $format, $param_cb) = @_;
 
     $format = 'long' if !$format;
 
@@ -616,7 +611,7 @@ sub usage_str {
     foreach my $k (@$arg_param) {
        next if defined($fixed_param->{$k}); # just to be sure
        next if !$prop->{$k}; # just to be sure
-       $argdescr .= &$get_property_description($k, 'fixed', $prop->{$k}, $format, 0);
+       $argdescr .= $get_property_description->($k, 'fixed', $prop->{$k}, $format);
     }
 
     my $idx_param = {}; # -vlan\d+ -scsi\d+
@@ -628,7 +623,13 @@ sub usage_str {
 
        my $type_text = $prop->{$k}->{type} || 'string';
 
-       next if $hidepw && ($k eq 'password') && !$prop->{$k}->{optional};
+       my $param_map = {};
+
+       if (defined($param_cb)) {
+           my $mapping = $param_cb->($name);
+           $param_map = $compute_param_mapping_hash->($mapping);
+           next if $k eq 'password' && $param_map->{$k} && !$prop->{$k}->{optional};
+       }
 
        my $base = $k;
        if ($k =~ m/^([a-z]+)(\d+)$/) {
@@ -640,11 +641,8 @@ sub usage_str {
            }
        }
 
-       my $param_mapping_hash = $compute_param_mapping_hash->(&$param_mapping_func($name))
-           if $param_mapping_func;
 
-       $opts .= &$get_property_description($base, 'arg', $prop->{$k}, $format,
-                                           $hidepw, $param_mapping_hash->{$k});
+       $opts .= $get_property_description->($base, 'arg', $prop->{$k}, $format, $param_map->{$k});
 
        if (!$prop->{$k}->{optional}) {
            $args .= " " if $args;
@@ -707,7 +705,7 @@ sub dump_properties {
            }
        }
 
-       $raw .= &$get_property_description($base, $style, $phash, $format, 0);
+       $raw .= $get_property_description->($base, $style, $phash, $format);
 
        next if $style ne 'config';
 
@@ -728,9 +726,9 @@ sub dump_properties {
 }
 
 my $replace_file_names_with_contents = sub {
-    my ($param, $param_mapping_hash) = @_;
+    my ($param, $param_map) = @_;
 
-    while (my ($k, $d) = each %$param_mapping_hash) {
+    while (my ($k, $d) = each %$param_map) {
        next if $d->{interactive}; # handled by the JSONSchema's get_options code
        $param->{$k} = $d->{func}->($param->{$k})
            if defined($param->{$k});
@@ -740,17 +738,18 @@ my $replace_file_names_with_contents = sub {
 };
 
 sub cli_handler {
-    my ($self, $prefix, $name, $args, $arg_param, $fixed_param, $read_password_func, $param_mapping_func) = @_;
+    my ($self, $prefix, $name, $args, $arg_param, $fixed_param, $param_cb) = @_;
 
     my $info = $self->map_method_by_name($name);
 
     my $res;
     eval {
-       my $param_mapping_hash = $compute_param_mapping_hash->($param_mapping_func->($name)) if $param_mapping_func;
-       my $param = PVE::JSONSchema::get_options($info->{parameters}, $args, $arg_param, $fixed_param, $read_password_func, $param_mapping_hash);
+       my $param_map = {};
+       $param_map = $compute_param_mapping_hash->($param_cb->($name)) if $param_cb;
+       my $param = PVE::JSONSchema::get_options($info->{parameters}, $args, $arg_param, $fixed_param, $param_map);
 
-       if (defined($param_mapping_hash)) {
-           &$replace_file_names_with_contents($param, $param_mapping_hash);
+       if (defined($param_map)) {
+           $replace_file_names_with_contents->($param, $param_map);
        }
 
        $res = $self->handle($info, $param);
@@ -760,7 +759,7 @@ sub cli_handler {
 
        die $err if !$ec || $ec ne "PVE::Exception" || !$err->is_param_exc();
        
-       $err->{usage} = $self->usage_str($name, $prefix, $arg_param, $fixed_param, 'short', $read_password_func, $param_mapping_func);
+       $err->{usage} = $self->usage_str($name, $prefix, $arg_param, $fixed_param, 'short',  $param_cb);
 
        die $err;
     }