chiark / gitweb /
core: add global settings for enabling CPUAccounting=, MemoryAccounting=, BlockIOAcco...
[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 <inttypes.h>
26 #include <stdio.h>
27
28 #include "sd-bus.h"
29 #include "sd-event.h"
30 #include "fdset.h"
31 #include "cgroup-util.h"
32
33 /* Enforce upper limit how many names we allow */
34 #define MANAGER_MAX_NAMES 131072 /* 128K */
35
36 typedef struct Manager Manager;
37
38 typedef enum ManagerExitCode {
39         MANAGER_RUNNING,
40         MANAGER_EXIT,
41         MANAGER_RELOAD,
42         MANAGER_REEXECUTE,
43         MANAGER_REBOOT,
44         MANAGER_POWEROFF,
45         MANAGER_HALT,
46         MANAGER_KEXEC,
47         MANAGER_SWITCH_ROOT,
48         _MANAGER_EXIT_CODE_MAX,
49         _MANAGER_EXIT_CODE_INVALID = -1
50 } ManagerExitCode;
51
52 #include "unit.h"
53 #include "job.h"
54 #include "hashmap.h"
55 #include "list.h"
56 #include "set.h"
57 #include "path-lookup.h"
58 #include "execute.h"
59 #include "unit-name.h"
60 #include "exit-status.h"
61
62 struct Manager {
63         /* Note that the set of units we know of is allowed to be
64          * inconsistent. However the subset of it that is loaded may
65          * not, and the list of jobs may neither. */
66
67         /* Active jobs and units */
68         Hashmap *units;  /* name string => Unit object n:1 */
69         Hashmap *jobs;   /* job id => Job object 1:1 */
70
71         /* To make it easy to iterate through the units of a specific
72          * type we maintain a per type linked list */
73         LIST_HEAD(Unit, units_by_type[_UNIT_TYPE_MAX]);
74
75         /* Units that need to be loaded */
76         LIST_HEAD(Unit, load_queue); /* this is actually more a stack than a queue, but uh. */
77
78         /* Jobs that need to be run */
79         LIST_HEAD(Job, run_queue);   /* more a stack than a queue, too */
80
81         /* Units and jobs that have not yet been announced via
82          * D-Bus. When something about a job changes it is added here
83          * if it is not in there yet. This allows easy coalescing of
84          * D-Bus change signals. */
85         LIST_HEAD(Unit, dbus_unit_queue);
86         LIST_HEAD(Job, dbus_job_queue);
87
88         /* Units to remove */
89         LIST_HEAD(Unit, cleanup_queue);
90
91         /* Units to check when doing GC */
92         LIST_HEAD(Unit, gc_queue);
93
94         /* Units that should be realized */
95         LIST_HEAD(Unit, cgroup_queue);
96
97         sd_event *event;
98
99         /* We use two hash tables here, since the same PID might be
100          * watched by two different units: once the unit that forked
101          * it off, and possibly a different unit to which it was
102          * joined as cgroup member. Since we know that it is either
103          * one or two units for each PID we just use to hashmaps
104          * here. */
105         Hashmap *watch_pids1;  /* pid => Unit object n:1 */
106         Hashmap *watch_pids2;  /* pid => Unit object n:1 */
107
108         sd_event_source *run_queue_event_source;
109
110         char *notify_socket;
111         int notify_fd;
112         sd_event_source *notify_event_source;
113
114         int signal_fd;
115         sd_event_source *signal_event_source;
116
117         int time_change_fd;
118         sd_event_source *time_change_event_source;
119
120         sd_event_source *jobs_in_progress_event_source;
121
122         unsigned n_snapshots;
123
124         LookupPaths lookup_paths;
125         Set *unit_path_cache;
126
127         char **environment;
128
129         usec_t runtime_watchdog;
130         usec_t shutdown_watchdog;
131
132         dual_timestamp firmware_timestamp;
133         dual_timestamp loader_timestamp;
134         dual_timestamp kernel_timestamp;
135         dual_timestamp initrd_timestamp;
136         dual_timestamp userspace_timestamp;
137         dual_timestamp finish_timestamp;
138         dual_timestamp security_start_timestamp;
139         dual_timestamp security_finish_timestamp;
140         dual_timestamp generators_start_timestamp;
141         dual_timestamp generators_finish_timestamp;
142         dual_timestamp units_load_start_timestamp;
143         dual_timestamp units_load_finish_timestamp;
144
145         char *generator_unit_path;
146         char *generator_unit_path_early;
147         char *generator_unit_path_late;
148
149         struct udev* udev;
150
151         /* Data specific to the device subsystem */
152         struct udev_monitor* udev_monitor;
153         sd_event_source *udev_event_source;
154         Hashmap *devices_by_sysfs;
155
156         /* Data specific to the mount subsystem */
157         FILE *proc_self_mountinfo;
158         sd_event_source *mount_event_source;
159
160         /* Data specific to the swap filesystem */
161         FILE *proc_swaps;
162         sd_event_source *swap_event_source;
163         Hashmap *swaps_by_devnode;
164
165         /* Data specific to the D-Bus subsystem */
166         sd_bus *api_bus, *system_bus;
167         Set *private_buses;
168         int private_listen_fd;
169         sd_event_source *private_listen_event_source;
170         Set *subscribed;
171
172         sd_bus_message *queued_message; /* This is used during reloading:
173                                       * before the reload we queue the
174                                       * reply message here, and
175                                       * afterwards we send it */
176         sd_bus *queued_message_bus; /* The connection to send the queued message on */
177
178         Hashmap *watch_bus;  /* D-Bus names => Unit object n:1 */
179
180         bool send_reloading_done;
181
182         uint32_t current_job_id;
183         uint32_t default_unit_job_id;
184
185         /* Data specific to the Automount subsystem */
186         int dev_autofs_fd;
187
188         /* Data specific to the cgroup subsystem */
189         Hashmap *cgroup_unit;
190         CGroupControllerMask cgroup_supported;
191         char *cgroup_root;
192
193         int gc_marker;
194         unsigned n_in_gc_queue;
195
196         /* Make sure the user cannot accidentally unmount our cgroup
197          * file system */
198         int pin_cgroupfs_fd;
199
200         /* Flags */
201         SystemdRunningAs running_as;
202         ManagerExitCode exit_code:5;
203
204         bool dispatching_load_queue:1;
205         bool dispatching_dbus_queue:1;
206
207         bool taint_usr:1;
208
209         ShowStatus show_status;
210         bool confirm_spawn;
211         bool no_console_output;
212
213         ExecOutput default_std_output, default_std_error;
214
215         usec_t default_restart_usec, default_timeout_start_usec, default_timeout_stop_usec;
216
217         usec_t default_start_limit_interval;
218         unsigned default_start_limit_burst;
219
220         bool default_cpu_accounting;
221         bool default_memory_accounting;
222         bool default_blockio_accounting;
223
224         struct rlimit *rlimit[RLIMIT_NLIMITS];
225
226         /* non-zero if we are reloading or reexecuting, */
227         int n_reloading;
228
229         unsigned n_installed_jobs;
230         unsigned n_failed_jobs;
231
232         /* Jobs in progress watching */
233         unsigned n_running_jobs;
234         unsigned n_on_console;
235         unsigned jobs_in_progress_iteration;
236
237         /* Type=idle pipes */
238         int idle_pipe[4];
239         sd_event_source *idle_pipe_event_source;
240
241         char *switch_root;
242         char *switch_root_init;
243
244         /* This maps all possible path prefixes to the units needing
245          * them. It's a hashmap with a path string as key and a Set as
246          * value where Unit objects are contained. */
247         Hashmap *units_requiring_mounts_for;
248
249         /* Reference to the kdbus bus control fd */
250         int kdbus_fd;
251 };
252
253 int manager_new(SystemdRunningAs running_as, Manager **m);
254 void manager_free(Manager *m);
255
256 int manager_enumerate(Manager *m);
257 int manager_startup(Manager *m, FILE *serialization, FDSet *fds);
258
259 Job *manager_get_job(Manager *m, uint32_t id);
260 Unit *manager_get_unit(Manager *m, const char *name);
261
262 int manager_get_unit_by_path(Manager *m, const char *path, const char *suffix, Unit **_found);
263
264 int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j);
265
266 int manager_load_unit_prepare(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **_ret);
267 int manager_load_unit(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **_ret);
268 int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u);
269
270 int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool force, sd_bus_error *e, Job **_ret);
271 int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool force, sd_bus_error *e, Job **_ret);
272
273 void manager_dump_units(Manager *s, FILE *f, const char *prefix);
274 void manager_dump_jobs(Manager *s, FILE *f, const char *prefix);
275
276 void manager_clear_jobs(Manager *m);
277
278 unsigned manager_dispatch_load_queue(Manager *m);
279
280 int manager_environment_add(Manager *m, char **minus, char **plus);
281 int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit);
282
283 int manager_loop(Manager *m);
284
285 void manager_dispatch_bus_name_owner_changed(Manager *m, const char *name, const char* old_owner, const char *new_owner);
286
287 int manager_open_serialization(Manager *m, FILE **_f);
288
289 int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root);
290 int manager_deserialize(Manager *m, FILE *f, FDSet *fds);
291
292 int manager_reload(Manager *m);
293
294 bool manager_is_reloading_or_reexecuting(Manager *m) _pure_;
295
296 void manager_reset_failed(Manager *m);
297
298 void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success);
299 void manager_send_unit_plymouth(Manager *m, Unit *u);
300
301 bool manager_unit_inactive_or_pending(Manager *m, const char *name);
302
303 void manager_check_finished(Manager *m);
304
305 void manager_run_generators(Manager *m);
306 void manager_undo_generators(Manager *m);
307
308 void manager_recheck_journal(Manager *m);
309
310 void manager_set_show_status(Manager *m, ShowStatus mode);
311 void manager_status_printf(Manager *m, bool ephemeral, const char *status, const char *format, ...) _printf_(4,5);
312 void manager_flip_auto_status(Manager *m, bool enable);
313
314 Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path);