]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
logind: emit PropertiesChanged when lingering is enabled/disabled
authorJelle van der Waa <jelle@vdwaa.nl>
Wed, 8 Oct 2025 10:29:04 +0000 (12:29 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 9 Oct 2025 07:39:45 +0000 (09:39 +0200)
Cockpit's podman plugin needs to know the lingering status so the UI can
advertise enabling `podman-restart` (which depends on lingering to
work). Currently it relies on watching `/var/lib/systemd/linger/${user}`
but that isn't a public API.

Related: #22244

man/org.freedesktop.login1.xml
src/login/logind-dbus.c
src/login/logind-user-dbus.c
test/units/TEST-35-LOGIN.sh

index 5561c98606eaada46bcf3de7524b1330e3dd0af1..b447ae70f64c891fc530bcd104f40c10c2ac406d 100644 (file)
@@ -1067,7 +1067,6 @@ node /org/freedesktop/login1/user/_1000 {
       readonly b IdleHint = ...;
       readonly t IdleSinceHint = ...;
       readonly t IdleSinceHintMonotonic = ...;
-      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
       readonly b Linger = ...;
   };
   interface org.freedesktop.DBus.Peer { ... };
index 4e4ed92b20462d8b6d3c730029e0b74dd4c3df6a..7211dad9baa7dedda718ecc18431e12feb85d30a 100644 (file)
@@ -1668,6 +1668,7 @@ static int method_set_user_linger(sd_bus_message *message, void *userdata, sd_bu
                         return r;
 
                 if (manager_add_user_by_uid(m, uid, &u) >= 0) {
+                        (void) user_send_changed(u, "Linger");
                         r = user_start(u);
                         if (r < 0) {
                                 user_add_to_gc_queue(u);
@@ -1685,6 +1686,7 @@ static int method_set_user_linger(sd_bus_message *message, void *userdata, sd_bu
                         /* Make sure that disabling lingering will terminate the user tracking if no sessions pin it. */
                         u->gc_mode = USER_GC_BY_PIN;
                         user_add_to_gc_queue(u);
+                        (void) user_send_changed(u, "Linger");
                 }
         }
 
index 600890230bbb49d345bfb2c469f4965a1833cf9a..b23891767eedded008a1a5aa2ddb06728245c361 100644 (file)
@@ -367,7 +367,7 @@ static const sd_bus_vtable user_vtable[] = {
         SD_BUS_PROPERTY("IdleHint", "b", property_get_idle_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("IdleSinceHint", "t", property_get_idle_since_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("IdleSinceHintMonotonic", "t", property_get_idle_since_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
-        SD_BUS_PROPERTY("Linger", "b", property_get_linger, 0, 0),
+        SD_BUS_PROPERTY("Linger", "b", property_get_linger, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
 
         SD_BUS_METHOD("Terminate", NULL, NULL, bus_user_method_terminate, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD_WITH_ARGS("Kill",
index b714fce67aa68b953870fe84579df1a5277da96c..56059ee5e4911c4eb29ad12e1f4e17696423f7c4 100755 (executable)
@@ -590,7 +590,10 @@ testcase_list_users_sessions_seats() {
     assert_eq "$(loginctl list-users --no-legend | awk '$2 == "logind-test-user" { print $3 }')" no
     assert_eq "$(loginctl list-users --no-legend | awk '$2 == "logind-test-user" { print $4 }')" active
 
-    loginctl enable-linger logind-test-user
+    systemd-run --quiet --service-type=notify --unit=test-linger-signal-wait --pty \
+                -p Environment=SYSTEMD_LOG_LEVEL=debug \
+                -p ExecStartPost="loginctl enable-linger logind-test-user" \
+               busctl --timeout=30 wait "/org/freedesktop/login1/user/_$(id -ru logind-test-user)" org.freedesktop.DBus.Properties PropertiesChanged | grep -qF '"Linger" b true'
     assert_eq "$(loginctl list-users --no-legend | awk '$2 == "logind-test-user" { print $3 }')" yes
 
     for s in $(loginctl list-sessions --no-legend | grep tty | awk '$3 == "logind-test-user" { print $1 }'); do