1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
29 #include <sys/reboot.h>
30 #include <sys/ioctl.h>
34 #include <sys/types.h>
37 #include <sys/timerfd.h>
43 #include "sd-daemon.h"
45 #include "sd-messages.h"
48 #include "transaction.h"
55 #include "ratelimit.h"
56 #include "locale-setup.h"
57 #include "mount-setup.h"
58 #include "unit-name.h"
60 #include "path-lookup.h"
62 #include "exit-status.h"
65 #include "cgroup-util.h"
66 #include "path-util.h"
68 #include "boot-timestamps.h"
70 #include "bus-errors.h"
71 #include "bus-error.h"
74 #include "dbus-unit.h"
76 #include "dbus-manager.h"
77 #include "bus-kernel.h"
79 /* As soon as 5s passed since a unit was added to our GC queue, make sure to run a gc sweep */
80 #define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC)
82 /* Initial delay and the interval for printing status messages about running jobs */
83 #define JOBS_IN_PROGRESS_WAIT_USEC (5*USEC_PER_SEC)
84 #define JOBS_IN_PROGRESS_PERIOD_USEC (USEC_PER_SEC / 3)
85 #define JOBS_IN_PROGRESS_PERIOD_DIVISOR 3
87 #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
89 static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
90 static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
91 static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
92 static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
93 static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata);
94 static int manager_dispatch_run_queue(sd_event_source *source, void *userdata);
96 static int manager_watch_jobs_in_progress(Manager *m) {
101 if (m->jobs_in_progress_event_source)
104 next = now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_WAIT_USEC;
105 return sd_event_add_time(
107 &m->jobs_in_progress_event_source,
110 manager_dispatch_jobs_in_progress, m);
113 #define CYLON_BUFFER_EXTRA (2*(sizeof(ANSI_RED_ON)-1) + sizeof(ANSI_HIGHLIGHT_RED_ON)-1 + 2*(sizeof(ANSI_HIGHLIGHT_OFF)-1))
115 static void draw_cylon(char buffer[], size_t buflen, unsigned width, unsigned pos) {
118 assert(buflen >= CYLON_BUFFER_EXTRA + width + 1);
119 assert(pos <= width+1); /* 0 or width+1 mean that the center light is behind the corner */
123 p = mempset(p, ' ', pos-2);
124 p = stpcpy(p, ANSI_RED_ON);
128 if (pos > 0 && pos <= width) {
129 p = stpcpy(p, ANSI_HIGHLIGHT_RED_ON);
133 p = stpcpy(p, ANSI_HIGHLIGHT_OFF);
136 p = stpcpy(p, ANSI_RED_ON);
139 p = mempset(p, ' ', width-1-pos);
140 strcpy(p, ANSI_HIGHLIGHT_OFF);
144 void manager_flip_auto_status(Manager *m, bool enable) {
148 if (m->show_status == SHOW_STATUS_AUTO)
149 manager_set_show_status(m, SHOW_STATUS_TEMPORARY);
151 if (m->show_status == SHOW_STATUS_TEMPORARY)
152 manager_set_show_status(m, SHOW_STATUS_AUTO);
156 static void manager_print_jobs_in_progress(Manager *m) {
157 _cleanup_free_ char *job_of_n = NULL;
160 unsigned counter = 0, print_nr;
161 char cylon[6 + CYLON_BUFFER_EXTRA + 1];
163 char time[FORMAT_TIMESPAN_MAX], limit[FORMAT_TIMESPAN_MAX] = "no limit";
168 manager_flip_auto_status(m, true);
170 print_nr = (m->jobs_in_progress_iteration / JOBS_IN_PROGRESS_PERIOD_DIVISOR) % m->n_running_jobs;
172 HASHMAP_FOREACH(j, m->jobs, i)
173 if (j->state == JOB_RUNNING && counter++ == print_nr)
176 /* m->n_running_jobs must be consistent with the contents of m->jobs,
177 * so the above loop must have succeeded in finding j. */
178 assert(counter == print_nr + 1);
181 cylon_pos = m->jobs_in_progress_iteration % 14;
183 cylon_pos = 14 - cylon_pos;
184 draw_cylon(cylon, sizeof(cylon), 6, cylon_pos);
186 m->jobs_in_progress_iteration++;
188 if (m->n_running_jobs > 1)
189 if (asprintf(&job_of_n, "(%u of %u) ", counter, m->n_running_jobs) < 0)
192 format_timespan(time, sizeof(time), now(CLOCK_MONOTONIC) - j->begin_usec, 1*USEC_PER_SEC);
193 if (job_get_timeout(j, &x) > 0)
194 format_timespan(limit, sizeof(limit), x - j->begin_usec, 1*USEC_PER_SEC);
196 manager_status_printf(m, true, cylon,
197 "%sA %s job is running for %s (%s / %s)",
199 job_type_to_string(j->type),
200 unit_description(j->unit),
205 static int manager_watch_idle_pipe(Manager *m) {
210 if (m->idle_pipe_event_source)
213 if (m->idle_pipe[2] < 0)
216 r = sd_event_add_io(m->event, &m->idle_pipe_event_source, m->idle_pipe[2], EPOLLIN, manager_dispatch_idle_pipe_fd, m);
218 log_error("Failed to watch idle pipe: %s", strerror(-r));
225 static void manager_close_idle_pipe(Manager *m) {
228 safe_close_pair(m->idle_pipe);
229 safe_close_pair(m->idle_pipe + 2);
232 static int manager_setup_time_change(Manager *m) {
235 /* We only care for the cancellation event, hence we set the
236 * timeout to the latest possible value. */
237 struct itimerspec its = {
238 .it_value.tv_sec = TIME_T_MAX,
242 assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX));
247 /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
248 * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */
250 m->time_change_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
251 if (m->time_change_fd < 0) {
252 log_error("Failed to create timerfd: %m");
256 if (timerfd_settime(m->time_change_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
257 log_debug("Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
258 m->time_change_fd = safe_close(m->time_change_fd);
262 r = sd_event_add_io(m->event, &m->time_change_event_source, m->time_change_fd, EPOLLIN, manager_dispatch_time_change_fd, m);
264 log_error("Failed to create time change event source: %s", strerror(-r));
268 log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
273 static int enable_special_signals(Manager *m) {
274 _cleanup_close_ int fd = -1;
278 /* Enable that we get SIGINT on control-alt-del. In containers
279 * this will fail with EPERM (older) or EINVAL (newer), so
281 if (reboot(RB_DISABLE_CAD) < 0 && errno != EPERM && errno != EINVAL)
282 log_warning("Failed to enable ctrl-alt-del handling: %m");
284 fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
286 /* Support systems without virtual console */
288 log_warning("Failed to open /dev/tty0: %m");
290 /* Enable that we get SIGWINCH on kbrequest */
291 if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0)
292 log_warning("Failed to enable kbrequest handling: %m");
298 static int manager_setup_signals(Manager *m) {
299 struct sigaction sa = {
300 .sa_handler = SIG_DFL,
301 .sa_flags = SA_NOCLDSTOP|SA_RESTART,
311 /* We are not interested in SIGSTOP and friends. */
312 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
314 assert_se(sigemptyset(&mask) == 0);
316 sigset_add_many(&mask,
317 SIGCHLD, /* Child died */
318 SIGTERM, /* Reexecute daemon */
319 SIGHUP, /* Reload configuration */
320 SIGUSR1, /* systemd/upstart: reconnect to D-Bus */
321 SIGUSR2, /* systemd: dump status */
322 SIGINT, /* Kernel sends us this on control-alt-del */
323 SIGWINCH, /* Kernel sends us this on kbrequest (alt-arrowup) */
324 SIGPWR, /* Some kernel drivers and upsd send us this on power failure */
325 SIGRTMIN+0, /* systemd: start default.target */
326 SIGRTMIN+1, /* systemd: isolate rescue.target */
327 SIGRTMIN+2, /* systemd: isolate emergency.target */
328 SIGRTMIN+3, /* systemd: start halt.target */
329 SIGRTMIN+4, /* systemd: start poweroff.target */
330 SIGRTMIN+5, /* systemd: start reboot.target */
331 SIGRTMIN+6, /* systemd: start kexec.target */
332 SIGRTMIN+13, /* systemd: Immediate halt */
333 SIGRTMIN+14, /* systemd: Immediate poweroff */
334 SIGRTMIN+15, /* systemd: Immediate reboot */
335 SIGRTMIN+16, /* systemd: Immediate kexec */
336 SIGRTMIN+20, /* systemd: enable status messages */
337 SIGRTMIN+21, /* systemd: disable status messages */
338 SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
339 SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
340 SIGRTMIN+24, /* systemd: Immediate exit (--user only) */
341 SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */
342 SIGRTMIN+27, /* systemd: set log target to console */
343 SIGRTMIN+28, /* systemd: set log target to kmsg */
344 SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg (obsolete)*/
346 assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
348 m->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
349 if (m->signal_fd < 0)
352 r = sd_event_add_io(m->event, &m->signal_event_source, m->signal_fd, EPOLLIN, manager_dispatch_signal_fd, m);
356 /* Process signals a bit earlier than the rest of things, but
357 * later than notify_fd processing, so that the notify
358 * processing can still figure out to which process/service a
359 * message belongs, before we reap the process. */
360 r = sd_event_source_set_priority(m->signal_event_source, -5);
364 if (m->running_as == SYSTEMD_SYSTEM)
365 return enable_special_signals(m);
370 static void manager_clean_environment(Manager *m) {
373 /* Let's remove some environment variables that we
374 * need ourselves to communicate with our clients */
387 static int manager_default_environment(Manager *m) {
390 if (m->running_as == SYSTEMD_SYSTEM) {
391 /* The system manager always starts with a clean
392 * environment for its children. It does not import
393 * the kernel or the parents exported variables.
395 * The initial passed environ is untouched to keep
396 * /proc/self/environ valid; it is used for tagging
397 * the init process inside containers. */
398 m->environment = strv_new("PATH=" DEFAULT_PATH,
401 /* Import locale variables LC_*= from configuration */
402 locale_setup(&m->environment);
404 /* The user manager passes its own environment
405 * along to its children. */
406 m->environment = strv_copy(environ);
412 manager_clean_environment(m);
413 strv_sort(m->environment);
418 int manager_new(SystemdRunningAs running_as, bool test_run, Manager **_m) {
423 assert(running_as >= 0);
424 assert(running_as < _SYSTEMD_RUNNING_AS_MAX);
426 m = new0(Manager, 1);
431 if (running_as == SYSTEMD_SYSTEM && detect_container(NULL) <= 0)
432 boot_timestamps(&m->userspace_timestamp, &m->firmware_timestamp, &m->loader_timestamp);
435 m->running_as = running_as;
436 m->exit_code = _MANAGER_EXIT_CODE_INVALID;
437 m->default_timer_accuracy_usec = USEC_PER_MINUTE;
438 m->start_timeout_usec = DEFAULT_MANAGER_START_TIMEOUT_USEC;
439 m->start_timeout_action = FAILURE_ACTION_POWEROFF_FORCE;
441 m->idle_pipe[0] = m->idle_pipe[1] = m->idle_pipe[2] = m->idle_pipe[3] = -1;
443 m->pin_cgroupfs_fd = m->notify_fd = m->signal_fd = m->time_change_fd = m->dev_autofs_fd = m->private_listen_fd = m->kdbus_fd = -1;
444 m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
446 m->test_run = test_run;
448 r = manager_default_environment(m);
452 r = hashmap_ensure_allocated(&m->units, &string_hash_ops);
456 r = hashmap_ensure_allocated(&m->jobs, NULL);
460 r = hashmap_ensure_allocated(&m->cgroup_unit, &string_hash_ops);
464 r = hashmap_ensure_allocated(&m->watch_bus, &string_hash_ops);
468 r = set_ensure_allocated(&m->startup_units, NULL);
472 r = set_ensure_allocated(&m->failed_units, NULL);
476 r = sd_event_default(&m->event);
480 r = sd_event_add_defer(m->event, &m->run_queue_event_source, manager_dispatch_run_queue, m);
484 r = sd_event_source_set_priority(m->run_queue_event_source, SD_EVENT_PRIORITY_IDLE);
488 r = sd_event_source_set_enabled(m->run_queue_event_source, SD_EVENT_OFF);
492 r = manager_setup_signals(m);
496 r = manager_setup_cgroup(m);
500 r = manager_setup_time_change(m);
504 m->udev = udev_new();
510 /* Note that we set up neither kdbus, nor the notify fd
511 * here. We do that after deserialization, since they might
512 * have gotten serialized across the reexec. */
514 m->taint_usr = dir_is_empty("/usr") > 0;
524 static int manager_setup_notify(Manager *m) {
530 if (m->notify_fd < 0) {
531 _cleanup_close_ int fd = -1;
532 union sockaddr_union sa = {
533 .sa.sa_family = AF_UNIX,
535 static const int one = 1;
537 /* First free all secondary fields */
538 free(m->notify_socket);
539 m->notify_socket = NULL;
540 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
542 fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
544 log_error("Failed to allocate notification socket: %m");
548 if (m->running_as == SYSTEMD_SYSTEM)
549 m->notify_socket = strdup("/run/systemd/notify");
553 e = getenv("XDG_RUNTIME_DIR");
555 log_error("XDG_RUNTIME_DIR is not set: %m");
559 m->notify_socket = strappend(e, "/systemd/notify");
561 if (!m->notify_socket)
564 strncpy(sa.un.sun_path, m->notify_socket, sizeof(sa.un.sun_path)-1);
565 r = bind(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path));
567 log_error("bind(%s) failed: %m", sa.un.sun_path);
568 if (errno == EADDRINUSE) {
569 log_notice("Removing %s socket and trying again.", m->notify_socket);
570 r = unlink(m->notify_socket);
572 log_error("Failed to remove %s: %m", m->notify_socket);
576 r = bind(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path));
578 log_error("bind(%s) failed: %m", sa.un.sun_path);
585 r = setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
587 log_error("SO_PASSCRED failed: %m");
594 log_debug("Using notification socket %s", m->notify_socket);
597 if (!m->notify_event_source) {
598 r = sd_event_add_io(m->event, &m->notify_event_source, m->notify_fd, EPOLLIN, manager_dispatch_notify_fd, m);
600 log_error("Failed to allocate notify event source: %s", strerror(-r));
604 /* Process signals a bit earlier than SIGCHLD, so that we can
605 * still identify to which service an exit message belongs */
606 r = sd_event_source_set_priority(m->notify_event_source, -7);
608 log_error("Failed to set priority of notify event source: %s", strerror(-r));
616 static int manager_setup_kdbus(Manager *m) {
618 _cleanup_free_ char *p = NULL;
622 if (m->test_run || m->kdbus_fd >= 0)
625 m->kdbus_fd = bus_kernel_create_bus(m->running_as == SYSTEMD_SYSTEM ? "system" : "user", m->running_as == SYSTEMD_SYSTEM, &p);
626 if (m->kdbus_fd < 0) {
627 log_debug("Failed to set up kdbus: %s", strerror(-m->kdbus_fd));
631 log_debug("Successfully set up kdbus on %s", p);
633 /* Create the namespace directory here, so that the contents
634 * of that directory is not visible to non-root users. This is
635 * necessary to ensure that users cannot get access to busses
636 * of virtualized users when no UID namespacing is used. */
637 if (m->running_as == SYSTEMD_SYSTEM)
638 mkdir_p_label("/dev/kdbus/domain", 0700);
644 static int manager_connect_bus(Manager *m, bool reexecuting) {
645 bool try_bus_connect;
655 (m->running_as == SYSTEMD_USER && getenv("DBUS_SESSION_BUS_ADDRESS"));
657 /* Try to connect to the busses, if possible. */
658 return bus_init(m, try_bus_connect);
661 static unsigned manager_dispatch_cleanup_queue(Manager *m) {
667 while ((u = m->cleanup_queue)) {
668 assert(u->in_cleanup_queue);
678 GC_OFFSET_IN_PATH, /* This one is on the path we were traveling */
679 GC_OFFSET_UNSURE, /* No clue */
680 GC_OFFSET_GOOD, /* We still need this unit */
681 GC_OFFSET_BAD, /* We don't need this unit anymore */
685 static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
692 if (u->gc_marker == gc_marker + GC_OFFSET_GOOD ||
693 u->gc_marker == gc_marker + GC_OFFSET_BAD ||
694 u->gc_marker == gc_marker + GC_OFFSET_IN_PATH)
697 if (u->in_cleanup_queue)
700 if (unit_check_gc(u))
703 u->gc_marker = gc_marker + GC_OFFSET_IN_PATH;
707 SET_FOREACH(other, u->dependencies[UNIT_REFERENCED_BY], i) {
708 unit_gc_sweep(other, gc_marker);
710 if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
713 if (other->gc_marker != gc_marker + GC_OFFSET_BAD)
720 /* We were unable to find anything out about this entry, so
721 * let's investigate it later */
722 u->gc_marker = gc_marker + GC_OFFSET_UNSURE;
723 unit_add_to_gc_queue(u);
727 /* We definitely know that this one is not useful anymore, so
728 * let's mark it for deletion */
729 u->gc_marker = gc_marker + GC_OFFSET_BAD;
730 unit_add_to_cleanup_queue(u);
734 u->gc_marker = gc_marker + GC_OFFSET_GOOD;
737 static unsigned manager_dispatch_gc_queue(Manager *m) {
744 /* log_debug("Running GC..."); */
746 m->gc_marker += _GC_OFFSET_MAX;
747 if (m->gc_marker + _GC_OFFSET_MAX <= _GC_OFFSET_MAX)
750 gc_marker = m->gc_marker;
752 while ((u = m->gc_queue)) {
753 assert(u->in_gc_queue);
755 unit_gc_sweep(u, gc_marker);
757 LIST_REMOVE(gc_queue, m->gc_queue, u);
758 u->in_gc_queue = false;
762 if (u->gc_marker == gc_marker + GC_OFFSET_BAD ||
763 u->gc_marker == gc_marker + GC_OFFSET_UNSURE) {
764 log_debug_unit(u->id, "Collecting %s", u->id);
765 u->gc_marker = gc_marker + GC_OFFSET_BAD;
766 unit_add_to_cleanup_queue(u);
770 m->n_in_gc_queue = 0;
775 static void manager_clear_jobs_and_units(Manager *m) {
780 while ((u = hashmap_first(m->units)))
783 manager_dispatch_cleanup_queue(m);
785 assert(!m->load_queue);
786 assert(!m->run_queue);
787 assert(!m->dbus_unit_queue);
788 assert(!m->dbus_job_queue);
789 assert(!m->cleanup_queue);
790 assert(!m->gc_queue);
792 assert(hashmap_isempty(m->jobs));
793 assert(hashmap_isempty(m->units));
796 m->n_running_jobs = 0;
799 void manager_free(Manager *m) {
805 manager_clear_jobs_and_units(m);
807 for (c = 0; c < _UNIT_TYPE_MAX; c++)
808 if (unit_vtable[c]->shutdown)
809 unit_vtable[c]->shutdown(m);
811 /* If we reexecute ourselves, we keep the root cgroup
813 manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE);
815 manager_undo_generators(m);
819 hashmap_free(m->units);
820 hashmap_free(m->jobs);
821 hashmap_free(m->watch_pids1);
822 hashmap_free(m->watch_pids2);
823 hashmap_free(m->watch_bus);
825 set_free(m->startup_units);
826 set_free(m->failed_units);
828 sd_event_source_unref(m->signal_event_source);
829 sd_event_source_unref(m->notify_event_source);
830 sd_event_source_unref(m->time_change_event_source);
831 sd_event_source_unref(m->jobs_in_progress_event_source);
832 sd_event_source_unref(m->idle_pipe_event_source);
833 sd_event_source_unref(m->run_queue_event_source);
835 safe_close(m->signal_fd);
836 safe_close(m->notify_fd);
837 safe_close(m->time_change_fd);
838 safe_close(m->kdbus_fd);
840 manager_close_idle_pipe(m);
842 sd_event_source_unref(m->start_timeout_event_source);
843 free(m->start_timeout_reboot_arg);
846 sd_event_unref(m->event);
848 free(m->notify_socket);
850 lookup_paths_free(&m->lookup_paths);
851 strv_free(m->environment);
853 hashmap_free(m->cgroup_unit);
854 set_free_free(m->unit_path_cache);
856 free(m->switch_root);
857 free(m->switch_root_init);
859 for (i = 0; i < _RLIMIT_MAX; i++)
862 assert(hashmap_isempty(m->units_requiring_mounts_for));
863 hashmap_free(m->units_requiring_mounts_for);
868 int manager_enumerate(Manager *m) {
874 /* Let's ask every type to load all units from disk/kernel
875 * that it might know */
876 for (c = 0; c < _UNIT_TYPE_MAX; c++)
877 if (unit_vtable[c]->enumerate) {
878 q = unit_vtable[c]->enumerate(m);
883 manager_dispatch_load_queue(m);
887 static int manager_coldplug(Manager *m) {
895 /* Then, let's set up their initial state. */
896 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
903 q = unit_coldplug(u);
911 static void manager_build_unit_path_cache(Manager *m) {
913 _cleanup_closedir_ DIR *d = NULL;
918 set_free_free(m->unit_path_cache);
920 m->unit_path_cache = set_new(&string_hash_ops);
921 if (!m->unit_path_cache) {
922 log_error("Failed to allocate unit path cache.");
926 /* This simply builds a list of files we know exist, so that
927 * we don't always have to go to disk */
929 STRV_FOREACH(i, m->lookup_paths.unit_path) {
935 log_error("Failed to open directory %s: %m", *i);
939 while ((de = readdir(d))) {
942 if (ignore_file(de->d_name))
945 p = strjoin(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL);
951 r = set_consume(m->unit_path_cache, p);
963 log_error("Failed to build unit path cache: %s", strerror(-r));
965 set_free_free(m->unit_path_cache);
966 m->unit_path_cache = NULL;
970 static int manager_distribute_fds(Manager *m, FDSet *fds) {
977 HASHMAP_FOREACH(u, m->units, i) {
979 if (fdset_size(fds) <= 0)
982 if (UNIT_VTABLE(u)->distribute_fds) {
983 r = UNIT_VTABLE(u)->distribute_fds(u, fds);
992 static int on_start_timeout(sd_event_source *s, usec_t usec, void *userdata) {
993 Manager *m = userdata;
998 m->start_timeout_event_source = sd_event_source_unref(m->start_timeout_event_source);
1000 log_error("Startup timed out.");
1002 failure_action(m, m->start_timeout_action, m->start_timeout_reboot_arg);
1006 int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
1011 dual_timestamp_get(&m->generators_start_timestamp);
1012 manager_run_generators(m);
1013 dual_timestamp_get(&m->generators_finish_timestamp);
1015 r = lookup_paths_init(
1016 &m->lookup_paths, m->running_as, true,
1018 m->generator_unit_path,
1019 m->generator_unit_path_early,
1020 m->generator_unit_path_late);
1024 manager_build_unit_path_cache(m);
1026 /* If we will deserialize make sure that during enumeration
1027 * this is already known, so we increase the counter here
1032 /* First, enumerate what we can from all config files */
1033 dual_timestamp_get(&m->units_load_start_timestamp);
1034 r = manager_enumerate(m);
1035 dual_timestamp_get(&m->units_load_finish_timestamp);
1037 /* Second, deserialize if there is something to deserialize */
1039 r = manager_deserialize(m, serialization, fds);
1041 /* Any fds left? Find some unit which wants them. This is
1042 * useful to allow container managers to pass some file
1043 * descriptors to us pre-initialized. This enables
1044 * socket-based activation of entire containers. */
1045 if (fdset_size(fds) > 0) {
1046 q = manager_distribute_fds(m, fds);
1047 if (q < 0 && r == 0)
1051 /* We might have deserialized the notify fd, but if we didn't
1052 * then let's create the bus now */
1053 q = manager_setup_notify(m);
1054 if (q < 0 && r == 0)
1057 /* We might have deserialized the kdbus control fd, but if we
1058 * didn't, then let's create the bus now. */
1059 manager_setup_kdbus(m);
1060 manager_connect_bus(m, !!serialization);
1061 bus_track_coldplug(m, &m->subscribed, &m->deserialized_subscribed);
1063 /* Third, fire things up! */
1064 q = manager_coldplug(m);
1065 if (q < 0 && r == 0)
1068 if (serialization) {
1069 assert(m->n_reloading > 0);
1072 /* Let's wait for the UnitNew/JobNew messages being
1073 * sent, before we notify that the reload is
1075 m->send_reloading_done = true;
1078 /* Possibly set up a start timeout */
1079 if (!dual_timestamp_is_set(&m->finish_timestamp)) {
1080 m->start_timeout_event_source = sd_event_source_unref(m->start_timeout_event_source);
1082 if (m->start_timeout_usec) {
1083 r = sd_event_add_time(
1085 &m->start_timeout_event_source,
1087 now(CLOCK_MONOTONIC) + m->start_timeout_usec, 0,
1088 on_start_timeout, m);
1090 log_error("Failed to add start timeout event: %s", strerror(-r));
1097 int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
1102 assert(type < _JOB_TYPE_MAX);
1104 assert(mode < _JOB_MODE_MAX);
1106 if (mode == JOB_ISOLATE && type != JOB_START) {
1107 sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Isolate is only valid for start.");
1111 if (mode == JOB_ISOLATE && !unit->allow_isolate) {
1112 sd_bus_error_setf(e, BUS_ERROR_NO_ISOLATION, "Operation refused, unit may not be isolated.");
1116 log_debug_unit(unit->id,
1117 "Trying to enqueue job %s/%s/%s", unit->id,
1118 job_type_to_string(type), job_mode_to_string(mode));
1120 job_type_collapse(&type, unit);
1122 tr = transaction_new(mode == JOB_REPLACE_IRREVERSIBLY);
1126 r = transaction_add_job_and_dependencies(tr, type, unit, NULL, true, override, false,
1127 mode == JOB_IGNORE_DEPENDENCIES || mode == JOB_IGNORE_REQUIREMENTS,
1128 mode == JOB_IGNORE_DEPENDENCIES, e);
1132 if (mode == JOB_ISOLATE) {
1133 r = transaction_add_isolate_jobs(tr, m);
1138 r = transaction_activate(tr, m, mode, e);
1142 log_debug_unit(unit->id,
1143 "Enqueued job %s/%s as %u", unit->id,
1144 job_type_to_string(type), (unsigned) tr->anchor_job->id);
1147 *_ret = tr->anchor_job;
1149 transaction_free(tr);
1153 transaction_abort(tr);
1154 transaction_free(tr);
1158 int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
1163 assert(type < _JOB_TYPE_MAX);
1165 assert(mode < _JOB_MODE_MAX);
1167 r = manager_load_unit(m, name, NULL, NULL, &unit);
1171 return manager_add_job(m, type, unit, mode, override, e, _ret);
1174 Job *manager_get_job(Manager *m, uint32_t id) {
1177 return hashmap_get(m->jobs, UINT32_TO_PTR(id));
1180 Unit *manager_get_unit(Manager *m, const char *name) {
1184 return hashmap_get(m->units, name);
1187 unsigned manager_dispatch_load_queue(Manager *m) {
1193 /* Make sure we are not run recursively */
1194 if (m->dispatching_load_queue)
1197 m->dispatching_load_queue = true;
1199 /* Dispatches the load queue. Takes a unit from the queue and
1200 * tries to load its data until the queue is empty */
1202 while ((u = m->load_queue)) {
1203 assert(u->in_load_queue);
1209 m->dispatching_load_queue = false;
1213 int manager_load_unit_prepare(
1225 assert(name || path);
1227 /* This will prepare the unit for loading, but not actually
1228 * load anything from disk. */
1230 if (path && !is_path(path))
1231 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Path %s is not absolute.", path);
1234 name = basename(path);
1236 t = unit_name_to_type(name);
1238 if (t == _UNIT_TYPE_INVALID || !unit_name_is_valid(name, TEMPLATE_INVALID))
1239 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Unit name %s is not valid.", name);
1241 ret = manager_get_unit(m, name);
1247 ret = unit_new(m, unit_vtable[t]->object_size);
1252 ret->fragment_path = strdup(path);
1253 if (!ret->fragment_path) {
1259 r = unit_add_name(ret, name);
1265 unit_add_to_load_queue(ret);
1266 unit_add_to_dbus_queue(ret);
1267 unit_add_to_gc_queue(ret);
1275 int manager_load_unit(
1286 /* This will load the service information files, but not actually
1287 * start any services or anything. */
1289 r = manager_load_unit_prepare(m, name, path, e, _ret);
1293 manager_dispatch_load_queue(m);
1296 *_ret = unit_follow_merge(*_ret);
1301 void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
1308 HASHMAP_FOREACH(j, s->jobs, i)
1309 job_dump(j, f, prefix);
1312 void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
1320 HASHMAP_FOREACH_KEY(u, t, s->units, i)
1322 unit_dump(u, f, prefix);
1325 void manager_clear_jobs(Manager *m) {
1330 while ((j = hashmap_first(m->jobs)))
1331 /* No need to recurse. We're cancelling all jobs. */
1332 job_finish_and_invalidate(j, JOB_CANCELED, false);
1335 static int manager_dispatch_run_queue(sd_event_source *source, void *userdata) {
1336 Manager *m = userdata;
1342 while ((j = m->run_queue)) {
1343 assert(j->installed);
1344 assert(j->in_run_queue);
1346 job_run_and_invalidate(j);
1349 if (m->n_running_jobs > 0)
1350 manager_watch_jobs_in_progress(m);
1352 if (m->n_on_console > 0)
1353 manager_watch_idle_pipe(m);
1358 static unsigned manager_dispatch_dbus_queue(Manager *m) {
1365 if (m->dispatching_dbus_queue)
1368 m->dispatching_dbus_queue = true;
1370 while ((u = m->dbus_unit_queue)) {
1371 assert(u->in_dbus_queue);
1373 bus_unit_send_change_signal(u);
1377 while ((j = m->dbus_job_queue)) {
1378 assert(j->in_dbus_queue);
1380 bus_job_send_change_signal(j);
1384 m->dispatching_dbus_queue = false;
1386 if (m->send_reloading_done) {
1387 m->send_reloading_done = false;
1389 bus_manager_send_reloading(m, false);
1392 if (m->queued_message)
1393 bus_send_queued_message(m);
1398 static void manager_invoke_notify_message(Manager *m, Unit *u, pid_t pid, char *buf, size_t n) {
1399 _cleanup_strv_free_ char **tags = NULL;
1406 tags = strv_split(buf, "\n\r");
1412 log_debug_unit(u->id, "Got notification message for unit %s", u->id);
1414 if (UNIT_VTABLE(u)->notify_message)
1415 UNIT_VTABLE(u)->notify_message(u, pid, tags);
1418 static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1419 Manager *m = userdata;
1423 assert(m->notify_fd == fd);
1425 if (revents != EPOLLIN) {
1426 log_warning("Got unexpected poll event for notify fd.");
1432 struct iovec iovec = {
1434 .iov_len = sizeof(buf)-1,
1439 struct cmsghdr cmsghdr;
1440 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
1443 struct msghdr msghdr = {
1446 .msg_control = &control,
1447 .msg_controllen = sizeof(control),
1449 struct ucred *ucred;
1452 n = recvmsg(m->notify_fd, &msghdr, MSG_DONTWAIT);
1457 if (errno == EAGAIN || errno == EINTR)
1463 if (msghdr.msg_controllen < CMSG_LEN(sizeof(struct ucred)) ||
1464 control.cmsghdr.cmsg_level != SOL_SOCKET ||
1465 control.cmsghdr.cmsg_type != SCM_CREDENTIALS ||
1466 control.cmsghdr.cmsg_len != CMSG_LEN(sizeof(struct ucred))) {
1467 log_warning("Received notify message without credentials. Ignoring.");
1471 ucred = (struct ucred*) CMSG_DATA(&control.cmsghdr);
1473 assert((size_t) n < sizeof(buf));
1476 /* Notify every unit that might be interested, but try
1477 * to avoid notifying the same one multiple times. */
1478 u1 = manager_get_unit_by_pid(m, ucred->pid);
1480 manager_invoke_notify_message(m, u1, ucred->pid, buf, n);
1484 u2 = hashmap_get(m->watch_pids1, LONG_TO_PTR(ucred->pid));
1485 if (u2 && u2 != u1) {
1486 manager_invoke_notify_message(m, u2, ucred->pid, buf, n);
1490 u3 = hashmap_get(m->watch_pids2, LONG_TO_PTR(ucred->pid));
1491 if (u3 && u3 != u2 && u3 != u1) {
1492 manager_invoke_notify_message(m, u3, ucred->pid, buf, n);
1497 log_warning("Cannot find unit for notify message of PID "PID_FMT".", ucred->pid);
1503 static void invoke_sigchld_event(Manager *m, Unit *u, siginfo_t *si) {
1508 log_debug_unit(u->id, "Child "PID_FMT" belongs to %s", si->si_pid, u->id);
1510 unit_unwatch_pid(u, si->si_pid);
1511 UNIT_VTABLE(u)->sigchld_event(u, si->si_pid, si->si_code, si->si_status);
1514 static int manager_dispatch_sigchld(Manager *m) {
1520 /* First we call waitd() for a PID and do not reap the
1521 * zombie. That way we can still access /proc/$PID for
1522 * it while it is a zombie. */
1523 if (waitid(P_ALL, 0, &si, WEXITED|WNOHANG|WNOWAIT) < 0) {
1525 if (errno == ECHILD)
1537 if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
1538 _cleanup_free_ char *name = NULL;
1541 get_process_comm(si.si_pid, &name);
1543 log_debug("Child "PID_FMT" (%s) died (code=%s, status=%i/%s)",
1544 si.si_pid, strna(name),
1545 sigchld_code_to_string(si.si_code),
1547 strna(si.si_code == CLD_EXITED
1548 ? exit_status_to_string(si.si_status, EXIT_STATUS_FULL)
1549 : signal_to_string(si.si_status)));
1551 /* And now figure out the unit this belongs
1552 * to, it might be multiple... */
1553 u1 = manager_get_unit_by_pid(m, si.si_pid);
1555 invoke_sigchld_event(m, u1, &si);
1556 u2 = hashmap_get(m->watch_pids1, LONG_TO_PTR(si.si_pid));
1558 invoke_sigchld_event(m, u2, &si);
1559 u3 = hashmap_get(m->watch_pids2, LONG_TO_PTR(si.si_pid));
1560 if (u3 && u3 != u2 && u3 != u1)
1561 invoke_sigchld_event(m, u3, &si);
1564 /* And now, we actually reap the zombie. */
1565 if (waitid(P_PID, si.si_pid, &si, WEXITED) < 0) {
1576 static int manager_start_target(Manager *m, const char *name, JobMode mode) {
1577 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
1580 log_debug_unit(name, "Activating special unit %s", name);
1582 r = manager_add_job_by_name(m, JOB_START, name, mode, true, &error, NULL);
1584 log_error_unit(name, "Failed to enqueue %s job: %s", name, bus_error_message(&error, r));
1589 static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1590 Manager *m = userdata;
1592 struct signalfd_siginfo sfsi;
1593 bool sigchld = false;
1596 assert(m->signal_fd == fd);
1598 if (revents != EPOLLIN) {
1599 log_warning("Got unexpected events from signal file descriptor.");
1604 n = read(m->signal_fd, &sfsi, sizeof(sfsi));
1605 if (n != sizeof(sfsi)) {
1610 if (errno == EINTR || errno == EAGAIN)
1616 log_received_signal(sfsi.ssi_signo == SIGCHLD ||
1617 (sfsi.ssi_signo == SIGTERM && m->running_as == SYSTEMD_USER)
1618 ? LOG_DEBUG : LOG_INFO,
1621 switch (sfsi.ssi_signo) {
1628 if (m->running_as == SYSTEMD_SYSTEM) {
1629 /* This is for compatibility with the
1630 * original sysvinit */
1631 m->exit_code = MANAGER_REEXECUTE;
1638 if (m->running_as == SYSTEMD_SYSTEM) {
1639 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
1643 /* Run the exit target if there is one, if not, just exit. */
1644 if (manager_start_target(m, SPECIAL_EXIT_TARGET, JOB_REPLACE) < 0) {
1645 m->exit_code = MANAGER_EXIT;
1652 if (m->running_as == SYSTEMD_SYSTEM)
1653 manager_start_target(m, SPECIAL_KBREQUEST_TARGET, JOB_REPLACE);
1655 /* This is a nop on non-init */
1659 if (m->running_as == SYSTEMD_SYSTEM)
1660 manager_start_target(m, SPECIAL_SIGPWR_TARGET, JOB_REPLACE);
1662 /* This is a nop on non-init */
1668 u = manager_get_unit(m, SPECIAL_DBUS_SERVICE);
1670 if (!u || UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u))) {
1671 log_info("Trying to reconnect to bus...");
1675 if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) {
1676 log_info("Loading D-Bus service...");
1677 manager_start_target(m, SPECIAL_DBUS_SERVICE, JOB_REPLACE);
1684 _cleanup_free_ char *dump = NULL;
1685 _cleanup_fclose_ FILE *f = NULL;
1688 f = open_memstream(&dump, &size);
1690 log_warning("Failed to allocate memory stream.");
1694 manager_dump_units(m, f, "\t");
1695 manager_dump_jobs(m, f, "\t");
1698 log_warning("Failed to write status stream");
1703 log_warning("Failed to flush status stream");
1707 log_dump(LOG_INFO, dump);
1712 m->exit_code = MANAGER_RELOAD;
1717 /* Starting SIGRTMIN+0 */
1718 static const char * const target_table[] = {
1719 [0] = SPECIAL_DEFAULT_TARGET,
1720 [1] = SPECIAL_RESCUE_TARGET,
1721 [2] = SPECIAL_EMERGENCY_TARGET,
1722 [3] = SPECIAL_HALT_TARGET,
1723 [4] = SPECIAL_POWEROFF_TARGET,
1724 [5] = SPECIAL_REBOOT_TARGET,
1725 [6] = SPECIAL_KEXEC_TARGET
1728 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
1729 static const ManagerExitCode code_table[] = {
1731 [1] = MANAGER_POWEROFF,
1732 [2] = MANAGER_REBOOT,
1736 if ((int) sfsi.ssi_signo >= SIGRTMIN+0 &&
1737 (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) {
1738 int idx = (int) sfsi.ssi_signo - SIGRTMIN;
1739 manager_start_target(m, target_table[idx],
1740 (idx == 1 || idx == 2) ? JOB_ISOLATE : JOB_REPLACE);
1744 if ((int) sfsi.ssi_signo >= SIGRTMIN+13 &&
1745 (int) sfsi.ssi_signo < SIGRTMIN+13+(int) ELEMENTSOF(code_table)) {
1746 m->exit_code = code_table[sfsi.ssi_signo - SIGRTMIN - 13];
1750 switch (sfsi.ssi_signo - SIGRTMIN) {
1753 log_debug("Enabling showing of status.");
1754 manager_set_show_status(m, SHOW_STATUS_YES);
1758 log_debug("Disabling showing of status.");
1759 manager_set_show_status(m, SHOW_STATUS_NO);
1763 log_set_max_level(LOG_DEBUG);
1764 log_notice("Setting log level to debug.");
1768 log_set_max_level(LOG_INFO);
1769 log_notice("Setting log level to info.");
1773 if (m->running_as == SYSTEMD_USER) {
1774 m->exit_code = MANAGER_EXIT;
1778 /* This is a nop on init */
1782 case 29: /* compatibility: used to be mapped to LOG_TARGET_SYSLOG_OR_KMSG */
1783 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
1784 log_notice("Setting log target to journal-or-kmsg.");
1788 log_set_target(LOG_TARGET_CONSOLE);
1789 log_notice("Setting log target to console.");
1793 log_set_target(LOG_TARGET_KMSG);
1794 log_notice("Setting log target to kmsg.");
1798 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
1805 manager_dispatch_sigchld(m);
1810 static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1811 Manager *m = userdata;
1816 assert(m->time_change_fd == fd);
1818 log_struct(LOG_INFO,
1819 MESSAGE_ID(SD_MESSAGE_TIME_CHANGE),
1820 "MESSAGE=Time has been changed",
1823 /* Restart the watch */
1824 m->time_change_event_source = sd_event_source_unref(m->time_change_event_source);
1825 m->time_change_fd = safe_close(m->time_change_fd);
1827 manager_setup_time_change(m);
1829 HASHMAP_FOREACH(u, m->units, i)
1830 if (UNIT_VTABLE(u)->time_change)
1831 UNIT_VTABLE(u)->time_change(u);
1836 static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1837 Manager *m = userdata;
1840 assert(m->idle_pipe[2] == fd);
1842 m->no_console_output = m->n_on_console > 0;
1844 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
1845 manager_close_idle_pipe(m);
1850 static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata) {
1851 Manager *m = userdata;
1858 manager_print_jobs_in_progress(m);
1860 next = now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_PERIOD_USEC;
1861 r = sd_event_source_set_time(source, next);
1865 return sd_event_source_set_enabled(source, SD_EVENT_ONESHOT);
1868 int manager_loop(Manager *m) {
1871 RATELIMIT_DEFINE(rl, 1*USEC_PER_SEC, 50000);
1874 m->exit_code = MANAGER_OK;
1876 /* Release the path cache */
1877 set_free_free(m->unit_path_cache);
1878 m->unit_path_cache = NULL;
1880 manager_check_finished(m);
1882 /* There might still be some zombies hanging around from
1883 * before we were exec()'ed. Let's reap them. */
1884 r = manager_dispatch_sigchld(m);
1888 while (m->exit_code == MANAGER_OK) {
1891 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM)
1894 if (!ratelimit_test(&rl)) {
1895 /* Yay, something is going seriously wrong, pause a little */
1896 log_warning("Looping too fast. Throttling execution a little.");
1901 if (manager_dispatch_load_queue(m) > 0)
1904 if (manager_dispatch_gc_queue(m) > 0)
1907 if (manager_dispatch_cleanup_queue(m) > 0)
1910 if (manager_dispatch_cgroup_queue(m) > 0)
1913 if (manager_dispatch_dbus_queue(m) > 0)
1916 /* Sleep for half the watchdog time */
1917 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM) {
1918 wait_usec = m->runtime_watchdog / 2;
1922 wait_usec = USEC_INFINITY;
1924 r = sd_event_run(m->event, wait_usec);
1926 log_error("Failed to run event loop: %s", strerror(-r));
1931 return m->exit_code;
1934 int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u) {
1935 _cleanup_free_ char *n = NULL;
1943 r = unit_name_from_dbus_path(s, &n);
1947 r = manager_load_unit(m, n, NULL, e, &u);
1956 int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j) {
1966 p = startswith(s, "/org/freedesktop/systemd1/job/");
1970 r = safe_atou(p, &id);
1974 j = manager_get_job(m, id);
1983 void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
1986 _cleanup_free_ char *p = NULL;
1989 audit_fd = get_audit_fd();
1993 /* Don't generate audit events if the service was already
1994 * started and we're just deserializing */
1995 if (m->n_reloading > 0)
1998 if (m->running_as != SYSTEMD_SYSTEM)
2001 if (u->type != UNIT_SERVICE)
2004 p = unit_name_to_prefix_and_instance(u->id);
2006 log_error_unit(u->id,
2007 "Failed to allocate unit name for audit message: %s", strerror(ENOMEM));
2011 if (audit_log_user_comm_message(audit_fd, type, "", p, NULL, NULL, NULL, success) < 0) {
2012 if (errno == EPERM) {
2013 /* We aren't allowed to send audit messages?
2014 * Then let's not retry again. */
2017 log_warning("Failed to send audit message: %m");
2023 void manager_send_unit_plymouth(Manager *m, Unit *u) {
2024 union sockaddr_union sa = PLYMOUTH_SOCKET;
2027 _cleanup_free_ char *message = NULL;
2028 _cleanup_close_ int fd = -1;
2030 /* Don't generate plymouth events if the service was already
2031 * started and we're just deserializing */
2032 if (m->n_reloading > 0)
2035 if (m->running_as != SYSTEMD_SYSTEM)
2038 if (detect_container(NULL) > 0)
2041 if (u->type != UNIT_SERVICE &&
2042 u->type != UNIT_MOUNT &&
2043 u->type != UNIT_SWAP)
2046 /* We set SOCK_NONBLOCK here so that we rather drop the
2047 * message then wait for plymouth */
2048 fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
2050 log_error("socket() failed: %m");
2054 if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
2056 if (!IN_SET(errno, EPIPE, EAGAIN, ENOENT, ECONNREFUSED, ECONNRESET, ECONNABORTED))
2057 log_error("connect() failed: %m");
2061 if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->id) + 1), u->id, &n) < 0) {
2067 if (write(fd, message, n + 1) != n + 1)
2068 if (!IN_SET(errno, EPIPE, EAGAIN, ENOENT, ECONNREFUSED, ECONNRESET, ECONNABORTED))
2069 log_error("Failed to write Plymouth message: %m");
2072 void manager_dispatch_bus_name_owner_changed(
2075 const char* old_owner,
2076 const char *new_owner) {
2083 u = hashmap_get(m->watch_bus, name);
2087 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
2090 int manager_open_serialization(Manager *m, FILE **_f) {
2097 path = m->running_as == SYSTEMD_SYSTEM ? "/run/systemd" : "/tmp";
2098 fd = open_tmpfile(path, O_RDWR|O_CLOEXEC);
2102 log_debug("Serializing state to %s", path);
2104 f = fdopen(fd, "w+");
2115 int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
2128 fprintf(f, "current-job-id=%i\n", m->current_job_id);
2129 fprintf(f, "taint-usr=%s\n", yes_no(m->taint_usr));
2130 fprintf(f, "n-installed-jobs=%u\n", m->n_installed_jobs);
2131 fprintf(f, "n-failed-jobs=%u\n", m->n_failed_jobs);
2133 dual_timestamp_serialize(f, "firmware-timestamp", &m->firmware_timestamp);
2134 dual_timestamp_serialize(f, "loader-timestamp", &m->loader_timestamp);
2135 dual_timestamp_serialize(f, "kernel-timestamp", &m->kernel_timestamp);
2136 dual_timestamp_serialize(f, "initrd-timestamp", &m->initrd_timestamp);
2139 dual_timestamp_serialize(f, "userspace-timestamp", &m->userspace_timestamp);
2140 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
2141 dual_timestamp_serialize(f, "security-start-timestamp", &m->security_start_timestamp);
2142 dual_timestamp_serialize(f, "security-finish-timestamp", &m->security_finish_timestamp);
2143 dual_timestamp_serialize(f, "generators-start-timestamp", &m->generators_start_timestamp);
2144 dual_timestamp_serialize(f, "generators-finish-timestamp", &m->generators_finish_timestamp);
2145 dual_timestamp_serialize(f, "units-load-start-timestamp", &m->units_load_start_timestamp);
2146 dual_timestamp_serialize(f, "units-load-finish-timestamp", &m->units_load_finish_timestamp);
2149 if (!switching_root) {
2150 STRV_FOREACH(e, m->environment) {
2151 _cleanup_free_ char *ce;
2157 fprintf(f, "env=%s\n", *e);
2161 if (m->notify_fd >= 0) {
2164 copy = fdset_put_dup(fds, m->notify_fd);
2168 fprintf(f, "notify-fd=%i\n", copy);
2169 fprintf(f, "notify-socket=%s\n", m->notify_socket);
2172 if (m->kdbus_fd >= 0) {
2175 copy = fdset_put_dup(fds, m->kdbus_fd);
2179 fprintf(f, "kdbus-fd=%i\n", copy);
2182 bus_track_serialize(m->subscribed, f);
2186 HASHMAP_FOREACH_KEY(u, t, m->units, i) {
2194 r = unit_serialize(u, f, fds, !switching_root);
2201 assert(m->n_reloading > 0);
2207 r = bus_fdset_add_all(m, fds);
2214 int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
2220 log_debug("Deserializing state...");
2225 char line[LINE_MAX], *l;
2227 if (!fgets(line, sizeof(line), f)) {
2242 if (startswith(l, "current-job-id=")) {
2245 if (safe_atou32(l+15, &id) < 0)
2246 log_warning("Failed to parse current job id value %s", l+15);
2248 m->current_job_id = MAX(m->current_job_id, id);
2250 } else if (startswith(l, "n-installed-jobs=")) {
2253 if (safe_atou32(l+17, &n) < 0)
2254 log_warning("Failed to parse installed jobs counter %s", l+17);
2256 m->n_installed_jobs += n;
2258 } else if (startswith(l, "n-failed-jobs=")) {
2261 if (safe_atou32(l+14, &n) < 0)
2262 log_warning("Failed to parse failed jobs counter %s", l+14);
2264 m->n_failed_jobs += n;
2266 } else if (startswith(l, "taint-usr=")) {
2269 b = parse_boolean(l+10);
2271 log_warning("Failed to parse taint /usr flag %s", l+10);
2273 m->taint_usr = m->taint_usr || b;
2275 } else if (startswith(l, "firmware-timestamp="))
2276 dual_timestamp_deserialize(l+19, &m->firmware_timestamp);
2277 else if (startswith(l, "loader-timestamp="))
2278 dual_timestamp_deserialize(l+17, &m->loader_timestamp);
2279 else if (startswith(l, "kernel-timestamp="))
2280 dual_timestamp_deserialize(l+17, &m->kernel_timestamp);
2281 else if (startswith(l, "initrd-timestamp="))
2282 dual_timestamp_deserialize(l+17, &m->initrd_timestamp);
2283 else if (startswith(l, "userspace-timestamp="))
2284 dual_timestamp_deserialize(l+20, &m->userspace_timestamp);
2285 else if (startswith(l, "finish-timestamp="))
2286 dual_timestamp_deserialize(l+17, &m->finish_timestamp);
2287 else if (startswith(l, "security-start-timestamp="))
2288 dual_timestamp_deserialize(l+25, &m->security_start_timestamp);
2289 else if (startswith(l, "security-finish-timestamp="))
2290 dual_timestamp_deserialize(l+26, &m->security_finish_timestamp);
2291 else if (startswith(l, "generators-start-timestamp="))
2292 dual_timestamp_deserialize(l+27, &m->generators_start_timestamp);
2293 else if (startswith(l, "generators-finish-timestamp="))
2294 dual_timestamp_deserialize(l+28, &m->generators_finish_timestamp);
2295 else if (startswith(l, "units-load-start-timestamp="))
2296 dual_timestamp_deserialize(l+27, &m->units_load_start_timestamp);
2297 else if (startswith(l, "units-load-finish-timestamp="))
2298 dual_timestamp_deserialize(l+28, &m->units_load_finish_timestamp);
2299 else if (startswith(l, "env=")) {
2300 _cleanup_free_ char *uce = NULL;
2303 uce = cunescape(l+4);
2309 e = strv_env_set(m->environment, uce);
2315 strv_free(m->environment);
2318 } else if (startswith(l, "notify-fd=")) {
2321 if (safe_atoi(l + 10, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
2322 log_warning("Failed to parse notify fd: %s", l + 10);
2324 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
2325 safe_close(m->notify_fd);
2326 m->notify_fd = fdset_remove(fds, fd);
2329 } else if (startswith(l, "notify-socket=")) {
2338 free(m->notify_socket);
2339 m->notify_socket = n;
2341 } else if (startswith(l, "kdbus-fd=")) {
2344 if (safe_atoi(l + 9, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
2345 log_warning("Failed to parse kdbus fd: %s", l + 9);
2347 safe_close(m->kdbus_fd);
2348 m->kdbus_fd = fdset_remove(fds, fd);
2351 } else if (bus_track_deserialize_item(&m->deserialized_subscribed, l) == 0)
2352 log_warning("Unknown serialization item '%s'", l);
2357 char name[UNIT_NAME_MAX+2];
2360 if (!fgets(name, sizeof(name), f)) {
2371 r = manager_load_unit(m, strstrip(name), NULL, NULL, &u);
2375 r = unit_deserialize(u, f, fds);
2384 assert(m->n_reloading > 0);
2390 int manager_reload(Manager *m) {
2392 _cleanup_fclose_ FILE *f = NULL;
2393 _cleanup_fdset_free_ FDSet *fds = NULL;
2397 r = manager_open_serialization(m, &f);
2402 bus_manager_send_reloading(m, true);
2410 r = manager_serialize(m, f, fds, false);
2416 if (fseeko(f, 0, SEEK_SET) < 0) {
2421 /* From here on there is no way back. */
2422 manager_clear_jobs_and_units(m);
2423 manager_undo_generators(m);
2424 lookup_paths_free(&m->lookup_paths);
2426 /* Find new unit paths */
2427 manager_run_generators(m);
2429 q = lookup_paths_init(
2430 &m->lookup_paths, m->running_as, true,
2432 m->generator_unit_path,
2433 m->generator_unit_path_early,
2434 m->generator_unit_path_late);
2438 manager_build_unit_path_cache(m);
2440 /* First, enumerate what we can from all config files */
2441 q = manager_enumerate(m);
2445 /* Second, deserialize our stored data */
2446 q = manager_deserialize(m, f, fds);
2453 /* Re-register notify_fd as event source */
2454 q = manager_setup_notify(m);
2458 /* Third, fire things up! */
2459 q = manager_coldplug(m);
2463 assert(m->n_reloading > 0);
2466 m->send_reloading_done = true;
2471 bool manager_is_reloading_or_reexecuting(Manager *m) {
2474 return m->n_reloading != 0;
2477 void manager_reset_failed(Manager *m) {
2483 HASHMAP_FOREACH(u, m->units, i)
2484 unit_reset_failed(u);
2487 bool manager_unit_inactive_or_pending(Manager *m, const char *name) {
2493 /* Returns true if the unit is inactive or going down */
2494 u = manager_get_unit(m, name);
2498 return unit_inactive_or_pending(u);
2501 void manager_check_finished(Manager *m) {
2502 char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
2503 usec_t firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec;
2509 if (m->n_running_jobs == 0)
2510 m->jobs_in_progress_event_source = sd_event_source_unref(m->jobs_in_progress_event_source);
2512 if (hashmap_size(m->jobs) > 0) {
2514 if (m->jobs_in_progress_event_source)
2515 sd_event_source_set_time(m->jobs_in_progress_event_source, now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_WAIT_USEC);
2520 manager_flip_auto_status(m, false);
2522 /* Notify Type=idle units that we are done now */
2523 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
2524 manager_close_idle_pipe(m);
2526 /* Turn off confirm spawn now */
2527 m->confirm_spawn = false;
2529 /* This is no longer the first boot */
2530 manager_set_first_boot(m, false);
2532 if (dual_timestamp_is_set(&m->finish_timestamp))
2535 dual_timestamp_get(&m->finish_timestamp);
2537 m->start_timeout_event_source = sd_event_source_unref(m->start_timeout_event_source);
2539 if (m->running_as == SYSTEMD_SYSTEM && detect_container(NULL) <= 0) {
2541 /* Note that m->kernel_usec.monotonic is always at 0,
2542 * and m->firmware_usec.monotonic and
2543 * m->loader_usec.monotonic should be considered
2544 * negative values. */
2546 firmware_usec = m->firmware_timestamp.monotonic - m->loader_timestamp.monotonic;
2547 loader_usec = m->loader_timestamp.monotonic - m->kernel_timestamp.monotonic;
2548 userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
2549 total_usec = m->firmware_timestamp.monotonic + m->finish_timestamp.monotonic;
2551 if (dual_timestamp_is_set(&m->initrd_timestamp)) {
2553 kernel_usec = m->initrd_timestamp.monotonic - m->kernel_timestamp.monotonic;
2554 initrd_usec = m->userspace_timestamp.monotonic - m->initrd_timestamp.monotonic;
2556 log_struct(LOG_INFO,
2557 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2558 "KERNEL_USEC="USEC_FMT, kernel_usec,
2559 "INITRD_USEC="USEC_FMT, initrd_usec,
2560 "USERSPACE_USEC="USEC_FMT, userspace_usec,
2561 "MESSAGE=Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
2562 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2563 format_timespan(initrd, sizeof(initrd), initrd_usec, USEC_PER_MSEC),
2564 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2565 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
2568 kernel_usec = m->userspace_timestamp.monotonic - m->kernel_timestamp.monotonic;
2571 log_struct(LOG_INFO,
2572 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2573 "KERNEL_USEC="USEC_FMT, kernel_usec,
2574 "USERSPACE_USEC="USEC_FMT, userspace_usec,
2575 "MESSAGE=Startup finished in %s (kernel) + %s (userspace) = %s.",
2576 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2577 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2578 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
2582 firmware_usec = loader_usec = initrd_usec = kernel_usec = 0;
2583 total_usec = userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
2585 log_struct(LOG_INFO,
2586 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2587 "USERSPACE_USEC="USEC_FMT, userspace_usec,
2588 "MESSAGE=Startup finished in %s.",
2589 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
2593 SET_FOREACH(u, m->startup_units, i)
2595 cgroup_context_apply(unit_get_cgroup_context(u), unit_get_cgroup_mask(u), u->cgroup_path, manager_state(m));
2597 bus_manager_send_finished(m, firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec);
2601 "STATUS=Startup finished in %s.",
2602 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC));
2605 static int create_generator_dir(Manager *m, char **generator, const char *name) {
2616 if (m->running_as == SYSTEMD_SYSTEM && getpid() == 1) {
2617 /* systemd --system, not running --test */
2619 p = strappend("/run/systemd/", name);
2623 r = mkdir_p_label(p, 0755);
2625 log_error("Failed to create generator directory %s: %s",
2630 } else if (m->running_as == SYSTEMD_USER) {
2631 const char *s = NULL;
2633 s = getenv("XDG_RUNTIME_DIR");
2636 p = strjoin(s, "/systemd/", name, NULL);
2640 r = mkdir_p_label(p, 0755);
2642 log_error("Failed to create generator directory %s: %s",
2648 /* systemd --system --test */
2650 p = strjoin("/tmp/systemd-", name, ".XXXXXX", NULL);
2655 log_error("Failed to create generator directory %s: %m",
2666 static void trim_generator_dir(Manager *m, char **generator) {
2673 if (rmdir(*generator) >= 0) {
2681 void manager_run_generators(Manager *m) {
2682 _cleanup_closedir_ DIR *d = NULL;
2683 const char *generator_path;
2684 const char *argv[5];
2692 generator_path = m->running_as == SYSTEMD_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH;
2693 d = opendir(generator_path);
2695 if (errno == ENOENT)
2698 log_error("Failed to enumerate generator directory %s: %m",
2703 r = create_generator_dir(m, &m->generator_unit_path, "generator");
2707 r = create_generator_dir(m, &m->generator_unit_path_early, "generator.early");
2711 r = create_generator_dir(m, &m->generator_unit_path_late, "generator.late");
2715 argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
2716 argv[1] = m->generator_unit_path;
2717 argv[2] = m->generator_unit_path_early;
2718 argv[3] = m->generator_unit_path_late;
2721 RUN_WITH_UMASK(0022)
2722 execute_directory(generator_path, d, DEFAULT_TIMEOUT_USEC, (char**) argv);
2725 trim_generator_dir(m, &m->generator_unit_path);
2726 trim_generator_dir(m, &m->generator_unit_path_early);
2727 trim_generator_dir(m, &m->generator_unit_path_late);
2730 static void remove_generator_dir(Manager *m, char **generator) {
2737 strv_remove(m->lookup_paths.unit_path, *generator);
2738 rm_rf(*generator, false, true, false);
2744 void manager_undo_generators(Manager *m) {
2747 remove_generator_dir(m, &m->generator_unit_path);
2748 remove_generator_dir(m, &m->generator_unit_path_early);
2749 remove_generator_dir(m, &m->generator_unit_path_late);
2752 int manager_environment_add(Manager *m, char **minus, char **plus) {
2753 char **a = NULL, **b = NULL, **l;
2758 if (!strv_isempty(minus)) {
2759 a = strv_env_delete(l, 1, minus);
2766 if (!strv_isempty(plus)) {
2767 b = strv_env_merge(2, l, plus);
2776 if (m->environment != l)
2777 strv_free(m->environment);
2784 manager_clean_environment(m);
2785 strv_sort(m->environment);
2790 int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
2795 for (i = 0; i < _RLIMIT_MAX; i++) {
2796 if (!default_rlimit[i])
2799 m->rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
2807 void manager_recheck_journal(Manager *m) {
2812 if (m->running_as != SYSTEMD_SYSTEM)
2815 u = manager_get_unit(m, SPECIAL_JOURNALD_SOCKET);
2816 if (u && SOCKET(u)->state != SOCKET_RUNNING) {
2817 log_close_journal();
2821 u = manager_get_unit(m, SPECIAL_JOURNALD_SERVICE);
2822 if (u && SERVICE(u)->state != SERVICE_RUNNING) {
2823 log_close_journal();
2827 /* Hmm, OK, so the socket is fully up and the service is up
2828 * too, then let's make use of the thing. */
2832 void manager_set_show_status(Manager *m, ShowStatus mode) {
2834 assert(IN_SET(mode, SHOW_STATUS_AUTO, SHOW_STATUS_NO, SHOW_STATUS_YES, SHOW_STATUS_TEMPORARY));
2836 if (m->running_as != SYSTEMD_SYSTEM)
2839 m->show_status = mode;
2842 touch("/run/systemd/show-status");
2844 unlink("/run/systemd/show-status");
2847 static bool manager_get_show_status(Manager *m) {
2850 if (m->running_as != SYSTEMD_SYSTEM)
2853 if (m->no_console_output)
2856 if (!IN_SET(manager_state(m), MANAGER_INITIALIZING, MANAGER_STARTING, MANAGER_STOPPING))
2859 if (m->show_status > 0)
2862 /* If Plymouth is running make sure we show the status, so
2863 * that there's something nice to see when people press Esc */
2865 return plymouth_running();
2868 void manager_set_first_boot(Manager *m, bool b) {
2871 if (m->running_as != SYSTEMD_SYSTEM)
2877 touch("/run/systemd/first-boot");
2879 unlink("/run/systemd/first-boot");
2882 void manager_status_printf(Manager *m, bool ephemeral, const char *status, const char *format, ...) {
2885 if (!manager_get_show_status(m))
2888 /* XXX We should totally drop the check for ephemeral here
2889 * and thus effectively make 'Type=idle' pointless. */
2890 if (ephemeral && m->n_on_console > 0)
2893 va_start(ap, format);
2894 status_vprintf(status, true, ephemeral, format, ap);
2898 int manager_get_unit_by_path(Manager *m, const char *path, const char *suffix, Unit **_found) {
2899 _cleanup_free_ char *p = NULL;
2907 p = unit_name_from_path(path, suffix);
2911 found = manager_get_unit(m, p);
2921 Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path) {
2922 char p[strlen(path)+1];
2928 path_kill_slashes(p);
2930 return hashmap_get(m->units_requiring_mounts_for, streq(p, "/") ? "" : p);
2933 const char *manager_get_runtime_prefix(Manager *m) {
2936 return m->running_as == SYSTEMD_SYSTEM ?
2938 getenv("XDG_RUNTIME_DIR");
2941 ManagerState manager_state(Manager *m) {
2946 /* Did we ever finish booting? If not then we are still starting up */
2947 if (!dual_timestamp_is_set(&m->finish_timestamp)) {
2949 u = manager_get_unit(m, SPECIAL_BASIC_TARGET);
2950 if (!u || !UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u)))
2951 return MANAGER_INITIALIZING;
2953 return MANAGER_STARTING;
2956 /* Is the special shutdown target queued? If so, we are in shutdown state */
2957 u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
2958 if (u && u->job && IN_SET(u->job->type, JOB_START, JOB_RESTART, JOB_TRY_RESTART, JOB_RELOAD_OR_START))
2959 return MANAGER_STOPPING;
2961 /* Are the rescue or emergency targets active or queued? If so we are in maintenance state */
2962 u = manager_get_unit(m, SPECIAL_RESCUE_TARGET);
2963 if (u && (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)) ||
2964 (u->job && IN_SET(u->job->type, JOB_START, JOB_RESTART, JOB_TRY_RESTART, JOB_RELOAD_OR_START))))
2965 return MANAGER_MAINTENANCE;
2967 u = manager_get_unit(m, SPECIAL_EMERGENCY_TARGET);
2968 if (u && (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)) ||
2969 (u->job && IN_SET(u->job->type, JOB_START, JOB_RESTART, JOB_TRY_RESTART, JOB_RELOAD_OR_START))))
2970 return MANAGER_MAINTENANCE;
2972 /* Are there any failed units? If so, we are in degraded mode */
2973 if (set_size(m->failed_units) > 0)
2974 return MANAGER_DEGRADED;
2976 return MANAGER_RUNNING;
2979 static const char *const manager_state_table[_MANAGER_STATE_MAX] = {
2980 [MANAGER_INITIALIZING] = "initializing",
2981 [MANAGER_STARTING] = "starting",
2982 [MANAGER_RUNNING] = "running",
2983 [MANAGER_DEGRADED] = "degraded",
2984 [MANAGER_MAINTENANCE] = "maintenance",
2985 [MANAGER_STOPPING] = "stopping",
2988 DEFINE_STRING_TABLE_LOOKUP(manager_state, ManagerState);