Signed-off-by: Wolfgang Bumiller <[email protected]>
---
Used in the cloud-init patch set.

 src/PVE/CLIHandler.pm  | 14 ++++++++------
 src/PVE/RESTHandler.pm | 38 ++++++++++++++++++++++++--------------
 2 files changed, 32 insertions(+), 20 deletions(-)

diff --git a/src/PVE/CLIHandler.pm b/src/PVE/CLIHandler.pm
index 45c0427..37b5021 100644
--- a/src/PVE/CLIHandler.pm
+++ b/src/PVE/CLIHandler.pm
@@ -118,7 +118,8 @@ sub generate_usage_str {
     $indent //= '';
 
     my $can_read_pass = $cli_handler_class->can('read_password');
-    my $can_str_param_fmap = 
$cli_handler_class->can('string_param_file_mapping');
+    my $can_map_params = $cli_handler_class->can('param_mapping') ||
+                        $cli_handler_class->can('string_param_file_mapping');
 
     my ($subcmd, $def) = resolve_cmd($cmd);
 
@@ -138,7 +139,7 @@ sub generate_usage_str {
                    $str .= $indent;
                    $str .= $class->usage_str($name, "$prefix $cmd", $arg_param,
                                              $fixed_param, $format,
-                                             $can_read_pass, 
$can_str_param_fmap);
+                                             $can_read_pass, $can_map_params);
                    $oldclass = $class;
 
                } elsif (defined($def->{$cmd}->{alias}) && ($format eq 
'asciidoc')) {
@@ -162,7 +163,7 @@ sub generate_usage_str {
 
            $str .= $indent;
            $str .= $class->usage_str($name, $prefix, $arg_param, $fixed_param, 
$format,
-                                     $can_read_pass, $can_str_param_fmap);
+                                     $can_read_pass, $can_map_params);
        }
        return $str;
     };
@@ -546,7 +547,8 @@ sub run_cli_handler {
     my $preparefunc = $params{prepare};
 
     my $pwcallback = $class->can('read_password');
-    my $stringfilemap = $class->can('string_param_file_mapping');
+    my $param_mapping = $cli_handler_class->can('param_mapping') ||
+                       $cli_handler_class->can('string_param_file_mapping');
 
     $exename = &$get_exe_name($class);
 
@@ -556,9 +558,9 @@ sub run_cli_handler {
     $cmddef = ${"${class}::cmddef"};
 
     if (ref($cmddef) eq 'ARRAY') {
-       &$handle_simple_cmd(\@ARGV, $pwcallback, $preparefunc, $stringfilemap);
+       &$handle_simple_cmd(\@ARGV, $pwcallback, $preparefunc, $param_mapping);
     } else {
-       &$handle_cmd(\@ARGV, $pwcallback, $preparefunc, $stringfilemap);
+       &$handle_cmd(\@ARGV, $pwcallback, $preparefunc, $param_mapping);
     }
 
     exit 0;
diff --git a/src/PVE/RESTHandler.pm b/src/PVE/RESTHandler.pm
index 5c1d419..cd2ee28 100644
--- a/src/PVE/RESTHandler.pm
+++ b/src/PVE/RESTHandler.pm
@@ -394,7 +394,7 @@ sub handle {
 # $format: 'asciidoc', 'short', 'long' or 'full'
 # $style: 'config', 'config-sub', 'arg' or 'fixed'
 my $get_property_description = sub {
-    my ($name, $style, $phash, $format, $hidepw, $fileparams) = @_;
+    my ($name, $style, $phash, $format, $hidepw, $mapped_params) = @_;
 
     my $res = '';
 
@@ -415,10 +415,15 @@ my $get_property_description = sub {
        $type_text = '';
     }
 
-    if ($fileparams && $phash->{type} eq 'string') {
-       foreach my $elem (@$fileparams) {
+    if ($mapped_params && $phash->{type} eq 'string') {
+       foreach my $elem (@$mapped_params) {
+           my $desc;
+           if (ref($elem) eq 'ARRAY') {
+               ($elem, undef, $desc) = @$elem;
+           }
+           $desc //= '<filepath>';
            if ($name eq $elem) {
-               $type_text = '<filepath>';
+               $type_text = $desc;
                last;
            }
        }
@@ -513,9 +518,9 @@ my $get_property_description = sub {
 #   '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)
-# $stringfilemap ... mapping for string parameters to file path parameters
+# $param_xform_map ... mapping for string parameters to file path parameters
 sub usage_str {
-    my ($self, $name, $prefix, $arg_param, $fixed_param, $format, $hidepw, 
$stringfilemap) = @_;
+    my ($self, $name, $prefix, $arg_param, $fixed_param, $format, $hidepw, 
$param_xform_map) = @_;
 
     $format = 'long' if !$format;
 
@@ -572,7 +577,7 @@ sub usage_str {
            }
        }
 
-       my $mapping = defined($stringfilemap) ? &$stringfilemap($name) : undef;
+       my $mapping = defined($param_xform_map) ? &$param_xform_map($name) : 
undef;
        $opts .= &$get_property_description($base, 'arg', $prop->{$k}, $format,
                                            $hidepw, $mapping);
 
@@ -657,13 +662,18 @@ sub dump_properties {
     return $raw;
 }
 
-my $replace_file_names_with_contents = sub {
+my $replace_mapped_contents = sub {
     my ($param, $mapping) = @_;
 
     if ($mapping) {
        foreach my $elem ( @$mapping ) {
-           $param->{$elem} = PVE::Tools::file_get_contents($param->{$elem})
-               if defined($param->{$elem});
+           my $mapfunc = sub { return PVE::Tools::file_get_contents($_[0]) };
+           if (ref($elem) eq 'ARRAY') {
+               ($elem, $mapfunc) = @$elem;
+           }
+           if (defined(my $value = $param->{$elem})) {
+               $param->{$elem} = $mapfunc->($value);
+           }
        }
     }
 
@@ -671,15 +681,15 @@ my $replace_file_names_with_contents = sub {
 };
 
 sub cli_handler {
-    my ($self, $prefix, $name, $args, $arg_param, $fixed_param, $pwcallback, 
$stringfilemap) = @_;
+    my ($self, $prefix, $name, $args, $arg_param, $fixed_param, $pwcallback, 
$param_xform_map) = @_;
 
     my $info = $self->map_method_by_name($name);
 
     my $res;
     eval {
        my $param = PVE::JSONSchema::get_options($info->{parameters}, $args, 
$arg_param, $fixed_param, $pwcallback);
-       &$replace_file_names_with_contents($param, &$stringfilemap($name))
-           if defined($stringfilemap);
+       &$replace_mapped_contents($param, &$param_xform_map($name))
+           if defined($param_xform_map);
        $res = $self->handle($info, $param);
     };
     if (my $err = $@) {
@@ -687,7 +697,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', $pwcallback, $stringfilemap);
+       $err->{usage} = $self->usage_str($name, $prefix, $arg_param, 
$fixed_param, 'short', $pwcallback, $param_xform_map);
 
        die $err;
     }
-- 
2.11.0


_______________________________________________
pve-devel mailing list
[email protected]
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to