[pve-devel] [PATCH v2 pve-common] added 'extra-args' CLI handling
Wolfgang Bumiller
w.bumiller at proxmox.com
Tue Sep 1 09:16:13 CEST 2015
added 'extra-args' standard option
added 'extra-args' handling to PVE::JSONSchema::get_options
untainting 'extra-args' separately in RESTHandler::handle
---
src/PVE/JSONSchema.pm | 19 ++++++++++++++++---
src/PVE/RESTHandler.pm | 2 ++
2 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm
index 2837cf5..e1e8e5b 100644
--- a/src/PVE/JSONSchema.pm
+++ b/src/PVE/JSONSchema.pm
@@ -83,6 +83,13 @@ PVE::JSONSchema::register_standard_option('pve-config-digest', {
maxLength => 40, # sha1 hex digest lenght is 40
});
+PVE::JSONSchema::register_standard_option('extra-args', {
+ description => "Extra arguments as array",
+ type => 'array',
+ items => { type => 'string' },
+ optional => 1
+});
+
my $format_list = {};
sub register_format {
@@ -1074,16 +1081,22 @@ sub get_options {
raise("unable to parse option\n", code => HTTP_BAD_REQUEST)
if !Getopt::Long::GetOptionsFromArray($args, $opts, @getopt);
- if (my $acount = scalar(@$args)) {
+ if (@$args) {
if ($list_param) {
$opts->{$list_param} = $args;
$args = [];
} elsif (ref($arg_param)) {
- raise("wrong number of arguments\n", code => HTTP_BAD_REQUEST)
- if scalar(@$arg_param) != $acount;
foreach my $p (@$arg_param) {
+ if ($p eq 'extra-args') {
+ die 'internal error: extra-args must be the last argument' if $opts->{'extra_args'};
+ $opts->{'extra-args'} = $args;
+ $args = [];
+ next;
+ }
+ raise("not enough arguments\n", code => HTTP_BAD_REQUEST) if !@$args;
$opts->{$p} = shift @$args;
}
+ raise("too many arguments\n", code => HTTP_BAD_REQUEST) if @$args;
} else {
raise("too many arguments\n", code => HTTP_BAD_REQUEST)
if scalar(@$args) != 0;
diff --git a/src/PVE/RESTHandler.pm b/src/PVE/RESTHandler.pm
index ae0a695..87a2c18 100644
--- a/src/PVE/RESTHandler.pm
+++ b/src/PVE/RESTHandler.pm
@@ -386,9 +386,11 @@ sub handle {
# warn "validate ". Dumper($param}) . "\n" . Dumper($schema);
PVE::JSONSchema::validate($param, $schema);
# untaint data (already validated)
+ my $extra = delete $param->{'extra-args'};
while (my ($key, $val) = each %$param) {
($param->{$key}) = $val =~ /^(.*)$/s;
}
+ $param->{'extra-args'} = [map { /^(.*)$/ } @$extra] if $extra;
}
my $result = &$func($param);
--
2.1.4
More information about the pve-devel
mailing list