Skip to content

Commit f082d86

Browse files
authored
Merge pull request #1094 from omertuc/setusers
reinstall: avoid duplicate users in `loginctl_users`
2 parents c681850 + 961c0bf commit f082d86

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

system-reinstall-bootc/src/users.rs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,20 @@ use rustix::process::geteuid;
55
use rustix::process::getuid;
66
use rustix::thread::set_thread_res_uid;
77
use serde_json::Value;
8+
use std::collections::BTreeSet;
89
use std::fmt::Display;
910
use std::fmt::Formatter;
1011
use std::process::Command;
1112
use uzers::os::unix::UserExt;
1213

13-
fn loginctl_users() -> Result<Vec<String>> {
14-
let users = loginctl_run_compat()?;
14+
fn loginctl_users() -> Result<BTreeSet<String>> {
15+
let loginctl_raw_output = loginctl_run_compat()?;
1516

17+
loginctl_parse(loginctl_raw_output)
18+
}
19+
20+
/// See [`test::test_parse_lsblk`] for example loginctl output
21+
fn loginctl_parse(users: Value) -> Result<BTreeSet<String>> {
1622
users
1723
.as_array()
1824
.context("loginctl output is not an array")?
@@ -27,10 +33,10 @@ fn loginctl_users() -> Result<Vec<String>> {
2733
.context("user name field is not a string")
2834
.map(String::from)
2935
})
30-
// Artificially add the root user to the list of users as it doesn't appear in loginctl
31-
// list-sessions
36+
// Artificially add the root user to the list of users as it doesn't always appear in
37+
// `loginctl list-sessions`
3238
.chain(std::iter::once(Ok("root".to_string())))
33-
.collect::<Result<Vec<String>>>()
39+
.collect::<Result<_>>()
3440
.context("error parsing users")
3541
}
3642

@@ -162,3 +168,19 @@ pub(crate) fn get_all_users_keys() -> Result<Vec<UserKeys>> {
162168

163169
Ok(all_users_authorized_keys)
164170
}
171+
172+
#[cfg(test)]
173+
mod test {
174+
use super::*;
175+
176+
#[test]
177+
pub(crate) fn test_parse_lsblk() {
178+
let fixture = include_str!("../tests/fixtures/loginctl.json");
179+
180+
let result = loginctl_parse(serde_json::from_str(fixture).unwrap()).unwrap();
181+
182+
assert_eq!(result.len(), 2);
183+
assert!(result.contains("root"));
184+
assert!(result.contains("foo-doe"));
185+
}
186+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"session":"2","uid":1000,"user":"foo-doe","seat":"seat0","leader":3045,"class":"user","tty":"tty1","idle":false,"since":null},{"session":"3","uid":1000,"user":"foo-doe","seat":null,"leader":3148,"class":"manager","tty":null,"idle":false,"since":null}]

0 commit comments

Comments
 (0)