[pve-devel] [PATCH] support to execute multiple commands in one request

Stefan Priebe s.priebe at profihost.ag
Fri Dec 6 14:13:49 CET 2013


---
 PVE/API2/Nodes.pm |   54 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
index 4cfcfd2..d349764 100644
--- a/PVE/API2/Nodes.pm
+++ b/PVE/API2/Nodes.pm
@@ -110,6 +110,7 @@ __PACKAGE__->register_method ({
 	my $result = [
 	    { name => 'apt' },
 	    { name => 'version' },
+	    { name => 'execute' },
 	    { name => 'syslog' },
 	    { name => 'bootlog' },
 	    { name => 'status' },
@@ -329,6 +330,59 @@ __PACKAGE__->register_method({
     }});
 
 __PACKAGE__->register_method({
+    name => 'execute',
+    path => 'execute',
+    method => 'GET',
+    permissions => {
+	check => ['perm', '/nodes/{node}', [ 'Sys.Audit' ]],
+    },
+    description => "Execute commands in order",
+    proxyto => 'node',
+    parameters => {
+	additionalProperties => 0,
+	properties => {
+	    node => get_standard_option('pve-node'),
+	    commands => { type => "JSON_STRING" }
+	},
+    },
+    returns => {
+	type => 'array',
+	properties => {
+
+	},
+    },
+    code => sub {
+	my ($param) = @_;
+	my $res = [];
+
+	my $commands = eval {
+		decode_json($param->{commands});
+	};
+	die "commands param did not contain valid JSON: $@" if $@;
+	die "commands is not an array" if ref($commands) ne "ARRAY";
+
+        foreach my $cmd (@$commands) {
+	    die "$cmd is not a valid command" if (ref($cmd) ne "HASH" || !$cmd->{path} || !$cmd->{method});
+
+	    $cmd->{args} //= {};
+
+	    my $path = "nodes/".$param->{node}."/".$cmd->{path};
+	    my ($handler, $info) = PVE::API2->find_handler($cmd->{method}, $path, $cmd->{args});
+	    if (!$handler || !$info) {
+		die "no handler for '$path'\n";
+	    }
+
+	    eval {
+		push(@$res, $handler->handle($info, $cmd->{args}) );
+	    };
+	    push(@$res, $@) if $@;
+	}
+
+	return $res;
+    }});
+
+
+__PACKAGE__->register_method({
     name => 'node_cmd', 
     path => 'status', 
     method => 'POST',
-- 
1.7.10.4



More information about the pve-devel mailing list