2 This file is part of systemd.
4 Copyright 2015 Lennart Poettering
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include "bus-error.h"
23 #include "bus-unit-util.h"
25 #include "nspawn-register.h"
26 #include "stat-util.h"
31 const char *machine_name
,
33 const char *directory
,
42 const char *service
) {
44 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
45 _cleanup_(sd_bus_flush_close_unrefp
) sd_bus
*bus
= NULL
;
48 r
= sd_bus_default_system(&bus
);
50 return log_error_errno(r
, "Failed to open system bus: %m");
53 r
= sd_bus_call_method(
55 "org.freedesktop.machine1",
56 "/org/freedesktop/machine1",
57 "org.freedesktop.machine1.Manager",
58 "RegisterMachineWithNetwork",
63 SD_BUS_MESSAGE_APPEND_ID128(uuid
),
68 local_ifindex
> 0 ? 1 : 0, local_ifindex
);
70 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
74 r
= sd_bus_message_new_method_call(
77 "org.freedesktop.machine1",
78 "/org/freedesktop/machine1",
79 "org.freedesktop.machine1.Manager",
80 "CreateMachineWithNetwork");
82 return bus_log_create_error(r
);
84 r
= sd_bus_message_append(
88 SD_BUS_MESSAGE_APPEND_ID128(uuid
),
93 local_ifindex
> 0 ? 1 : 0, local_ifindex
);
95 return bus_log_create_error(r
);
97 r
= sd_bus_message_open_container(m
, 'a', "(sv)");
99 return bus_log_create_error(r
);
101 if (!isempty(slice
)) {
102 r
= sd_bus_message_append(m
, "(sv)", "Slice", "s", slice
);
104 return bus_log_create_error(r
);
107 r
= sd_bus_message_append(m
, "(sv)", "DevicePolicy", "s", "strict");
109 return bus_log_create_error(r
);
111 /* If you make changes here, also make sure to update
112 * systemd-nspawn@.service, to keep the device
113 * policies in sync regardless if we are run with or
114 * without the --keep-unit switch. */
115 r
= sd_bus_message_append(m
, "(sv)", "DeviceAllow", "a(ss)", 11,
116 /* Allow the container to
117 * access and create the API
118 * device nodes, so that
119 * PrivateDevices= in the
125 "/dev/random", "rwm",
126 "/dev/urandom", "rwm",
128 "/dev/net/tun", "rwm",
129 /* Allow the container
130 * access to ptys. However,
132 * container to ever create
133 * these device nodes. */
134 "/dev/pts/ptmx", "rw",
136 /* Allow /run/systemd/inaccessible/{chr,blk}
137 * devices inside the container */
138 "/run/systemd/inaccessible/chr", "rwm",
139 "/run/systemd/inaccessible/blk", "rwm");
141 return bus_log_create_error(r
);
143 for (j
= 0; j
< n_mounts
; j
++) {
144 CustomMount
*cm
= mounts
+ j
;
146 if (cm
->type
!= CUSTOM_MOUNT_BIND
)
149 r
= is_device_node(cm
->source
);
151 return log_error_errno(r
, "Failed to stat %s: %m", cm
->source
);
154 r
= sd_bus_message_append(m
, "(sv)", "DeviceAllow", "a(ss)", 1,
155 cm
->source
, cm
->read_only
? "r" : "rw");
157 return log_error_errno(r
, "Failed to append message arguments: %m");
161 if (kill_signal
!= 0) {
162 r
= sd_bus_message_append(m
, "(sv)", "KillSignal", "i", kill_signal
);
164 return bus_log_create_error(r
);
166 r
= sd_bus_message_append(m
, "(sv)", "KillMode", "s", "mixed");
168 return bus_log_create_error(r
);
171 STRV_FOREACH(i
, properties
) {
172 r
= bus_append_unit_property_assignment(m
, *i
);
177 r
= sd_bus_message_close_container(m
);
179 return bus_log_create_error(r
);
181 r
= sd_bus_call(bus
, m
, 0, &error
, NULL
);
185 log_error("Failed to register machine: %s", bus_error_message(&error
, r
));
192 int terminate_machine(pid_t pid
) {
193 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
194 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*reply
= NULL
;
195 _cleanup_(sd_bus_flush_close_unrefp
) sd_bus
*bus
= NULL
;
199 r
= sd_bus_default_system(&bus
);
201 return log_error_errno(r
, "Failed to open system bus: %m");
203 r
= sd_bus_call_method(
205 "org.freedesktop.machine1",
206 "/org/freedesktop/machine1",
207 "org.freedesktop.machine1.Manager",
214 /* Note that the machine might already have been
215 * cleaned up automatically, hence don't consider it a
216 * failure if we cannot get the machine object. */
217 log_debug("Failed to get machine: %s", bus_error_message(&error
, r
));
221 r
= sd_bus_message_read(reply
, "o", &path
);
223 return bus_log_parse_error(r
);
225 r
= sd_bus_call_method(
227 "org.freedesktop.machine1",
229 "org.freedesktop.machine1.Machine",
235 log_debug("Failed to terminate machine: %s", bus_error_message(&error
, r
));