]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/nspawn/nspawn-settings.h
nspawn: add greater control over how /etc/resolv.conf is handled
[thirdparty/systemd.git] / src / nspawn / nspawn-settings.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 #pragma once
3
4 /***
5 This file is part of systemd.
6
7 Copyright 2015 Lennart Poettering
8 ***/
9
10 #include <sched.h>
11 #include <stdio.h>
12
13 #include "sd-id128.h"
14
15 #include "conf-parser.h"
16 #include "macro.h"
17 #include "nspawn-expose-ports.h"
18 #include "nspawn-mount.h"
19
20 typedef enum StartMode {
21 START_PID1, /* Run parameters as command line as process 1 */
22 START_PID2, /* Use stub init process as PID 1, run parameters as command line as process 2 */
23 START_BOOT, /* Search for init system, pass arguments as parameters */
24 _START_MODE_MAX,
25 _START_MODE_INVALID = -1
26 } StartMode;
27
28 typedef enum UserNamespaceMode {
29 USER_NAMESPACE_NO,
30 USER_NAMESPACE_FIXED,
31 USER_NAMESPACE_PICK,
32 _USER_NAMESPACE_MODE_MAX,
33 _USER_NAMESPACE_MODE_INVALID = -1,
34 } UserNamespaceMode;
35
36 typedef enum ResolvConfMode {
37 RESOLV_CONF_OFF,
38 RESOLV_CONF_COPY_HOST,
39 RESOLV_CONF_COPY_STATIC,
40 RESOLV_CONF_BIND_HOST,
41 RESOLV_CONF_BIND_STATIC,
42 RESOLV_CONF_DELETE,
43 RESOLV_CONF_AUTO,
44 _RESOLV_CONF_MODE_MAX,
45 _RESOLV_CONF_MODE_INVALID = -1
46 } ResolvConfMode;
47
48 typedef enum SettingsMask {
49 SETTING_START_MODE = UINT64_C(1) << 0,
50 SETTING_ENVIRONMENT = UINT64_C(1) << 1,
51 SETTING_USER = UINT64_C(1) << 2,
52 SETTING_CAPABILITY = UINT64_C(1) << 3,
53 SETTING_KILL_SIGNAL = UINT64_C(1) << 4,
54 SETTING_PERSONALITY = UINT64_C(1) << 5,
55 SETTING_MACHINE_ID = UINT64_C(1) << 6,
56 SETTING_NETWORK = UINT64_C(1) << 7,
57 SETTING_EXPOSE_PORTS = UINT64_C(1) << 8,
58 SETTING_READ_ONLY = UINT64_C(1) << 9,
59 SETTING_VOLATILE_MODE = UINT64_C(1) << 10,
60 SETTING_CUSTOM_MOUNTS = UINT64_C(1) << 11,
61 SETTING_WORKING_DIRECTORY = UINT64_C(1) << 12,
62 SETTING_USERNS = UINT64_C(1) << 13,
63 SETTING_NOTIFY_READY = UINT64_C(1) << 14,
64 SETTING_PIVOT_ROOT = UINT64_C(1) << 15,
65 SETTING_SYSCALL_FILTER = UINT64_C(1) << 16,
66 SETTING_HOSTNAME = UINT64_C(1) << 17,
67 SETTING_NO_NEW_PRIVILEGES = UINT64_C(1) << 18,
68 SETTING_OOM_SCORE_ADJUST = UINT64_C(1) << 19,
69 SETTING_CPU_AFFINITY = UINT64_C(1) << 20,
70 SETTING_RESOLV_CONF = UINT64_C(1) << 21,
71 SETTING_RLIMIT_FIRST = UINT64_C(1) << 22, /* we define one bit per resource limit here */
72 SETTING_RLIMIT_LAST = UINT64_C(1) << (22 + _RLIMIT_MAX - 1),
73 _SETTINGS_MASK_ALL = (UINT64_C(1) << (22 + _RLIMIT_MAX)) - 1,
74 _FORCE_ENUM_WIDTH = UINT64_MAX
75 } SettingsMask;
76
77 /* We want to use SETTING_RLIMIT_FIRST in shifts, so make sure it is really 64 bits
78 * when used in expressions. */
79 #define SETTING_RLIMIT_FIRST ((uint64_t) SETTING_RLIMIT_FIRST)
80 #define SETTING_RLIMIT_LAST ((uint64_t) SETTING_RLIMIT_LAST)
81
82 assert_cc(sizeof(SettingsMask) == 8);
83 assert_cc(sizeof(SETTING_RLIMIT_FIRST) == 8);
84 assert_cc(sizeof(SETTING_RLIMIT_LAST) == 8);
85
86 typedef struct Settings {
87 /* [Run] */
88 StartMode start_mode;
89 char **parameters;
90 char **environment;
91 char *user;
92 uint64_t capability;
93 uint64_t drop_capability;
94 int kill_signal;
95 unsigned long personality;
96 sd_id128_t machine_id;
97 char *working_directory;
98 char *pivot_root_new;
99 char *pivot_root_old;
100 UserNamespaceMode userns_mode;
101 uid_t uid_shift, uid_range;
102 bool notify_ready;
103 char **syscall_whitelist;
104 char **syscall_blacklist;
105 struct rlimit *rlimit[_RLIMIT_MAX];
106 char *hostname;
107 int no_new_privileges;
108 int oom_score_adjust;
109 bool oom_score_adjust_set;
110 cpu_set_t *cpuset;
111 unsigned cpuset_ncpus;
112 ResolvConfMode resolv_conf;
113
114 /* [Image] */
115 int read_only;
116 VolatileMode volatile_mode;
117 CustomMount *custom_mounts;
118 size_t n_custom_mounts;
119 int userns_chown;
120
121 /* [Network] */
122 int private_network;
123 int network_veth;
124 char *network_bridge;
125 char *network_zone;
126 char **network_interfaces;
127 char **network_macvlan;
128 char **network_ipvlan;
129 char **network_veth_extra;
130 ExposePort *expose_ports;
131 } Settings;
132
133 int settings_load(FILE *f, const char *path, Settings **ret);
134 Settings* settings_free(Settings *s);
135
136 bool settings_network_veth(Settings *s);
137 bool settings_private_network(Settings *s);
138
139 DEFINE_TRIVIAL_CLEANUP_FUNC(Settings*, settings_free);
140
141 const struct ConfigPerfItem* nspawn_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
142
143 CONFIG_PARSER_PROTOTYPE(config_parse_capability);
144 CONFIG_PARSER_PROTOTYPE(config_parse_id128);
145 CONFIG_PARSER_PROTOTYPE(config_parse_expose_port);
146 CONFIG_PARSER_PROTOTYPE(config_parse_volatile_mode);
147 CONFIG_PARSER_PROTOTYPE(config_parse_pivot_root);
148 CONFIG_PARSER_PROTOTYPE(config_parse_bind);
149 CONFIG_PARSER_PROTOTYPE(config_parse_tmpfs);
150 CONFIG_PARSER_PROTOTYPE(config_parse_overlay);
151 CONFIG_PARSER_PROTOTYPE(config_parse_veth_extra);
152 CONFIG_PARSER_PROTOTYPE(config_parse_network_zone);
153 CONFIG_PARSER_PROTOTYPE(config_parse_boot);
154 CONFIG_PARSER_PROTOTYPE(config_parse_pid2);
155 CONFIG_PARSER_PROTOTYPE(config_parse_private_users);
156 CONFIG_PARSER_PROTOTYPE(config_parse_syscall_filter);
157 CONFIG_PARSER_PROTOTYPE(config_parse_hostname);
158 CONFIG_PARSER_PROTOTYPE(config_parse_oom_score_adjust);
159 CONFIG_PARSER_PROTOTYPE(config_parse_cpu_affinity);
160 CONFIG_PARSER_PROTOTYPE(config_parse_resolv_conf);
161
162 const char *resolv_conf_mode_to_string(ResolvConfMode a) _const_;
163 ResolvConfMode resolv_conf_mode_from_string(const char *s) _pure_;