|
|
613b6e |
From 0d0ecaab000cf2768a3edf1e73119bf2fce952b0 Mon Sep 17 00:00:00 2001
|
|
|
613b6e |
From: Daan De Meyer <daan.j.demeyer@gmail.com>
|
|
|
613b6e |
Date: Wed, 9 Oct 2024 14:49:07 +0200
|
|
|
613b6e |
Subject: [PATCH 1/6] mkosi: Fix up ownership of testuser home directory on
|
|
|
613b6e |
first boot
|
|
|
613b6e |
|
|
|
613b6e |
When building unprivileged, the testuser home directory ends up
|
|
|
613b6e |
owned by root:root because mkosi can't chown directories to other
|
|
|
613b6e |
owners when running unprivileged. So let's fix up the testuser
|
|
|
613b6e |
ownership on first boot with tmpfiles instead.
|
|
|
613b6e |
---
|
|
|
613b6e |
mkosi.extra/usr/lib/tmpfiles.d/testuser.conf | 3 +++
|
|
|
613b6e |
1 file changed, 3 insertions(+)
|
|
|
613b6e |
create mode 100644 mkosi.extra/usr/lib/tmpfiles.d/testuser.conf
|
|
|
613b6e |
|
|
|
613b6e |
diff --git a/mkosi.extra/usr/lib/tmpfiles.d/testuser.conf b/mkosi.extra/usr/lib/tmpfiles.d/testuser.conf
|
|
|
613b6e |
new file mode 100644
|
|
|
613b6e |
index 0000000000000..7113177f4deba
|
|
|
613b6e |
--- /dev/null
|
|
|
613b6e |
+++ b/mkosi.extra/usr/lib/tmpfiles.d/testuser.conf
|
|
|
613b6e |
@@ -0,0 +1,3 @@
|
|
|
613b6e |
+# SPDX-License-Identifier: LGPL-2.1-or-later
|
|
|
613b6e |
+
|
|
|
613b6e |
+z! /home/testuser 700 testuser testuser
|
|
|
613b6e |
|
|
|
613b6e |
From ec9fd0d4f5f77404fbfabde9e7a9d01aaa1356ff Mon Sep 17 00:00:00 2001
|
|
|
613b6e |
From: Daan De Meyer <daan.j.demeyer@gmail.com>
|
|
|
613b6e |
Date: Wed, 9 Oct 2024 16:37:06 +0200
|
|
|
613b6e |
Subject: [PATCH 2/6] update-utmp: Make reconnect logic more robust
|
|
|
613b6e |
|
|
|
613b6e |
We might also fail to connect to the private manager bus itself if
|
|
|
613b6e |
the daemon-reexec is still ongoing, so let's handle that as well by
|
|
|
613b6e |
retrying on ECONNREFUSED.
|
|
|
613b6e |
---
|
|
|
613b6e |
src/update-utmp/update-utmp.c | 45 +++++++++++++++++++----------------
|
|
|
613b6e |
1 file changed, 25 insertions(+), 20 deletions(-)
|
|
|
613b6e |
|
|
|
613b6e |
diff --git a/src/update-utmp/update-utmp.c b/src/update-utmp/update-utmp.c
|
|
|
613b6e |
index c376676e8d0a5..7a8a53f7e8ec5 100644
|
|
|
613b6e |
--- a/src/update-utmp/update-utmp.c
|
|
|
613b6e |
+++ b/src/update-utmp/update-utmp.c
|
|
|
613b6e |
@@ -82,6 +82,25 @@ static int get_current_runlevel(Context *c) {
|
|
|
613b6e |
assert(c);
|
|
|
613b6e |
|
|
|
613b6e |
for (unsigned n_attempts = 0;;) {
|
|
|
613b6e |
+ if (n_attempts++ > 0) {
|
|
|
613b6e |
+ /* systemd might have dropped off momentarily, let's not make this an error,
|
|
|
613b6e |
+ * and wait some random time. Let's pick a random time in the range 0ms…250ms,
|
|
|
613b6e |
+ * linearly scaled by the number of failed attempts. */
|
|
|
613b6e |
+ c->bus = sd_bus_flush_close_unref(c->bus);
|
|
|
613b6e |
+
|
|
|
613b6e |
+ usec_t usec = random_u64_range(UINT64_C(10) * USEC_PER_MSEC +
|
|
|
613b6e |
+ UINT64_C(240) * USEC_PER_MSEC * n_attempts/64);
|
|
|
613b6e |
+ (void) usleep_safe(usec);
|
|
|
613b6e |
+
|
|
|
613b6e |
+ r = bus_connect_system_systemd(&c->bus);
|
|
|
613b6e |
+ if (r == -ECONNREFUSED && n_attempts < 64) {
|
|
|
613b6e |
+ log_debug_errno(r, "Failed to reconnect to system bus, retrying after a slight delay: %m");
|
|
|
613b6e |
+ continue;
|
|
|
613b6e |
+ }
|
|
|
613b6e |
+ if (r < 0)
|
|
|
613b6e |
+ return log_error_errno(r, "Failed to reconnect to system bus: %m");
|
|
|
613b6e |
+ }
|
|
|
613b6e |
+
|
|
|
613b6e |
FOREACH_ELEMENT(e, table) {
|
|
|
613b6e |
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
|
|
613b6e |
_cleanup_free_ char *state = NULL, *path = NULL;
|
|
|
613b6e |
@@ -102,18 +121,10 @@ static int get_current_runlevel(Context *c) {
|
|
|
613b6e |
sd_bus_error_has_names(&error,
|
|
|
613b6e |
SD_BUS_ERROR_NO_REPLY,
|
|
|
613b6e |
SD_BUS_ERROR_DISCONNECTED)) &&
|
|
|
613b6e |
- ++n_attempts < 64) {
|
|
|
613b6e |
-
|
|
|
613b6e |
- /* systemd might have dropped off momentarily, let's not make this an error,
|
|
|
613b6e |
- * and wait some random time. Let's pick a random time in the range 0ms…250ms,
|
|
|
613b6e |
- * linearly scaled by the number of failed attempts. */
|
|
|
613b6e |
-
|
|
|
613b6e |
- usec_t usec = random_u64_range(UINT64_C(10) * USEC_PER_MSEC +
|
|
|
613b6e |
- UINT64_C(240) * USEC_PER_MSEC * n_attempts/64);
|
|
|
613b6e |
- log_debug_errno(r, "Failed to get state of %s, retrying after %s: %s",
|
|
|
613b6e |
- e->special, FORMAT_TIMESPAN(usec, USEC_PER_MSEC), bus_error_message(&error, r));
|
|
|
613b6e |
- (void) usleep_safe(usec);
|
|
|
613b6e |
- goto reconnect;
|
|
|
613b6e |
+ n_attempts < 64) {
|
|
|
613b6e |
+ log_debug_errno(r, "Failed to get state of %s, retrying after a slight delay: %s",
|
|
|
613b6e |
+ e->special, bus_error_message(&error, r));
|
|
|
613b6e |
+ break;
|
|
|
613b6e |
}
|
|
|
613b6e |
if (r < 0)
|
|
|
613b6e |
return log_warning_errno(r, "Failed to get state of %s: %s", e->special, bus_error_message(&error, r));
|
|
|
613b6e |
@@ -121,14 +132,8 @@ static int get_current_runlevel(Context *c) {
|
|
|
613b6e |
if (STR_IN_SET(state, "active", "reloading"))
|
|
|
613b6e |
return e->runlevel;
|
|
|
613b6e |
}
|
|
|
613b6e |
-
|
|
|
613b6e |
- return 0;
|
|
|
613b6e |
-
|
|
|
613b6e |
-reconnect:
|
|
|
613b6e |
- c->bus = sd_bus_flush_close_unref(c->bus);
|
|
|
613b6e |
- r = bus_connect_system_systemd(&c->bus);
|
|
|
613b6e |
- if (r < 0)
|
|
|
613b6e |
- return log_error_errno(r, "Failed to reconnect to system bus: %m");
|
|
|
613b6e |
+ if (r >= 0)
|
|
|
613b6e |
+ return 0;
|
|
|
613b6e |
}
|
|
|
613b6e |
}
|
|
|
613b6e |
|
|
|
613b6e |
|
|
|
613b6e |
From a339495b1d67f69f49ffffdd96002164a28f1c93 Mon Sep 17 00:00:00 2001
|
|
|
613b6e |
From: Daan De Meyer <daan.j.demeyer@gmail.com>
|
|
|
613b6e |
Date: Wed, 9 Oct 2024 11:44:34 +0200
|
|
|
613b6e |
Subject: [PATCH 3/6] bus-util: Drop fallback to system/user bus if manager bus
|
|
|
613b6e |
doesn't work
|
|
|
613b6e |
|
|
|
613b6e |
We have various callsites that explicitly need the manager bus and
|
|
|
613b6e |
won't work with the system bus, like daemon-reexec and friends which
|
|
|
613b6e |
can't properly wait until the operation has finished unless using the
|
|
|
613b6e |
manager bus.
|
|
|
613b6e |
|
|
|
613b6e |
If we silently fall back to the system bus for these operations, we
|
|
|
613b6e |
can end up with rather hard to debug issues so let's remove the fallback
|
|
|
613b6e |
as it was added back in 2013 in a6aa89122d2fa5e811a72200773068c13bfffea2
|
|
|
613b6e |
without a clear explanation of why it was needed (I expect as a fallback
|
|
|
613b6e |
if kdbus wasn't available but that's not a thing anymore these days).
|
|
|
613b6e |
---
|
|
|
613b6e |
src/shared/bus-util.c | 6 +++---
|
|
|
613b6e |
1 file changed, 3 insertions(+), 3 deletions(-)
|
|
|
613b6e |
|
|
|
613b6e |
diff --git a/src/shared/bus-util.c b/src/shared/bus-util.c
|
|
|
613b6e |
index f4c4eed70702a..44ed617da8dfb 100644
|
|
|
613b6e |
--- a/src/shared/bus-util.c
|
|
|
613b6e |
+++ b/src/shared/bus-util.c
|
|
|
613b6e |
@@ -245,7 +245,7 @@ int bus_connect_system_systemd(sd_bus **ret_bus) {
|
|
|
613b6e |
|
|
|
613b6e |
r = sd_bus_start(bus);
|
|
|
613b6e |
if (r < 0)
|
|
|
613b6e |
- return sd_bus_default_system(ret_bus);
|
|
|
613b6e |
+ return r;
|
|
|
613b6e |
|
|
|
613b6e |
r = bus_check_peercred(bus);
|
|
|
613b6e |
if (r < 0)
|
|
|
613b6e |
@@ -265,7 +265,7 @@ int bus_connect_user_systemd(sd_bus **ret_bus) {
|
|
|
613b6e |
|
|
|
613b6e |
e = secure_getenv("XDG_RUNTIME_DIR");
|
|
|
613b6e |
if (!e)
|
|
|
613b6e |
- return sd_bus_default_user(ret_bus);
|
|
|
613b6e |
+ return -ENXIO;
|
|
|
613b6e |
|
|
|
613b6e |
ee = bus_address_escape(e);
|
|
|
613b6e |
if (!ee)
|
|
|
613b6e |
@@ -281,7 +281,7 @@ int bus_connect_user_systemd(sd_bus **ret_bus) {
|
|
|
613b6e |
|
|
|
613b6e |
r = sd_bus_start(bus);
|
|
|
613b6e |
if (r < 0)
|
|
|
613b6e |
- return sd_bus_default_user(ret_bus);
|
|
|
613b6e |
+ return r;
|
|
|
613b6e |
|
|
|
613b6e |
r = bus_check_peercred(bus);
|
|
|
613b6e |
if (r < 0)
|
|
|
613b6e |
|
|
|
613b6e |
From a178ffdfcd9d25886a6e563a0fbd9929852e85c4 Mon Sep 17 00:00:00 2001
|
|
|
613b6e |
From: Daan De Meyer <daan.j.demeyer@gmail.com>
|
|
|
613b6e |
Date: Wed, 9 Oct 2024 12:10:44 +0200
|
|
|
613b6e |
Subject: [PATCH 4/6] bus-util: Move geteuid() check out of
|
|
|
613b6e |
bus_connect_system_systemd()
|
|
|
613b6e |
|
|
|
613b6e |
Let's move this check to bus_connect_transport_systemd() so that
|
|
|
613b6e |
bus_connect_system_systemd() will only ever connect to the manager
|
|
|
613b6e |
private manager bus instance and fail otherwise.
|
|
|
613b6e |
---
|
|
|
613b6e |
src/shared/bus-util.c | 13 ++++++-------
|
|
|
613b6e |
1 file changed, 6 insertions(+), 7 deletions(-)
|
|
|
613b6e |
|
|
|
613b6e |
diff --git a/src/shared/bus-util.c b/src/shared/bus-util.c
|
|
|
613b6e |
index 44ed617da8dfb..a196ba47f647c 100644
|
|
|
613b6e |
--- a/src/shared/bus-util.c
|
|
|
613b6e |
+++ b/src/shared/bus-util.c
|
|
|
613b6e |
@@ -229,12 +229,6 @@ int bus_connect_system_systemd(sd_bus **ret_bus) {
|
|
|
613b6e |
|
|
|
613b6e |
assert(ret_bus);
|
|
|
613b6e |
|
|
|
613b6e |
- if (geteuid() != 0)
|
|
|
613b6e |
- return sd_bus_default_system(ret_bus);
|
|
|
613b6e |
-
|
|
|
613b6e |
- /* If we are root then let's talk directly to the system
|
|
|
613b6e |
- * instance, instead of going via the bus */
|
|
|
613b6e |
-
|
|
|
613b6e |
r = sd_bus_new(&bus;;
|
|
|
613b6e |
if (r < 0)
|
|
|
613b6e |
return r;
|
|
|
613b6e |
@@ -521,8 +515,13 @@ int bus_connect_transport_systemd(
|
|
|
613b6e |
/* Print a friendly message when the local system is actually not running systemd as PID 1. */
|
|
|
613b6e |
return log_error_errno(SYNTHETIC_ERRNO(EHOSTDOWN),
|
|
|
613b6e |
"System has not been booted with systemd as init system (PID 1). Can't operate.");
|
|
|
613b6e |
- return bus_connect_system_systemd(ret_bus);
|
|
|
613b6e |
|
|
|
613b6e |
+ if (geteuid() == 0)
|
|
|
613b6e |
+ /* If we are root then let's talk directly to the system
|
|
|
613b6e |
+ * instance, instead of going via the bus. */
|
|
|
613b6e |
+ return bus_connect_system_systemd(ret_bus);
|
|
|
613b6e |
+
|
|
|
613b6e |
+ return sd_bus_default_system(ret_bus);
|
|
|
613b6e |
default:
|
|
|
613b6e |
assert_not_reached();
|
|
|
613b6e |
}
|
|
|
613b6e |
|
|
|
613b6e |
From b066b683539675bc51a71259f1e0f42cef5379ad Mon Sep 17 00:00:00 2001
|
|
|
613b6e |
From: Daan De Meyer <daan.j.demeyer@gmail.com>
|
|
|
613b6e |
Date: Thu, 10 Oct 2024 15:54:37 +0200
|
|
|
613b6e |
Subject: [PATCH 5/6] stdio-bridge: Use bus_log_connect_error()
|
|
|
613b6e |
|
|
|
613b6e |
---
|
|
|
613b6e |
src/stdio-bridge/stdio-bridge.c | 2 +-
|
|
|
613b6e |
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
613b6e |
|
|
|
613b6e |
diff --git a/src/stdio-bridge/stdio-bridge.c b/src/stdio-bridge/stdio-bridge.c
|
|
|
613b6e |
index d3629f5fb0dc5..7b774860c8eb1 100644
|
|
|
613b6e |
--- a/src/stdio-bridge/stdio-bridge.c
|
|
|
613b6e |
+++ b/src/stdio-bridge/stdio-bridge.c
|
|
|
613b6e |
@@ -142,7 +142,7 @@ static int run(int argc, char *argv[]) {
|
|
|
613b6e |
|
|
|
613b6e |
r = sd_bus_start(a);
|
|
|
613b6e |
if (r < 0)
|
|
|
613b6e |
- return log_error_errno(r, "Failed to start bus client: %m");
|
|
|
613b6e |
+ return bus_log_connect_error(r, arg_transport, arg_runtime_scope);
|
|
|
613b6e |
|
|
|
613b6e |
r = sd_bus_get_bus_id(a, &server_id);
|
|
|
613b6e |
if (r < 0)
|
|
|
613b6e |
|
|
|
613b6e |
From d94e85c2279ac255a9c964046723684ca99b7f00 Mon Sep 17 00:00:00 2001
|
|
|
613b6e |
From: Daan De Meyer <daan.j.demeyer@gmail.com>
|
|
|
613b6e |
Date: Thu, 10 Oct 2024 15:54:57 +0200
|
|
|
613b6e |
Subject: [PATCH 6/6] stdio-bridge: Use customized log message for forwarding
|
|
|
613b6e |
bus
|
|
|
613b6e |
|
|
|
613b6e |
Let's more clearly indicate that we failed to set up the server
|
|
|
613b6e |
which forwards messages from the remote client to the local bus
|
|
|
613b6e |
instead of logging a generic bus client message.
|
|
|
613b6e |
---
|
|
|
613b6e |
src/stdio-bridge/stdio-bridge.c | 2 +-
|
|
|
613b6e |
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
613b6e |
|
|
|
613b6e |
diff --git a/src/stdio-bridge/stdio-bridge.c b/src/stdio-bridge/stdio-bridge.c
|
|
|
613b6e |
index 7b774860c8eb1..22570511cbabb 100644
|
|
|
613b6e |
--- a/src/stdio-bridge/stdio-bridge.c
|
|
|
613b6e |
+++ b/src/stdio-bridge/stdio-bridge.c
|
|
|
613b6e |
@@ -170,7 +170,7 @@ static int run(int argc, char *argv[]) {
|
|
|
613b6e |
|
|
|
613b6e |
r = sd_bus_start(b);
|
|
|
613b6e |
if (r < 0)
|
|
|
613b6e |
- return log_error_errno(r, "Failed to start bus client: %m");
|
|
|
613b6e |
+ return log_error_errno(r, "Failed to start bus forwarding server: %m");
|
|
|
613b6e |
|
|
|
613b6e |
for (;;) {
|
|
|
613b6e |
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
|