1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2013 Lennart Poettering
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
24 #include "alloc-util.h"
25 #include "dbus-scope.h"
26 #include "load-dropin.h"
30 #include "string-table.h"
31 #include "string-util.h"
33 #include "unit-name.h"
36 static const UnitActiveState state_translation_table
[_SCOPE_STATE_MAX
] = {
37 [SCOPE_DEAD
] = UNIT_INACTIVE
,
38 [SCOPE_RUNNING
] = UNIT_ACTIVE
,
39 [SCOPE_ABANDONED
] = UNIT_ACTIVE
,
40 [SCOPE_STOP_SIGTERM
] = UNIT_DEACTIVATING
,
41 [SCOPE_STOP_SIGKILL
] = UNIT_DEACTIVATING
,
42 [SCOPE_FAILED
] = UNIT_FAILED
45 static int scope_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
47 static void scope_init(Unit
*u
) {
51 assert(u
->load_state
== UNIT_STUB
);
53 s
->timeout_stop_usec
= u
->manager
->default_timeout_stop_usec
;
54 u
->ignore_on_isolate
= true;
57 static void scope_done(Unit
*u
) {
62 s
->controller
= mfree(s
->controller
);
63 s
->controller_track
= sd_bus_track_unref(s
->controller_track
);
65 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
68 static int scope_arm_timer(Scope
*s
, usec_t usec
) {
73 if (s
->timer_event_source
) {
74 r
= sd_event_source_set_time(s
->timer_event_source
, usec
);
78 return sd_event_source_set_enabled(s
->timer_event_source
, SD_EVENT_ONESHOT
);
81 if (usec
== USEC_INFINITY
)
84 r
= sd_event_add_time(
85 UNIT(s
)->manager
->event
,
86 &s
->timer_event_source
,
89 scope_dispatch_timer
, s
);
93 (void) sd_event_source_set_description(s
->timer_event_source
, "scope-timer");
98 static void scope_set_state(Scope
*s
, ScopeState state
) {
102 old_state
= s
->state
;
105 if (!IN_SET(state
, SCOPE_STOP_SIGTERM
, SCOPE_STOP_SIGKILL
))
106 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
108 if (IN_SET(state
, SCOPE_DEAD
, SCOPE_FAILED
))
109 unit_unwatch_all_pids(UNIT(s
));
111 if (state
!= old_state
)
112 log_debug("%s changed %s -> %s", UNIT(s
)->id
, scope_state_to_string(old_state
), scope_state_to_string(state
));
114 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], true);
117 static int scope_add_default_dependencies(Scope
*s
) {
122 if (!UNIT(s
)->default_dependencies
)
125 /* Make sure scopes are unloaded on shutdown */
126 r
= unit_add_two_dependencies_by_name(
128 UNIT_BEFORE
, UNIT_CONFLICTS
,
129 SPECIAL_SHUTDOWN_TARGET
, NULL
, true,
130 UNIT_DEPENDENCY_DEFAULT
);
137 static int scope_verify(Scope
*s
) {
140 if (UNIT(s
)->load_state
!= UNIT_LOADED
)
143 if (set_isempty(UNIT(s
)->pids
) &&
144 !MANAGER_IS_RELOADING(UNIT(s
)->manager
) &&
145 !unit_has_name(UNIT(s
), SPECIAL_INIT_SCOPE
)) {
146 log_unit_error(UNIT(s
), "Scope has no PIDs. Refusing.");
153 static int scope_load_init_scope(Unit
*u
) {
156 if (!unit_has_name(u
, SPECIAL_INIT_SCOPE
))
162 /* init.scope is a bit special, as it has to stick around forever. Because of its special semantics we
163 * synthesize it here, instead of relying on the unit file on disk. */
165 u
->default_dependencies
= false;
167 /* Prettify things, if we can. */
169 u
->description
= strdup("System and Service Manager");
170 if (!u
->documentation
)
171 (void) strv_extend(&u
->documentation
, "man:systemd(1)");
176 static int scope_load(Unit
*u
) {
181 assert(u
->load_state
== UNIT_STUB
);
183 if (!u
->transient
&& !MANAGER_IS_RELOADING(u
->manager
))
184 /* Refuse to load non-transient scope units, but allow them while reloading. */
187 r
= scope_load_init_scope(u
);
190 r
= unit_load_fragment_and_dropin_optional(u
);
194 if (u
->load_state
== UNIT_LOADED
) {
195 r
= unit_patch_contexts(u
);
199 r
= unit_set_default_slice(u
);
203 r
= scope_add_default_dependencies(s
);
208 return scope_verify(s
);
211 static int scope_coldplug(Unit
*u
) {
216 assert(s
->state
== SCOPE_DEAD
);
218 if (s
->deserialized_state
== s
->state
)
221 if (IN_SET(s
->deserialized_state
, SCOPE_STOP_SIGKILL
, SCOPE_STOP_SIGTERM
)) {
222 r
= scope_arm_timer(s
, usec_add(u
->state_change_timestamp
.monotonic
, s
->timeout_stop_usec
));
227 if (!IN_SET(s
->deserialized_state
, SCOPE_DEAD
, SCOPE_FAILED
))
228 unit_watch_all_pids(UNIT(s
));
230 bus_scope_track_controller(s
);
232 scope_set_state(s
, s
->deserialized_state
);
236 static void scope_dump(Unit
*u
, FILE *f
, const char *prefix
) {
243 "%sScope State: %s\n"
245 prefix
, scope_state_to_string(s
->state
),
246 prefix
, scope_result_to_string(s
->result
));
248 cgroup_context_dump(&s
->cgroup_context
, f
, prefix
);
249 kill_context_dump(&s
->kill_context
, f
, prefix
);
252 static void scope_enter_dead(Scope
*s
, ScopeResult f
) {
255 if (s
->result
== SCOPE_SUCCESS
)
258 if (s
->result
!= SCOPE_SUCCESS
)
259 log_unit_warning(UNIT(s
), "Failed with result '%s'.", scope_result_to_string(s
->result
));
261 scope_set_state(s
, s
->result
!= SCOPE_SUCCESS
? SCOPE_FAILED
: SCOPE_DEAD
);
264 static void scope_enter_signal(Scope
*s
, ScopeState state
, ScopeResult f
) {
265 bool skip_signal
= false;
270 if (s
->result
== SCOPE_SUCCESS
)
273 unit_watch_all_pids(UNIT(s
));
275 /* If we have a controller set let's ask the controller nicely to terminate the scope, instead of us going
276 * directly into SIGTERM berserk mode */
277 if (state
== SCOPE_STOP_SIGTERM
)
278 skip_signal
= bus_scope_send_request_stop(s
) > 0;
283 r
= unit_kill_context(
286 state
!= SCOPE_STOP_SIGTERM
? KILL_KILL
:
287 s
->was_abandoned
? KILL_TERMINATE_AND_LOG
:
295 r
= scope_arm_timer(s
, usec_add(now(CLOCK_MONOTONIC
), s
->timeout_stop_usec
));
299 scope_set_state(s
, state
);
300 } else if (state
== SCOPE_STOP_SIGTERM
)
301 scope_enter_signal(s
, SCOPE_STOP_SIGKILL
, SCOPE_SUCCESS
);
303 scope_enter_dead(s
, SCOPE_SUCCESS
);
308 log_unit_warning_errno(UNIT(s
), r
, "Failed to kill processes: %m");
310 scope_enter_dead(s
, SCOPE_FAILURE_RESOURCES
);
313 static int scope_start(Unit
*u
) {
319 if (unit_has_name(u
, SPECIAL_INIT_SCOPE
))
322 if (s
->state
== SCOPE_FAILED
)
325 /* We can't fulfill this right now, please try again later */
326 if (IN_SET(s
->state
, SCOPE_STOP_SIGTERM
, SCOPE_STOP_SIGKILL
))
329 assert(s
->state
== SCOPE_DEAD
);
331 if (!u
->transient
&& !MANAGER_IS_RELOADING(u
->manager
))
334 (void) bus_scope_track_controller(s
);
336 r
= unit_acquire_invocation_id(u
);
340 (void) unit_realize_cgroup(u
);
341 (void) unit_reset_cpu_accounting(u
);
342 (void) unit_reset_ip_accounting(u
);
344 unit_export_state_files(UNIT(s
));
346 r
= unit_attach_pids_to_cgroup(u
);
348 log_unit_warning_errno(UNIT(s
), r
, "Failed to add PIDs to scope's control group: %m");
349 scope_enter_dead(s
, SCOPE_FAILURE_RESOURCES
);
353 s
->result
= SCOPE_SUCCESS
;
355 scope_set_state(s
, SCOPE_RUNNING
);
359 static int scope_stop(Unit
*u
) {
364 if (IN_SET(s
->state
, SCOPE_STOP_SIGTERM
, SCOPE_STOP_SIGKILL
))
367 assert(IN_SET(s
->state
, SCOPE_RUNNING
, SCOPE_ABANDONED
));
369 scope_enter_signal(s
, SCOPE_STOP_SIGTERM
, SCOPE_SUCCESS
);
373 static void scope_reset_failed(Unit
*u
) {
378 if (s
->state
== SCOPE_FAILED
)
379 scope_set_state(s
, SCOPE_DEAD
);
381 s
->result
= SCOPE_SUCCESS
;
384 static int scope_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
385 return unit_kill_common(u
, who
, signo
, -1, -1, error
);
388 static int scope_get_timeout(Unit
*u
, usec_t
*timeout
) {
393 if (!s
->timer_event_source
)
396 r
= sd_event_source_get_time(s
->timer_event_source
, &t
);
399 if (t
== USEC_INFINITY
)
406 static int scope_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
413 unit_serialize_item(u
, f
, "state", scope_state_to_string(s
->state
));
414 unit_serialize_item(u
, f
, "was-abandoned", yes_no(s
->was_abandoned
));
417 unit_serialize_item(u
, f
, "controller", s
->controller
);
422 static int scope_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
431 if (streq(key
, "state")) {
434 state
= scope_state_from_string(value
);
436 log_unit_debug(u
, "Failed to parse state value: %s", value
);
438 s
->deserialized_state
= state
;
440 } else if (streq(key
, "was-abandoned")) {
443 k
= parse_boolean(value
);
445 log_unit_debug(u
, "Failed to parse boolean value: %s", value
);
447 s
->was_abandoned
= k
;
448 } else if (streq(key
, "controller")) {
450 r
= free_and_strdup(&s
->controller
, value
);
455 log_unit_debug(u
, "Unknown serialization key: %s", key
);
460 static void scope_notify_cgroup_empty_event(Unit
*u
) {
464 log_unit_debug(u
, "cgroup is empty");
466 if (IN_SET(s
->state
, SCOPE_RUNNING
, SCOPE_ABANDONED
, SCOPE_STOP_SIGTERM
, SCOPE_STOP_SIGKILL
))
467 scope_enter_dead(s
, SCOPE_SUCCESS
);
470 static void scope_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
474 /* If we get a SIGCHLD event for one of the processes we were interested in, then we look for others to
475 * watch, under the assumption that we'll sooner or later get a SIGCHLD for them, as the original
476 * process we watched was probably the parent of them, and they are hence now our children. */
477 unit_tidy_watch_pids(u
, 0, 0);
478 unit_watch_all_pids(u
);
480 /* If the PID set is empty now, then let's finish this off. */
481 unit_synthesize_cgroup_empty_event(u
);
484 static int scope_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
485 Scope
*s
= SCOPE(userdata
);
488 assert(s
->timer_event_source
== source
);
492 case SCOPE_STOP_SIGTERM
:
493 if (s
->kill_context
.send_sigkill
) {
494 log_unit_warning(UNIT(s
), "Stopping timed out. Killing.");
495 scope_enter_signal(s
, SCOPE_STOP_SIGKILL
, SCOPE_FAILURE_TIMEOUT
);
497 log_unit_warning(UNIT(s
), "Stopping timed out. Skipping SIGKILL.");
498 scope_enter_dead(s
, SCOPE_FAILURE_TIMEOUT
);
503 case SCOPE_STOP_SIGKILL
:
504 log_unit_warning(UNIT(s
), "Still around after SIGKILL. Ignoring.");
505 scope_enter_dead(s
, SCOPE_FAILURE_TIMEOUT
);
509 assert_not_reached("Timeout at wrong time.");
515 int scope_abandon(Scope
*s
) {
518 if (unit_has_name(UNIT(s
), SPECIAL_INIT_SCOPE
))
521 if (!IN_SET(s
->state
, SCOPE_RUNNING
, SCOPE_ABANDONED
))
524 s
->was_abandoned
= true;
526 s
->controller
= mfree(s
->controller
);
527 s
->controller_track
= sd_bus_track_unref(s
->controller_track
);
529 scope_set_state(s
, SCOPE_ABANDONED
);
531 /* The client is no longer watching the remaining processes,
532 * so let's step in here, under the assumption that the
533 * remaining processes will be sooner or later reassigned to
536 unit_tidy_watch_pids(UNIT(s
), 0, 0);
537 unit_watch_all_pids(UNIT(s
));
542 _pure_
static UnitActiveState
scope_active_state(Unit
*u
) {
545 return state_translation_table
[SCOPE(u
)->state
];
548 _pure_
static const char *scope_sub_state_to_string(Unit
*u
) {
551 return scope_state_to_string(SCOPE(u
)->state
);
554 static void scope_enumerate(Manager
*m
) {
560 /* Let's unconditionally add the "init.scope" special unit
561 * that encapsulates PID 1. Note that PID 1 already is in the
562 * cgroup for this, we hence just need to allocate the object
563 * for it and that's it. */
565 u
= manager_get_unit(m
, SPECIAL_INIT_SCOPE
);
567 r
= unit_new_for_name(m
, sizeof(Scope
), SPECIAL_INIT_SCOPE
, &u
);
569 log_error_errno(r
, "Failed to allocate the special " SPECIAL_INIT_SCOPE
" unit: %m");
576 SCOPE(u
)->deserialized_state
= SCOPE_RUNNING
;
578 unit_add_to_load_queue(u
);
579 unit_add_to_dbus_queue(u
);
582 static const char* const scope_result_table
[_SCOPE_RESULT_MAX
] = {
583 [SCOPE_SUCCESS
] = "success",
584 [SCOPE_FAILURE_RESOURCES
] = "resources",
585 [SCOPE_FAILURE_TIMEOUT
] = "timeout",
588 DEFINE_STRING_TABLE_LOOKUP(scope_result
, ScopeResult
);
590 const UnitVTable scope_vtable
= {
591 .object_size
= sizeof(Scope
),
592 .cgroup_context_offset
= offsetof(Scope
, cgroup_context
),
593 .kill_context_offset
= offsetof(Scope
, kill_context
),
599 .private_section
= "Scope",
601 .can_transient
= true,
602 .can_delegate
= true,
608 .coldplug
= scope_coldplug
,
612 .start
= scope_start
,
617 .get_timeout
= scope_get_timeout
,
619 .serialize
= scope_serialize
,
620 .deserialize_item
= scope_deserialize_item
,
622 .active_state
= scope_active_state
,
623 .sub_state_to_string
= scope_sub_state_to_string
,
625 .sigchld_event
= scope_sigchld_event
,
627 .reset_failed
= scope_reset_failed
,
629 .notify_cgroup_empty
= scope_notify_cgroup_empty_event
,
631 .bus_vtable
= bus_scope_vtable
,
632 .bus_set_property
= bus_scope_set_property
,
633 .bus_commit_properties
= bus_scope_commit_properties
,
635 .enumerate
= scope_enumerate
,