]>
Commit | Line | Data |
---|---|---|
163fb58f DM |
1 | package PMG::API2::Services; |
2 | ||
3 | use strict; | |
4 | use warnings; | |
5 | ||
6 | use PVE::Tools; | |
7 | use PVE::SafeSyslog; | |
8 | use PVE::INotify; | |
9 | use PVE::Exception qw(raise_param_exc); | |
10 | use PVE::RESTHandler; | |
9d82c6bc | 11 | use PMG::RESTEnvironment; |
163fb58f DM |
12 | use PVE::JSONSchema qw(get_standard_option); |
13 | ||
621a0f58 DM |
14 | use PMG::Utils; |
15 | ||
163fb58f DM |
16 | use base qw(PVE::RESTHandler); |
17 | ||
18 | my $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 |
39 | my $static_service_list; |
40 | ||
41 | sub 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 | ||
61 | my $service_prop_desc = { | |
62 | description => "Service ID", | |
63 | type => 'string', | |
64 | enum => $service_name_list, | |
65 | }; | |
66 | ||
163fb58f DM |
67 | my $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 | |
344 | 1; |