]> git.proxmox.com Git - pve-client.git/blob - PVE/APIClient/Commands/GuestStatus.pm
03e2e4aea3a6b65ddc5ccb85a7f44c6e4edc965b
[pve-client.git] / PVE / APIClient / Commands / GuestStatus.pm
1 package PVE::APIClient::Commands::GuestStatus;
2
3 use strict;
4 use warnings;
5
6 use PVE::APIClient::Helpers;
7 use PVE::APIClient::Config;
8
9 use PVE::APIClient::JSONSchema qw(get_standard_option);
10
11 use File::Temp qw(tempfile);
12
13 use PVE::APIClient::CLIHandler;
14
15 use base qw(PVE::APIClient::CLIHandler);
16
17 my $guest_status_command = sub {
18 my ($remote, $vmid, $cmd, $param) = @_,
19
20 my $config = PVE::APIClient::Config->load();
21 my $conn = PVE::APIClient::Config->remote_conn($config, $remote);
22
23 my $resource = PVE::APIClient::Helpers::get_vmid_resource($conn, $vmid);
24
25 my $upid = $conn->post("api2/json/nodes/$resource->{node}/$resource->{type}/$resource->{vmid}/status/$cmd", $param);
26
27 print PVE::APIClient::Helpers::poll_task($conn, $resource->{node}, $upid) . "\n";
28 };
29
30 __PACKAGE__->register_method ({
31 name => 'start',
32 path => 'start',
33 method => 'POST',
34 description => "Start a guest (VM/Container).",
35 parameters => {
36 additionalProperties => 0,
37 properties => {
38 remote => get_standard_option('pveclient-remote-name'),
39 vmid => get_standard_option('pve-vmid'),
40 },
41 },
42 returns => { type => 'null'},
43 code => sub {
44 my ($param) = @_;
45
46 my $remote = PVE::APIClient::Tools::extract_param($param, 'remote');
47 my $vmid = PVE::APIClient::Tools::extract_param($param, 'vmid');
48
49 $guest_status_command->($remote, $vmid, 'start', $param);
50
51 return undef;
52 }});
53
54 __PACKAGE__->register_method ({
55 name => 'stop',
56 path => 'stop',
57 method => 'POST',
58 description => "Stop a guest (VM/Container).",
59 parameters => {
60 additionalProperties => 0,
61 properties => {
62 remote => get_standard_option('pveclient-remote-name'),
63 vmid => get_standard_option('pve-vmid'),
64 timeout => {
65 description => "Timeout in seconds",
66 type => 'integer',
67 minimum => 1,
68 optional => 1,
69 },
70 },
71 },
72 returns => { type => 'null'},
73 code => sub {
74 my ($param) = @_;
75
76 my $remote = PVE::APIClient::Tools::extract_param($param, 'remote');
77 my $vmid = PVE::APIClient::Tools::extract_param($param, 'vmid');
78
79 $guest_status_command->($remote, $vmid, 'stop', $param);
80
81 return undef;
82 }});
83
84 __PACKAGE__->register_method ({
85 name => 'shutdown',
86 path => 'shutdown',
87 method => 'POST',
88 description => "Stop a guest (VM/Container).",
89 parameters => {
90 additionalProperties => 0,
91 properties => {
92 remote => get_standard_option('pveclient-remote-name'),
93 vmid => get_standard_option('pve-vmid'),
94 force => {
95 description => "Make sure the Container/VM stops.",
96 type => 'boolean',
97 optional => 1,
98 },
99 timeout => {
100 description => "Timeout in seconds",
101 type => 'integer',
102 minimum => 1,
103 optional => 1,
104 },
105 },
106 },
107 returns => { type => 'null'},
108 code => sub {
109 my ($param) = @_;
110
111 my $remote = PVE::APIClient::Tools::extract_param($param, 'remote');
112 my $vmid = PVE::APIClient::Tools::extract_param($param, 'vmid');
113
114 $guest_status_command->($remote, $vmid, 'shutdown', $param);
115
116 return undef;
117 }});
118
119 __PACKAGE__->register_method ({
120 name => 'suspend',
121 path => 'suspend',
122 method => 'POST',
123 description => "Suspend a guest VM.",
124 parameters => {
125 additionalProperties => 0,
126 properties => {
127 remote => get_standard_option('pveclient-remote-name'),
128 vmid => get_standard_option('pve-vmid'),
129 },
130 },
131 returns => { type => 'null'},
132 code => sub {
133 my ($param) = @_;
134
135 my $remote = PVE::APIClient::Tools::extract_param($param, 'remote');
136 my $vmid = PVE::APIClient::Tools::extract_param($param, 'vmid');
137
138 $guest_status_command->($remote, $vmid, 'suspend', $param);
139
140 return undef;
141 }});
142
143 __PACKAGE__->register_method ({
144 name => 'resume',
145 path => 'resume',
146 method => 'POST',
147 description => "Resume a guest VM.",
148 parameters => {
149 additionalProperties => 0,
150 properties => {
151 remote => get_standard_option('pveclient-remote-name'),
152 vmid => get_standard_option('pve-vmid'),
153 },
154 },
155 returns => { type => 'null'},
156 code => sub {
157 my ($param) = @_;
158
159 my $remote = PVE::APIClient::Tools::extract_param($param, 'remote');
160 my $vmid = PVE::APIClient::Tools::extract_param($param, 'vmid');
161
162 $guest_status_command->($remote, $vmid, 'resume', $param);
163
164 return undef;
165 }});
166
167 __PACKAGE__->register_method ({
168 name => 'spice',
169 path => 'spice',
170 method => 'POST',
171 description => "Run the spice client for a guest (VM/Container)",
172 parameters => {
173 additionalProperties => 0,
174 properties => {
175 remote => get_standard_option('pveclient-remote-name'),
176 vmid => get_standard_option('pve-vmid'),
177 },
178 },
179 returns => { type => 'null'},
180 code => sub {
181 my ($param) = @_;
182
183 my $remote = PVE::APIClient::Tools::extract_param($param, 'remote');
184 my $vmid = PVE::APIClient::Tools::extract_param($param, 'vmid');
185
186 my $config = PVE::APIClient::Config->load();
187 my $conn = PVE::APIClient::Config->remote_conn($config, $remote);
188
189 my $resource = PVE::APIClient::Helpers::get_vmid_resource($conn, $vmid);
190
191 my $res = $conn->post("api2/json/nodes/$resource->{node}/$resource->{type}/$resource->{vmid}/spiceproxy", {});
192
193 my $vvsetup = "[virt-viewer]\n";
194 foreach my $k (keys %$res) {
195 $vvsetup .= "$k=$res->{$k}\n";
196 }
197
198 my ($fh, $filename) = tempfile( "tempXXXXX", SUFFIX => '.vv', TMPDIR => 1);
199 syswrite($fh, $vvsetup);
200
201 system("nohup remote-viewer $filename 1>/dev/null 2>&1 &");
202 if ($? != 0) {
203 print "failed to execute remote-viewer: $!\n";
204 }
205
206 return undef;
207 }});
208
209 1;