]> git.proxmox.com Git - qemu-server.git/blame - PVE/API2/Qemu/Agent.pm
change some guest agent commands to GET api calls
[qemu-server.git] / PVE / API2 / Qemu / Agent.pm
CommitLineData
b8158701
DC
1package PVE::API2::Qemu::Agent;
2
3use strict;
4use warnings;
5
6use PVE::RESTHandler;
7use PVE::JSONSchema qw(get_standard_option);
8use PVE::QemuServer;
9
10use base qw(PVE::RESTHandler);
11
ea2bceaf
DC
12# list of commands
13# will generate one api endpoint per command
14# needs a 'method' property and optionally a 'perms' property (default VM.Monitor)
15my $guest_agent_commands = {
16 'ping' => {
17 method => 'POST',
18 },
19 'get-time' => {
e6bd703b 20 method => 'GET',
ea2bceaf
DC
21 },
22 'info' => {
e6bd703b 23 method => 'GET',
ea2bceaf
DC
24 },
25 'fsfreeze-status' => {
26 method => 'POST',
27 },
28 'fsfreeze-freeze' => {
29 method => 'POST',
30 },
31 'fsfreeze-thaw' => {
32 method => 'POST',
33 },
34 'fstrim' => {
35 method => 'POST',
36 },
37 'network-get-interfaces' => {
e6bd703b 38 method => 'GET',
ea2bceaf
DC
39 },
40 'get-vcpus' => {
e6bd703b 41 method => 'GET',
ea2bceaf
DC
42 },
43 'get-fsinfo' => {
e6bd703b 44 method => 'GET',
ea2bceaf
DC
45 },
46 'get-memory-blocks' => {
e6bd703b 47 method => 'GET',
ea2bceaf
DC
48 },
49 'get-memory-block-info' => {
e6bd703b 50 method => 'GET',
ea2bceaf
DC
51 },
52 'suspend-hybrid' => {
53 method => 'POST',
54 },
55 'suspend-ram' => {
56 method => 'POST',
57 },
58 'suspend-disk' => {
59 method => 'POST',
60 },
61 'shutdown' => {
62 method => 'POST',
63 },
64};
65
ad1f73b9
DC
66__PACKAGE__->register_method({
67 name => 'index',
68 path => '',
69 proxyto => 'node',
70 method => 'GET',
71 description => "Qemu Agent command index.",
72 permissions => {
73 user => 'all',
74 },
75 parameters => {
76 additionalProperties => 1,
77 properties => {
78 node => get_standard_option('pve-node'),
79 vmid => get_standard_option('pve-vmid', {
80 completion => \&PVE::QemuServer::complete_vmid_running }),
81 },
82 },
83 returns => {
84 type => 'array',
85 items => {
86 type => "object",
87 properties => {},
88 },
89 links => [ { rel => 'child', href => '{name}' } ],
90 description => "Returns the list of Qemu Agent commands",
91 },
92 code => sub {
93 my ($param) = @_;
94
95 my $result = [];
96
97 for my $cmd (sort keys %$guest_agent_commands) {
98 push @$result, { name => $cmd };
99 }
100
101 return $result;
102 }});
103
ea2bceaf
DC
104sub register_command {
105 my ($class, $command, $method, $perm) = @_;
106
107 die "no method given\n" if !$method;
108 die "no command given\n" if !defined($command);
109
110 my $permission;
111
112 if (ref($perm) eq 'HASH') {
113 $permission = $perm;
114 } else {
115 $perm //= 'VM.Monitor';
116 $permission = { check => [ 'perm', '/vms/{vmid}', [ $perm ]]};
117 }
118
119 my $parameters = {
b8158701
DC
120 additionalProperties => 0,
121 properties => {
122 node => get_standard_option('pve-node'),
123 vmid => get_standard_option('pve-vmid', {
ea2bceaf 124 completion => \&PVE::QemuServer::complete_vmid_running }),
b8158701
DC
125 command => {
126 type => 'string',
127 description => "The QGA command.",
ea2bceaf 128 enum => [ sort keys %$guest_agent_commands ],
b8158701
DC
129 },
130 },
ea2bceaf
DC
131 };
132
133 my $description = "Execute Qemu Guest Agent commands.";
134 my $name = 'agent';
135
136 if ($command ne '') {
137 $description = "Execute $command.";
138 $name = $command;
139 delete $parameters->{properties}->{command};
140 }
141
142 __PACKAGE__->register_method({
143 name => $name,
144 path => $command,
145 method => $method,
146 protected => 1,
147 proxyto => 'node',
148 description => $description,
149 permissions => $permission,
150 parameters => $parameters,
151 returns => {
152 type => 'object',
153 description => "Returns an object with a single `result` property.",
154 },
155 code => sub {
156 my ($param) = @_;
157
158 my $vmid = $param->{vmid};
b8158701 159
ea2bceaf 160 my $conf = PVE::QemuConfig->load_config ($vmid); # check if VM exists
b8158701 161
ea2bceaf
DC
162 die "No Qemu Guest Agent\n" if !defined($conf->{agent});
163 die "VM $vmid is not running\n" if !PVE::QemuServer::check_running($vmid);
b8158701 164
ea2bceaf
DC
165 my $cmd = $param->{command} // $command;
166 my $res = PVE::QemuServer::vm_mon_cmd($vmid, "guest-$cmd");
b8158701 167
ea2bceaf
DC
168 return { result => $res };
169 }});
170}
b8158701 171
ea2bceaf
DC
172# old {vmid}/agent POST endpoint, here for compatibility
173__PACKAGE__->register_command('', 'POST');
b8158701 174
ea2bceaf
DC
175for my $cmd (sort keys %$guest_agent_commands) {
176 my $props = $guest_agent_commands->{$cmd};
177 __PACKAGE__->register_command($cmd, $props->{method}, $props->{perms});
178}
b8158701
DC
179
1801;