]>
git.proxmox.com Git - pve-manager.git/blob - PVE/API2/Services.pm
1 package PVE
::API2
::Services
;
10 use PVE
::Exception
qw(raise_param_exc);
12 use PVE
::RPCEnvironment
;
13 use PVE
::JSONSchema
qw(get_standard_option);
14 use PVE
::AccessControl
;
17 use base
qw(PVE::RESTHandler);
19 my $service_name_list = [
40 my $essential_services = {
46 # since postfix package 3.1.0-3.1 the postfix unit is only here to
47 # manage subinstances, of which the default is called "-".
48 # This is where we look for the daemon status
49 my $unit_extra_names = {
50 postfix
=> 'postfix@-'
53 my $get_full_service_state = sub {
55 $service = $unit_extra_names->{$service} if $unit_extra_names->{$service};
60 if ($line =~ m/^([^=\s]+)=(.*)$/) {
65 PVE
::Tools
::run_command
(['systemctl', 'show', $service], outfunc
=> $parser);
70 my $static_service_list;
72 sub get_service_list
{
74 return $static_service_list if $static_service_list;
77 foreach my $name (@$service_name_list) {
78 my $ss = eval { $get_full_service_state->($name) };
81 next if !defined($ss->{Description
});
82 $list->{$name} = { name
=> $name, desc
=> $ss->{Description
} };
85 $static_service_list = $list;
87 return $static_service_list;
91 my $service_prop_desc = {
92 description
=> "Service ID",
94 enum
=> $service_name_list,
97 my $service_cmd = sub {
98 my ($service, $cmd) = @_;
102 die "unknown service command '$cmd'\n" if $cmd !~ m/^(start|stop|restart|reload|try-reload-or-restart)$/;
104 if ($essential_services->{$service} && $cmd eq 'stop') {
105 die "invalid service cmd '$service $cmd': refusing to stop essential service!\n";
108 PVE
::Tools
::run_command
(['systemctl', $cmd, $service]);
111 my $service_state = sub {
114 my $res = { state => 'unknown' };
116 my $ss = eval { $get_full_service_state->($service) };
120 my $state = $ss->{SubState
} || 'unknown';
121 if ($state eq 'dead' && $ss->{Type
} && $ss->{Type
} eq 'oneshot' && $ss->{Result
}) {
122 $res->{state} = $ss->{Result
};
124 $res->{state} = $ss->{SubState
} || 'unknown';
127 if ($ss->{LoadState
} eq 'not-found') {
128 $res->{'unit-state'} = 'not-found'; # not installed
130 $res->{'unit-state'} = $ss->{UnitFileState
} || 'unknown';
132 $res->{'active-state'} = $ss->{ActiveState
} || 'unknown';
137 __PACKAGE__-
>register_method ({
142 check
=> ['perm', '/nodes/{node}', [ 'Sys.Audit' ]],
144 description
=> "Service list.",
148 additionalProperties
=> 0,
150 node
=> get_standard_option
('pve-node'),
159 links
=> [ { rel
=> 'child', href
=> "{service}" } ],
164 my $service_list = get_service_list
();
167 for my $id (sort keys %{$service_list}) {
168 my $state = $service_state->($id);
171 name
=> $service_list->{$id}->{name
},
172 desc
=> $service_list->{$id}->{desc
},
180 __PACKAGE__-
>register_method({
184 description
=> "Directory index",
186 check
=> ['perm', '/nodes/{node}', [ 'Sys.Audit' ]],
189 additionalProperties
=> 0,
191 node
=> get_standard_option
('pve-node'),
192 service
=> $service_prop_desc,
200 subdir
=> { type
=> 'string' },
203 links
=> [ { rel
=> 'child', href
=> "{subdir}" } ],
209 { subdir
=> 'state' },
210 { subdir
=> 'start' },
211 { subdir
=> 'stop' },
212 { subdir
=> 'restart' },
213 { subdir
=> 'reload' },
219 __PACKAGE__-
>register_method ({
220 name
=> 'service_state',
221 path
=> '{service}/state',
224 check
=> ['perm', '/nodes/{node}', [ 'Sys.Audit' ]],
226 description
=> "Read service properties",
230 additionalProperties
=> 0,
232 node
=> get_standard_option
('pve-node'),
233 service
=> $service_prop_desc,
243 my $id = $param->{service
};
245 my $service_list = get_service_list
();
247 my $si = $service_list->{$id};
249 my $state = $service_state->($id);
252 service
=> $param->{service
},
259 __PACKAGE__-
>register_method ({
260 name
=> 'service_start',
261 path
=> '{service}/start',
263 description
=> "Start service.",
265 check
=> ['perm', '/nodes/{node}', [ 'Sys.Modify' ]],
270 additionalProperties
=> 0,
272 node
=> get_standard_option
('pve-node'),
273 service
=> $service_prop_desc,
282 my $rpcenv = PVE
::RPCEnvironment
::get
();
284 my $user = $rpcenv->get_user();
289 syslog
('info', "starting service $param->{service}: $upid\n");
291 $service_cmd->($param->{service
}, 'start');
295 return $rpcenv->fork_worker('srvstart', $param->{service
}, $user, $realcmd);
298 __PACKAGE__-
>register_method ({
299 name
=> 'service_stop',
300 path
=> '{service}/stop',
302 description
=> "Stop service.",
304 check
=> ['perm', '/nodes/{node}', [ 'Sys.Modify' ]],
309 additionalProperties
=> 0,
311 node
=> get_standard_option
('pve-node'),
312 service
=> $service_prop_desc,
321 my $rpcenv = PVE
::RPCEnvironment
::get
();
323 my $user = $rpcenv->get_user();
328 syslog
('info', "stopping service $param->{service}: $upid\n");
330 $service_cmd->($param->{service
}, 'stop');
334 return $rpcenv->fork_worker('srvstop', $param->{service
}, $user, $realcmd);
337 __PACKAGE__-
>register_method ({
338 name
=> 'service_restart',
339 path
=> '{service}/restart',
341 description
=> "Hard restart service. Use reload if you want to reduce interruptions.",
343 check
=> ['perm', '/nodes/{node}', [ 'Sys.Modify' ]],
348 additionalProperties
=> 0,
350 node
=> get_standard_option
('pve-node'),
351 service
=> $service_prop_desc,
360 my $rpcenv = PVE
::RPCEnvironment
::get
();
361 my $user = $rpcenv->get_user();
365 syslog
('info', "re-starting service $param->{service}: $upid\n");
367 $service_cmd->($param->{service
}, 'restart');
370 return $rpcenv->fork_worker('srvrestart', $param->{service
}, $user, $realcmd);
373 __PACKAGE__-
>register_method ({
374 name
=> 'service_reload',
375 path
=> '{service}/reload',
377 description
=> "Reload service. Falls back to restart if service cannot be reloaded.",
379 check
=> ['perm', '/nodes/{node}', [ 'Sys.Modify' ]],
384 additionalProperties
=> 0,
386 node
=> get_standard_option
('pve-node'),
387 service
=> $service_prop_desc,
396 my $rpcenv = PVE
::RPCEnvironment
::get
();
397 my $user = $rpcenv->get_user();
401 syslog
('info', "reloading service $param->{service}: $upid\n");
403 $service_cmd->($param->{service
}, 'try-reload-or-restart');
407 return $rpcenv->fork_worker('srvreload', $param->{service
}, $user, $realcmd);