]> git.proxmox.com Git - pmg-api.git/blame - PMG/API2/Services.pm
delete/deliver_quarantined_mail: use receiver instead of pmail
[pmg-api.git] / PMG / API2 / Services.pm
CommitLineData
163fb58f
DM
1package PMG::API2::Services;
2
3use strict;
4use warnings;
5
6use PVE::Tools;
7use PVE::SafeSyslog;
8use PVE::INotify;
9use PVE::Exception qw(raise_param_exc);
10use PVE::RESTHandler;
9d82c6bc 11use PMG::RESTEnvironment;
163fb58f
DM
12use PVE::JSONSchema qw(get_standard_option);
13
621a0f58
DM
14use PMG::Utils;
15
163fb58f
DM
16use base qw(PVE::RESTHandler);
17
18my $service_name_list = [
d77e8aeb
DM
19 'clamav-daemon',
20 'clamav-freshclam',
07adfb86 21 'fetchmail',
163fb58f
DM
22 'pmgproxy',
23 'pmgdaemon',
db2ee3df 24 'pmgpolicy',
8ed62155 25 'pmg-smtp-filter',
dbe94472 26 'pmgtunnel',
132089d5 27 'pmgmirror',
9fc351a8 28 'ssh',
0b21df28 29 'rsyslog',
163fb58f 30 'postfix',
ef07e4d0 31 'postgres',
163fb58f 32 'systemd-timesyncd',
a34e0908
DM
33 'pmg-hourly',
34 'pmg-daily',
1c0f734c 35 'pmgreport',
cb16e800 36 'pmgspamreport',
163fb58f
DM
37 ];
38
163fb58f
DM
39my $static_service_list;
40
41sub get_service_list {
42
43 return $static_service_list if $static_service_list;
44
45 my $list = {};
46 foreach my $name (@$service_name_list) {
47 my $ss;
230b4e03 48 eval { $ss = PMG::Utils::get_full_service_state($name); };
163fb58f
DM
49 warn $@ if $@;
50 next if !$ss;
51 next if !defined($ss->{Description});
52 $list->{$name} = { name => $name, desc => $ss->{Description} };
53 }
54
55 $static_service_list = $list;
56
57 return $static_service_list;
58}
59
60
61my $service_prop_desc = {
62 description => "Service ID",
63 type => 'string',
64 enum => $service_name_list,
65};
66
163fb58f
DM
67my $service_state = sub {
68 my ($service) = @_;
69
70 my $ss;
230b4e03 71 eval { $ss = PMG::Utils::get_full_service_state($service); };
163fb58f
DM
72 if (my $err = $@) {
73 return 'unknown';
74 }
75
1bd0a5fb 76 my $state = $ss->{SubState} // 'unknown';
163fb58f 77
1bd0a5fb
DM
78 $state = $ss->{Result}
79 if $state eq 'dead' && $ss->{Type} && $ss->{Type} eq 'oneshot' &&
80 $ss->{Result};
81
82 return $state;
163fb58f
DM
83};
84
85__PACKAGE__->register_method ({
86 name => 'index',
87 path => '',
88 method => 'GET',
89 description => "Service list.",
90 proxyto => 'node',
91 protected => 1,
9b02ca51 92 permissions => { check => [ 'admin', 'audit' ] },
163fb58f
DM
93 parameters => {
94 additionalProperties => 0,
95 properties => {
96 node => get_standard_option('pve-node'),
97 },
98 },
99 returns => {
100 type => 'array',
101 items => {
102 type => "object",
103 properties => {},
104 },
105 links => [ { rel => 'child', href => "{service}" } ],
106 },
107 code => sub {
108 my ($param) = @_;
109
110 my $res = [];
111
112 my $service_list = get_service_list();
113
114 foreach my $id (keys %{$service_list}) {
115 push @$res, {
116 service => $id,
117 name => $service_list->{$id}->{name},
118 desc => $service_list->{$id}->{desc},
1bd0a5fb 119 state => $service_state->($id),
163fb58f
DM
120 };
121 }
122
123 return $res;
124 }});
125
126__PACKAGE__->register_method({
127 name => 'srvcmdidx',
128 path => '{service}',
129 method => 'GET',
130 description => "Directory index",
9b02ca51 131 permissions => { check => [ 'admin', 'audit' ] },
163fb58f
DM
132 parameters => {
133 additionalProperties => 0,
134 properties => {
135 node => get_standard_option('pve-node'),
136 service => $service_prop_desc,
137 },
138 },
139 returns => {
140 type => 'array',
141 items => {
142 type => "object",
143 properties => {
144 subdir => { type => 'string' },
145 },
146 },
147 links => [ { rel => 'child', href => "{subdir}" } ],
148 },
149 code => sub {
150 my ($param) = @_;
151
152 my $res = [
153 { subdir => 'state' },
154 { subdir => 'start' },
155 { subdir => 'stop' },
156 { subdir => 'restart' },
157 { subdir => 'reload' },
158 ];
159
160 return $res;
161 }});
162
163__PACKAGE__->register_method ({
164 name => 'service_state',
165 path => '{service}/state',
166 method => 'GET',
167 description => "Read service properties",
168 proxyto => 'node',
169 protected => 1,
9b02ca51 170 permissions => { check => [ 'admin', 'audit' ] },
163fb58f
DM
171 parameters => {
172 additionalProperties => 0,
173 properties => {
174 node => get_standard_option('pve-node'),
175 service => $service_prop_desc,
176 },
177 },
178 returns => {
179 type => "object",
180 properties => {},
181 },
182 code => sub {
183 my ($param) = @_;
184
185 my $service_list = get_service_list();
186
187 my $si = $service_list->{$param->{service}};
188 return {
189 service => $param->{service},
190 name => $si->{name},
191 desc => $si->{desc},
192 state => &$service_state($param->{service}),
193 };
194 }});
195
196__PACKAGE__->register_method ({
197 name => 'service_start',
198 path => '{service}/start',
199 method => 'POST',
200 description => "Start service.",
201 proxyto => 'node',
202 protected => 1,
9b02ca51 203 permissions => { check => [ 'admin' ] },
163fb58f
DM
204 parameters => {
205 additionalProperties => 0,
206 properties => {
207 node => get_standard_option('pve-node'),
208 service => $service_prop_desc,
209 },
210 },
211 returns => {
212 type => 'string',
213 },
214 code => sub {
215 my ($param) = @_;
216
f1c29260 217 my $restenv = PMG::RESTEnvironment->get();
163fb58f
DM
218
219 my $user = $restenv->get_user();
220
221 my $realcmd = sub {
222 my $upid = shift;
223
224 syslog('info', "starting service $param->{service}: $upid\n");
225
621a0f58 226 PMG::Utils::service_cmd($param->{service}, 'start');
163fb58f
DM
227
228 };
229
230 return $restenv->fork_worker('srvstart', $param->{service}, $user, $realcmd);
231 }});
232
233__PACKAGE__->register_method ({
234 name => 'service_stop',
235 path => '{service}/stop',
236 method => 'POST',
237 description => "Stop service.",
238 proxyto => 'node',
239 protected => 1,
9b02ca51 240 permissions => { check => [ 'admin' ] },
163fb58f
DM
241 parameters => {
242 additionalProperties => 0,
243 properties => {
244 node => get_standard_option('pve-node'),
245 service => $service_prop_desc,
246 },
247 },
248 returns => {
249 type => 'string',
250 },
251 code => sub {
252 my ($param) = @_;
253
f1c29260 254 my $restenv = PMG::RESTEnvironment->get();
163fb58f
DM
255
256 my $user = $restenv->get_user();
257
258 my $realcmd = sub {
259 my $upid = shift;
260
261 syslog('info', "stoping service $param->{service}: $upid\n");
262
621a0f58 263 PMG::Utils::service_cmd($param->{service}, 'stop');
163fb58f
DM
264
265 };
266
267 return $restenv->fork_worker('srvstop', $param->{service}, $user, $realcmd);
268 }});
269
270__PACKAGE__->register_method ({
271 name => 'service_restart',
272 path => '{service}/restart',
273 method => 'POST',
274 description => "Restart service.",
275 proxyto => 'node',
276 protected => 1,
9b02ca51 277 permissions => { check => [ 'admin' ] },
163fb58f
DM
278 parameters => {
279 additionalProperties => 0,
280 properties => {
281 node => get_standard_option('pve-node'),
282 service => $service_prop_desc,
283 },
284 },
285 returns => {
286 type => 'string',
287 },
288 code => sub {
289 my ($param) = @_;
290
f1c29260 291 my $restenv = PMG::RESTEnvironment->get();
163fb58f
DM
292
293 my $user = $restenv->get_user();
294
295 my $realcmd = sub {
296 my $upid = shift;
297
298 syslog('info', "re-starting service $param->{service}: $upid\n");
299
621a0f58 300 PMG::Utils::service_cmd($param->{service}, 'restart');
163fb58f
DM
301
302 };
303
304 return $restenv->fork_worker('srvrestart', $param->{service}, $user, $realcmd);
305 }});
306
307__PACKAGE__->register_method ({
308 name => 'service_reload',
309 path => '{service}/reload',
310 method => 'POST',
311 description => "Reload service.",
312 proxyto => 'node',
313 protected => 1,
9b02ca51 314 permissions => { check => [ 'admin' ] },
163fb58f
DM
315 parameters => {
316 additionalProperties => 0,
317 properties => {
318 node => get_standard_option('pve-node'),
319 service => $service_prop_desc,
320 },
321 },
322 returns => {
323 type => 'string',
324 },
325 code => sub {
326 my ($param) = @_;
327
f1c29260 328 my $restenv = PMG::RESTEnvironment->get();
163fb58f
DM
329
330 my $user = $restenv->get_user();
331
332 my $realcmd = sub {
333 my $upid = shift;
334
335 syslog('info', "reloading service $param->{service}: $upid\n");
336
621a0f58 337 PMG::Utils::service_cmd($param->{service}, 'reload');
163fb58f
DM
338
339 };
340
341 return $restenv->fork_worker('srvreload', $param->{service}, $user, $realcmd);
342 }});
9b02ca51
DM
343
3441;