Rust系统登录管理库logind-zbus的使用:通过DBus与Linux系统登录服务交互的Rust接口库

Rust系统登录管理库logind-zbus的使用:通过DBus与Linux系统登录服务交互的Rust接口库

概述

logind-zbus是一个围绕systemd-logind提供的dbus接口的Rust封装库。它旨在为logind的dbus接口提供方便的API抽象,尽可能将响应解析为具体的结构体和枚举。

安装

在项目目录中运行以下Cargo命令:

cargo add logind-zbus

或者将以下行添加到您的Cargo.toml中:

logind-zbus = "5.3.2"

使用示例

以下是使用logind-zbus与系统登录服务交互的完整示例:

use logind_zbus::manager::ManagerProxy;
use zbus::Connection;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 建立与系统D-Bus的连接
    let connection = Connection::system().await?;
    
    // 创建ManagerProxy来与logind交互
    let manager = ManagerProxy::new(&connection).await?;
    
    // 获取当前会话列表
    let sessions = manager.list_sessions().await?;
    println!("当前活跃会话:");
    for session in sessions {
        println!("- 用户{}在会话{} (PID: {})", 
            session.1,  // 用户名
            session.2,  // 会话ID
            session.3   // 进程ID
        );
    }
    
    // 检查系统是否可以休眠
    let can_hibernate = manager.can_hibernate().await?;
    println!("系统是否可以休眠: {}", can_hibernate);
    
    // 检查系统是否可以挂起
    let can_suspend = manager.can_suspend().await?;
    println!("系统是否可以挂起: {}", can_suspend);
    
    // 获取当前登录用户数量
    let user_count = manager.user_count().await?;
    println!("当前登录用户数量: {}", user_count);
    
    Ok(())
}

完整示例demo

以下是一个更完整的示例,展示了logind-zbus库的更多功能:

use logind_zbus::manager::ManagerProxy;
use logind_zbus::session::SessionProxy;
use zbus::{Connection, proxy};
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // 1. 建立系统D-Bus连接
    let connection = Connection::system().await?;
    
    // 2. 创建ManagerProxy实例
    let manager = ManagerProxy::new(&connection).await?;
    
    // 3. 获取并打印当前活动会话
    println!("=== 当前系统会话 ===");
    let sessions = manager.list_sessions().await?;
    for (_, username, session_id, pid) in sessions {
        println!("用户: {}, 会话ID: {}, PID: {}", username, session_id, pid);
        
        // 4. 为每个会话创建SessionProxy
        let session = SessionProxy::builder(&connection)
            .path(format!("/org/freedesktop/login1/session/{}", session_id))?
            .build()
            .await?;
            
        // 5. 获取会话详细信息
        let user = session.user().await?;
        let seat = session.seat().await?;
        let tty = session.tty().await?;
        println!("  用户对象: {}, 座位: {}, TTY: {}", user, seat, tty);
    }
    
    // 6. 电源管理功能
    println!("\n=== 电源管理功能 ===");
    println!("可以休眠: {}", manager.can_hibernate().await?);
    println!("可以挂起: {}", manager.can_suspend().await?);
    println!("可以重启: {}", manager.can_reboot().await?);
    println!("可以关机: {}", manager.can_power_off().await?);
    
    // 7. 系统状态信息
    println!("\n=== 系统状态 ===");
    println!("当前登录用户数: {}", manager.user_count().await?);
    println!("当前会话数: {}", manager.session_count().await?);
    println!("系统空闲状态: {}", manager.idle_hint().await?);
    
    Ok(())
}

功能说明

该库提供了以下主要功能:

  1. 管理用户会话 - 列出、查询和控制用户会话
  2. 电源管理 - 检查系统电源状态能力(休眠、挂起等)
  3. 设备管理 - 与logind管理的设备交互
  4. 席位管理 - 处理多席位配置

许可证

该库采用以下许可证之一:

  • Apache-2.0 WITH LLVM-exception
  • Apache-2.0
  • MIT

1 回复

Rust系统登录管理库logind-zbus使用指南

logind-zbus是一个Rust库,提供了通过DBus与Linux系统登录服务(logind)交互的接口。它允许开发者管理系统会话、电源管理和其他系统登录相关功能。

功能特性

  • 与systemd-logind服务交互
  • 管理系统会话
  • 处理电源管理操作(休眠、关机等)
  • 监听登录/注销事件
  • 控制会话锁定/解锁

安装方法

在Cargo.toml中添加依赖:

[dependencies]
logind-zbus = "0.2"
zbus = "3.0"

完整示例代码

下面是一个完整的示例,展示了如何使用logind-zbus库进行会话管理、电源操作和事件监听:

use logind_zbus::manager::ManagerProxy;
use zbus::zvariant::OwnedObjectPath;
use tokio::time::{sleep, Duration};

#[tokio::main]
async fn main() -> zbus::Result<()> {
    // 1. 创建系统DBus连接
    let connection = zbus::Connection::system().await?;
    let proxy = ManagerProxy::new(&connection).await?;

    // 2. 获取并打印当前会话信息
    println!("=== 当前会话信息 ===");
    let sessions = proxy.list_sessions().await?;
    println!("活动会话: {:?}", sessions);
    
    // 3. 获取并打印当前用户信息
    println!("\n=== 当前用户信息 ===");
    let users = proxy.list_users().await?;
    println!("登录用户: {:?}", users);

    // 4. 设置空闲处理
    println!("\n=== 设置空闲处理 ===");
    proxy.set_idle_hint(true).await?;
    proxy.set_idle_action("lock").await?;
    println!("已设置空闲锁定");

    // 5. 监听会话事件
    println!("\n=== 开始监听会话事件 ===");
    let mut session_added = proxy.receive_session_new().await?;
    let mut session_removed = proxy.receive_session_removed().await?;
    
    tokio::spawn(async move {
        while let Some(signal) = session_added.next().await {
            if let Ok(args) = signal.args() {
                println!("[事件] 新会话创建: {}", args.session_id);
            }
        }
    });
    
    tokio::spawn(async move {
        while let Some(signal) = session_removed.next().await {
            if let Ok(args) = signal.args() {
                println!("[事件] 会话移除: {}", args.session_id);
            }
        }
    });

    // 6. 演示电源操作(注释掉实际执行,仅展示用法)
    println!("\n=== 电源操作演示 ===");
    println!("准备挂起系统(5秒后)...");
    sleep(Duration::from_secs(5)).await;
    // 实际执行挂起操作(取消注释以执行)
    // proxy.suspend(false).await?;
    println!("挂起操作已取消(演示模式)");

    Ok(())
}

代码说明

  1. 首先创建与系统DBus的连接,并初始化ManagerProxy
  2. 使用list_sessions()获取当前所有活动会话
  3. 使用list_users()获取当前登录用户信息
  4. 设置空闲处理和空闲动作(此处设置为锁定)
  5. 使用receive_session_new()receive_session_removed()监听会话事件
  6. 演示电源操作(实际执行需要取消注释)

注意事项

  1. 需要系统上有systemd和logind服务运行
  2. 某些操作可能需要root权限
  3. 需要tokio异步运行时
  4. 实际执行电源操作前请确保保存所有工作

这个示例展示了logind-zbus库的主要功能,包括会话管理、用户管理、事件监听和电源操作。您可以根据实际需求修改和扩展这个示例。

回到顶部