1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//! Reference <https://www.freedesktop.org/software/systemd/man/org.freedesktop.login1.html>
pub(crate) mod generated;
/// Logind dbus interface proxies
pub mod proxy;
/// Types that some logind responses can be parsed to
pub mod types;

use proxy::{UserInterface, manager::ManagerInterface, session::SessionInterface};
use types::{SessionInfo, UserInfo};
use zbus::{Connection, Result};

const DEFAULT_DEST: &str = "org.freedesktop.login1";

/// `Logind` is the main way to communicate with the logind dbus interface.
///
/// Interfaces are available for:
/// - Manager
/// - User
/// - Session
pub struct Logind<'a> {
    connection: Connection,
    logind_proxy: ManagerInterface<'a>,
}

impl<'a> Logind<'a> {
    /// Create a new instance. This also sets up the required dbus connection
    #[inline]
    pub fn new() -> Result<Self> {
        let connection = Connection::new_system()?;
        let logind_proxy = ManagerInterface::new(&connection)?;
        Ok(Self {
            connection,
            logind_proxy,
        })
    }

    /// Get the main manager interface
    #[inline]
    pub fn main_interface(&self) -> &ManagerInterface<'a> {
        &self.logind_proxy
    }

    /// Get a Session dbus interface for the session ID
    #[inline]
    pub fn session_interface(&self, session: &'a SessionInfo) -> Result<SessionInterface> {
        SessionInterface::new(&self.connection,  session)
    }

    /// Get a User dbus interface for the user ID
    #[inline]
    pub fn user_interface(&self, user: &'a UserInfo) -> Result<UserInterface> {
        UserInterface::new(&self.connection, user)
    }
}

#[cfg(test)]
mod tests {
    use crate::Logind;

    #[test]
    fn basic_test() {
        let proxy = Logind::new().unwrap();

        let sessions = proxy.main_interface().list_sessions().unwrap();
        dbg!(&sessions);

        let session_proxy = proxy.session_interface(&sessions[0]).unwrap();

        assert!(session_proxy.get_seat().is_ok());
    }
}