网络管理器和 Rust 的 zbus

主要观点:最近为一个有趣的副业项目,需将 Linux 电脑的 wifi 卡设置为“接入点”模式,从 Rust 语言出发,虽可调用nmcli命令行工具,但想在二进制文件内完成,NetworkManager 有 D-Bus API 暴露所有配置选项,Rust 有zbus crate,但其文档在某些关键处较模糊,故写下此过程供遇到相同问题的人参考。
关键信息:

  • zbus-xmlgen工具通过 D-Bus 的 introspection 能力自动生成与给定 D-Bus 端点接口的代码,运行$ zbus-xmlgen system org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/Settings生成settings.rs文件。
  • 生成的代码中add_connection函数的参数是HashMap,需参考 NetworkManager 的文档(https://networkmanager.dev/do...)确定其内容,Python 示例代码可提供参考,需手动组装HashMap
  • 可修改zbus-xmlgen生成的代码,添加类型以确保传入合规参数,避免运行时错误,目前对于嵌套结构体,需使用HashMap,可将add_connection函数的参数从HashMap<&str, &Value>改为HashMap<&str, Value>
    重要细节:
  • 生成的代码中add_connection函数的参数类型及含义在文档中不够清晰。
  • 示例代码中展示了如何构建用于设置配置的字典结构。
  • 完成设置后需处理add_connection可能返回的错误,且二进制文件需以root权限运行,否则会出错,还可通过 D-Bus 与systemd交互启动或停止服务,与Notifications守护进程交互显示桌面通知。
阅读 16
0 条评论