From c5912adc85445989179cdc0cd8f206683188bd0e Mon Sep 17 00:00:00 2001 From: David Tardon Date: Sat, 16 Jul 2022 15:10:26 +0200 Subject: [PATCH 1/3] loginctl: add linger status to list-users output Fixes: #3907 --- src/login/loginctl.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/login/loginctl.c b/src/login/loginctl.c index 83f25135a2e..d00a280e663 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -207,25 +207,38 @@ static int list_users(int argc, char *argv[], void *userdata) { if (r < 0) return bus_log_parse_error(r); - table = table_new("uid", "user"); + table = table_new("uid", "user", "linger"); if (!table) return log_oom(); (void) table_set_align_percent(table, TABLE_HEADER_CELL(0), 100); for (;;) { - const char *user; + const char *user, *object; uint32_t uid; + int linger; - r = sd_bus_message_read(reply, "(uso)", &uid, &user, NULL); + r = sd_bus_message_read(reply, "(uso)", &uid, &user, &object); if (r < 0) return bus_log_parse_error(r); if (r == 0) break; + r = sd_bus_get_property_trivial(bus, + "org.freedesktop.login1", + object, + "org.freedesktop.login1.User", + "Linger", + &error, + 'b', + &linger); + if (r < 0) + return log_error_errno(r, "Failed to get linger status: %s", bus_error_message(&error, r)); + r = table_add_many(table, TABLE_UID, (uid_t) uid, - TABLE_STRING, user); + TABLE_STRING, user, + TABLE_BOOLEAN, linger); if (r < 0) return table_log_add_error(r); } From 6083f7a604267d02a648c76edd3e0cb7b83b4620 Mon Sep 17 00:00:00 2001 From: David Tardon Date: Sun, 17 Jul 2022 15:35:22 +0200 Subject: [PATCH 2/3] test: add a simple test for list-users --- test/units/testsuite-35.sh | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/units/testsuite-35.sh b/test/units/testsuite-35.sh index fa90bc6d734..e2b3f497f2f 100755 --- a/test/units/testsuite-35.sh +++ b/test/units/testsuite-35.sh @@ -225,6 +225,8 @@ cleanup_session() ( rm -rf /run/systemd/system/getty@tty2.service.d systemctl daemon-reload + loginctl disable-linger logind-test-user + pkill -u "$(id -u logind-test-user)" sleep 1 pkill -KILL -u "$(id -u logind-test-user)" @@ -445,6 +447,23 @@ test_session_properties() { /usr/lib/systemd/tests/manual/test-session-properties "/org/freedesktop/login1/session/_3${s?}" } +test_list_users() { + if [[ ! -c /dev/tty2 ]]; then + echo "/dev/tty2 does not exist, skipping test ${FUNCNAME[0]}." + return + fi + + trap cleanup_session RETURN + create_session + + assert_eq "$(loginctl list-users --no-legend | awk '$2 == "logind-test-user" { print $1 }')" "$(id -ru logind-test-user)" + assert_eq "$(loginctl list-users --no-legend | awk '$2 == "logind-test-user" { print $3 }')" no + + loginctl enable-linger logind-test-user + + assert_eq "$(loginctl list-users --no-legend | awk '$2 == "logind-test-user" { print $3 }')" yes +} + : >/failed setup_test_user @@ -456,6 +475,7 @@ test_shutdown test_session test_lock_idle_action test_session_properties +test_list_users touch /testok rm /failed From 283db37a20900b549508b2bf6d9db898c9a0ca67 Mon Sep 17 00:00:00 2001 From: David Tardon Date: Sun, 17 Jul 2022 15:41:38 +0200 Subject: [PATCH 3/3] test: merge grep | awk calls --- test/units/testsuite-35.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/units/testsuite-35.sh b/test/units/testsuite-35.sh index e2b3f497f2f..d2cd36005af 100755 --- a/test/units/testsuite-35.sh +++ b/test/units/testsuite-35.sh @@ -262,7 +262,7 @@ check_session() ( return 1 fi - session=$(loginctl --no-legend | grep "logind-test-user" | awk '{ print $1 }') + session=$(loginctl --no-legend | awk '$3 == "logind-test-user" { print $1 }') if [[ -z "$session" ]]; then echo "no session found for user logind-test-user" >&2 return 1 @@ -273,7 +273,7 @@ check_session() ( return 1 fi - leader_pid=$(loginctl session-status "$session" | grep "Leader:" | awk '{ print $2 }') + leader_pid=$(loginctl session-status "$session" | awk '$1 == "Leader:" { print $2 }') if [[ -z "$leader_pid" ]]; then echo "cannot found leader process for session $session" >&2 return 1 @@ -353,7 +353,7 @@ EOF udevadm info "$dev" # trigger logind and activate session - loginctl activate "$(loginctl --no-legend | grep "logind-test-user" | awk '{ print $1 }')" + loginctl activate "$(loginctl --no-legend | awk '$3 == "logind-test-user" { print $1 }')" # check ACL sleep 1