chiark / gitweb /
unit: When stopping due to BindsTo=, log which unit caused it
[elogind.git] / src / core / manager.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #pragma once
4
5 /***
6   This file is part of systemd.
7
8   Copyright 2010 Lennart Poettering
9
10   systemd is free software; you can redistribute it and/or modify it
11   under the terms of the GNU Lesser General Public License as published by
12   the Free Software Foundation; either version 2.1 of the License, or
13   (at your option) any later version.
14
15   systemd is distributed in the hope that it will be useful, but
16   WITHOUT ANY WARRANTY; without even the implied warranty of
17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18   Lesser General Public License for more details.
19
20   You should have received a copy of the GNU Lesser General Public License
21   along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 ***/
23
24 #include <stdbool.h>
25 #include <stdio.h>
26
27 #include "sd-bus.h"
28 #include "sd-event.h"
29 #include "fdset.h"
30 #include "cgroup-util.h"
31 #include "hashmap.h"
32 #include "list.h"
33 #include "ratelimit.h"
34
35 /* Enforce upper limit how many names we allow */
36 #define MANAGER_MAX_NAMES 131072 /* 128K */
37
38 typedef struct Manager Manager;
39
40 typedef enum ManagerState {
41         MANAGER_INITIALIZING,
42         MANAGER_STARTING,
43         MANAGER_RUNNING,
44         MANAGER_DEGRADED,
45         MANAGER_MAINTENANCE,
46         MANAGER_STOPPING,
47         _MANAGER_STATE_MAX,
48         _MANAGER_STATE_INVALID = -1
49 } ManagerState;
50
51 typedef enum ManagerExitCode {
52         MANAGER_OK,
53         MANAGER_EXIT,
54         MANAGER_RELOAD,
55         MANAGER_REEXECUTE,
56         MANAGER_REBOOT,
57         MANAGER_POWEROFF,
58         MANAGER_HALT,
59         MANAGER_KEXEC,
60         MANAGER_SWITCH_ROOT,
61         _MANAGER_EXIT_CODE_MAX,
62         _MANAGER_EXIT_CODE_INVALID = -1
63 } ManagerExitCode;
64
65 typedef enum StatusType {
66         STATUS_TYPE_EPHEMERAL,
67         STATUS_TYPE_NORMAL,
68         STATUS_TYPE_EMERGENCY,
69 } StatusType;
70
71 #include "job.h"
72 #include "path-lookup.h"
73 #include "execute.h"
74 #include "unit-name.h"
75 #include "show-status.h"
76
77 struct Manager {
78         /* Note that the set of units we know of is allowed to be
79          * inconsistent. However the subset of it that is loaded may
80          * not, and the list of jobs may neither. */
81
82         /* Active jobs and units */
83         Hashmap *units;  /* name string => Unit object n:1 */
84         Hashmap *jobs;   /* job id => Job object 1:1 */
85
86         /* To make it easy to iterate through the units of a specific
87          * type we maintain a per type linked list */
88         LIST_HEAD(Unit, units_by_type[_UNIT_TYPE_MAX]);
89
90         /* Units that need to be loaded */
91         LIST_HEAD(Unit, load_queue); /* this is actually more a stack than a queue, but uh. */
92
93         /* Jobs that need to be run */
94         LIST_HEAD(Job, run_queue);   /* more a stack than a queue, too */
95
96         /* Units and jobs that have not yet been announced via
97          * D-Bus. When something about a job changes it is added here
98          * if it is not in there yet. This allows easy coalescing of
99          * D-Bus change signals. */
100         LIST_HEAD(Unit, dbus_unit_queue);
101         LIST_HEAD(Job, dbus_job_queue);
102
103         /* Units to remove */
104         LIST_HEAD(Unit, cleanup_queue);
105
106         /* Units to check when doing GC */
107         LIST_HEAD(Unit, gc_queue);
108
109         /* Units that should be realized */
110         LIST_HEAD(Unit, cgroup_queue);
111
112         sd_event *event;
113
114         /* We use two hash tables here, since the same PID might be
115          * watched by two different units: once the unit that forked
116          * it off, and possibly a different unit to which it was
117          * joined as cgroup member. Since we know that it is either
118          * one or two units for each PID we just use to hashmaps
119          * here. */
120         Hashmap *watch_pids1;  /* pid => Unit object n:1 */
121         Hashmap *watch_pids2;  /* pid => Unit object n:1 */
122
123         /* A set contains all units which cgroup should be refreshed after startup */
124         Set *startup_units;
125
126         /* A set which contains all currently failed units */
127         Set *failed_units;
128
129         sd_event_source *run_queue_event_source;
130
131         char *notify_socket;
132         int notify_fd;
133         sd_event_source *notify_event_source;
134
135         int signal_fd;
136         sd_event_source *signal_event_source;
137
138         int time_change_fd;
139         sd_event_source *time_change_event_source;
140
141         sd_event_source *jobs_in_progress_event_source;
142
143         unsigned n_snapshots;
144
145         LookupPaths lookup_paths;
146         Set *unit_path_cache;
147
148         char **environment;
149
150         usec_t runtime_watchdog;
151         usec_t shutdown_watchdog;
152
153         dual_timestamp firmware_timestamp;
154         dual_timestamp loader_timestamp;
155         dual_timestamp kernel_timestamp;
156         dual_timestamp initrd_timestamp;
157         dual_timestamp userspace_timestamp;
158         dual_timestamp finish_timestamp;
159
160         dual_timestamp security_start_timestamp;
161         dual_timestamp security_finish_timestamp;
162         dual_timestamp generators_start_timestamp;
163         dual_timestamp generators_finish_timestamp;
164         dual_timestamp units_load_start_timestamp;
165         dual_timestamp units_load_finish_timestamp;
166
167         char *generator_unit_path;
168         char *generator_unit_path_early;
169         char *generator_unit_path_late;
170
171         struct udev* udev;
172
173         /* Data specific to the device subsystem */
174         struct udev_monitor* udev_monitor;
175         sd_event_source *udev_event_source;
176         Hashmap *devices_by_sysfs;
177
178         /* Data specific to the mount subsystem */
179         FILE *proc_self_mountinfo;
180         sd_event_source *mount_event_source;
181         int utab_inotify_fd;
182         sd_event_source *mount_utab_event_source;
183
184         /* Data specific to the swap filesystem */
185         FILE *proc_swaps;
186         sd_event_source *swap_event_source;
187         Hashmap *swaps_by_devnode;
188
189         /* Data specific to the D-Bus subsystem */
190         sd_bus *api_bus, *system_bus;
191         Set *private_buses;
192         int private_listen_fd;
193         sd_event_source *private_listen_event_source;
194
195         /* Contains all the clients that are subscribed to signals via
196         the API bus. Note that private bus connections are always
197         considered subscribes, since they last for very short only,
198         and it is much simpler that way. */
199         sd_bus_track *subscribed;
200         char **deserialized_subscribed;
201
202         sd_bus_message *queued_message; /* This is used during reloading:
203                                       * before the reload we queue the
204                                       * reply message here, and
205                                       * afterwards we send it */
206         sd_bus *queued_message_bus; /* The connection to send the queued message on */
207
208         Hashmap *watch_bus;  /* D-Bus names => Unit object n:1 */
209
210         bool send_reloading_done;
211
212         uint32_t current_job_id;
213         uint32_t default_unit_job_id;
214
215         /* Data specific to the Automount subsystem */
216         int dev_autofs_fd;
217
218         /* Data specific to the cgroup subsystem */
219         Hashmap *cgroup_unit;
220         CGroupControllerMask cgroup_supported;
221         char *cgroup_root;
222
223         int gc_marker;
224         unsigned n_in_gc_queue;
225
226         /* Make sure the user cannot accidentally unmount our cgroup
227          * file system */
228         int pin_cgroupfs_fd;
229
230         /* Flags */
231         SystemdRunningAs running_as;
232         ManagerExitCode exit_code:5;
233
234         bool dispatching_load_queue:1;
235         bool dispatching_dbus_queue:1;
236
237         bool taint_usr:1;
238         bool first_boot:1;
239
240         bool test_run:1;
241
242         ShowStatus show_status;
243         bool confirm_spawn;
244         bool no_console_output;
245
246         ExecOutput default_std_output, default_std_error;
247
248         usec_t default_restart_usec, default_timeout_start_usec, default_timeout_stop_usec;
249
250         usec_t default_start_limit_interval;
251         unsigned default_start_limit_burst;
252
253         bool default_cpu_accounting;
254         bool default_memory_accounting;
255         bool default_blockio_accounting;
256
257         usec_t default_timer_accuracy_usec;
258
259         struct rlimit *rlimit[_RLIMIT_MAX];
260
261         /* non-zero if we are reloading or reexecuting, */
262         int n_reloading;
263
264         unsigned n_installed_jobs;
265         unsigned n_failed_jobs;
266
267         /* Jobs in progress watching */
268         unsigned n_running_jobs;
269         unsigned n_on_console;
270         unsigned jobs_in_progress_iteration;
271
272         /* Do we have any outstanding password prompts? */
273         int have_ask_password;
274         int ask_password_inotify_fd;
275         sd_event_source *ask_password_event_source;
276
277         /* Type=idle pipes */
278         int idle_pipe[4];
279         sd_event_source *idle_pipe_event_source;
280
281         char *switch_root;
282         char *switch_root_init;
283
284         /* This maps all possible path prefixes to the units needing
285          * them. It's a hashmap with a path string as key and a Set as
286          * value where Unit objects are contained. */
287         Hashmap *units_requiring_mounts_for;
288
289         /* Reference to the kdbus bus control fd */
290         int kdbus_fd;
291
292         /* Used for processing polkit authorization responses */
293         Hashmap *polkit_registry;
294
295         /* When the user hits C-A-D more than 7 times per 2s, reboot immediately... */
296         RateLimit ctrl_alt_del_ratelimit;
297 };
298
299 int manager_new(SystemdRunningAs running_as, bool test_run, Manager **m);
300 Manager* manager_free(Manager *m);
301
302 int manager_enumerate(Manager *m);
303 int manager_startup(Manager *m, FILE *serialization, FDSet *fds);
304
305 Job *manager_get_job(Manager *m, uint32_t id);
306 Unit *manager_get_unit(Manager *m, const char *name);
307
308 int manager_get_unit_by_path(Manager *m, const char *path, const char *suffix, Unit **_found);
309
310 int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j);
311
312 int manager_load_unit_prepare(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **_ret);
313 int manager_load_unit(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **_ret);
314 int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u);
315
316 int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool force, sd_bus_error *e, Job **_ret);
317 int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool force, sd_bus_error *e, Job **_ret);
318
319 void manager_dump_units(Manager *s, FILE *f, const char *prefix);
320 void manager_dump_jobs(Manager *s, FILE *f, const char *prefix);
321
322 void manager_clear_jobs(Manager *m);
323
324 unsigned manager_dispatch_load_queue(Manager *m);
325
326 int manager_environment_add(Manager *m, char **minus, char **plus);
327 int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit);
328
329 int manager_loop(Manager *m);
330
331 void manager_dispatch_bus_name_owner_changed(Manager *m, const char *name, const char* old_owner, const char *new_owner);
332
333 int manager_open_serialization(Manager *m, FILE **_f);
334
335 int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root);
336 int manager_deserialize(Manager *m, FILE *f, FDSet *fds);
337
338 int manager_reload(Manager *m);
339
340 bool manager_is_reloading_or_reexecuting(Manager *m) _pure_;
341
342 void manager_reset_failed(Manager *m);
343
344 void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success);
345 void manager_send_unit_plymouth(Manager *m, Unit *u);
346
347 bool manager_unit_inactive_or_pending(Manager *m, const char *name);
348
349 void manager_check_finished(Manager *m);
350
351 void manager_recheck_journal(Manager *m);
352
353 void manager_set_show_status(Manager *m, ShowStatus mode);
354 void manager_set_first_boot(Manager *m, bool b);
355
356 void manager_status_printf(Manager *m, StatusType type, const char *status, const char *format, ...) _printf_(4,5);
357 void manager_flip_auto_status(Manager *m, bool enable);
358
359 Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path);
360
361 const char *manager_get_runtime_prefix(Manager *m);
362
363 ManagerState manager_state(Manager *m);
364
365 const char *manager_state_to_string(ManagerState m) _const_;
366 ManagerState manager_state_from_string(const char *s) _pure_;