[pve-devel] [PATCH v3 pve-common] added 'extra-args' CLI handling

Wolfgang Bumiller w.bumiller at proxmox.com
Tue Sep 1 11:32:30 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  | 25 ++++++++++++++++++++-----
 src/PVE/RESTHandler.pm |  2 ++
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm
index 2837cf5..c925ecb 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,24 @@ 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) {
-		$opts->{$p} = shift @$args;
+	    foreach my $arg_name (@$arg_param) {
+		if ($opts->{'extra-args'}) {
+		    raise("internal error: extra-args must be the last argument\n", code => HTTP_BAD_REQUEST);
+		}
+		if ($arg_name eq 'extra-args') {
+		    $opts->{'extra-args'} = $args;
+		    $args = [];
+		    next;
+		}
+		raise("not enough arguments\n", code => HTTP_BAD_REQUEST) if !@$args;
+		$opts->{$arg_name} = 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