This is modelled after the way read_password() is used to
wrap -password parameters on the command line. If a mapping
for a certain API method and parameter is defined in the
sub class of CLIHandler.pm, the parameter is interpreted as
a file path on the command line and the parameter is
filled with the string contents of the referenced file.
This allows us to use the same API schema once in API2, but
overwrite the behaviour for individual parameters in the CLI
tools when desired.
- my ($def, $cmdname, $cmd, $args, $pwcallback, $podfn, $preparefunc) = @_;
+ my ($def, $cmdname, $cmd, $args, $pwcallback, $podfn, $preparefunc, $stringfilemap) = @_;
$cmddef = $def;
$exename = $cmdname;
$cmddef = $def;
$exename = $cmdname;
}
my $prefix = "$exename $cmd";
}
my $prefix = "$exename $cmd";
- my $res = $class->cli_handler($prefix, $name, \@ARGV, $arg_param, $uri_param, $pwcallback);
+ my $res = $class->cli_handler($prefix, $name, \@ARGV, $arg_param, $uri_param, $pwcallback, $stringfilemap);
&$outsub($res) if $outsub;
};
my $handle_simple_cmd = sub {
&$outsub($res) if $outsub;
};
my $handle_simple_cmd = sub {
- my ($def, $args, $pwcallback, $podfn, $preparefunc) = @_;
+ my ($def, $args, $pwcallback, $podfn, $preparefunc, $stringfilemap) = @_;
my ($class, $name, $arg_param, $uri_param, $outsub) = @{$def};
die "no class specified" if !$class;
my ($class, $name, $arg_param, $uri_param, $outsub) = @{$def};
die "no class specified" if !$class;
&$preparefunc() if $preparefunc;
&$preparefunc() if $preparefunc;
- my $res = $class->cli_handler($name, $name, \@ARGV, $arg_param, $uri_param, $pwcallback);
+ my $res = $class->cli_handler($name, $name, \@ARGV, $arg_param, $uri_param, $pwcallback, $stringfilemap);
&$outsub($res) if $outsub;
};
&$outsub($res) if $outsub;
};
my $no_init = $params{no_init};
my $pwcallback = $class->can('read_password');
my $no_init = $params{no_init};
my $pwcallback = $class->can('read_password');
+ my $stringfilemap = $class->can('string_param_file_mapping');
$exename = &$get_exe_name($class);
$exename = &$get_exe_name($class);
my $def = ${"${class}::cmddef"};
if (ref($def) eq 'ARRAY') {
my $def = ${"${class}::cmddef"};
if (ref($def) eq 'ARRAY') {
- &$handle_simple_cmd($def, \@ARGV, $pwcallback, $podfn, $preparefunc);
+ &$handle_simple_cmd($def, \@ARGV, $pwcallback, $podfn, $preparefunc, $stringfilemap);
} else {
$cmddef = $def;
my $cmd = shift @ARGV;
} else {
$cmddef = $def;
my $cmd = shift @ARGV;
- &$handle_cmd($cmddef, $exename, $cmd, \@ARGV, $pwcallback, $podfn, $preparefunc);
+ &$handle_cmd($cmddef, $exename, $cmd, \@ARGV, $pwcallback, $podfn, $preparefunc, $stringfilemap);
+my $replace_file_names_with_contents = sub {
+ my ($param, $mapping) = @_;
+
+ if ($mapping) {
+ foreach my $elem ( @$mapping ) {
+ $param->{$elem} = PVE::Tools::file_get_contents($param->{$elem})
+ if defined($param->{$elem});
+ }
+ }
+
+ return $param;
+};
+
- my ($self, $prefix, $name, $args, $arg_param, $fixed_param, $pwcallback) = @_;
+ my ($self, $prefix, $name, $args, $arg_param, $fixed_param, $pwcallback, $stringfilemap) = @_;
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);
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);
$res = $self->handle($info, $param);
};
if (my $err = $@) {
$res = $self->handle($info, $param);
};
if (my $err = $@) {