mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 00:14:32 +09:00
logind: emit PropertiesChanged when lingering is enabled/disabled
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
This commit is contained in:
committed by
Lennart Poettering
parent
03936a55a1
commit
c6ebb98e3c
@@ -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 { ... };
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user