扩展 Dbus 服务

Posted

技术标签:

【中文标题】扩展 Dbus 服务【英文标题】:Extend Dbus Service 【发布时间】:2019-04-21 03:18:17 【问题描述】:

更大的目标:

编写针对课堂学校环境的批处理用户管理器。

问题

我想编写一个用户管理器,它使用 GUI 来为课堂环境添加、管理和删除用户。我正在开发的程序是ltsp-manager。

到目前为止,所有的用户管理都是通过执行 bash 命令来完成的。来自 python 脚本。这意味着所有的 GUI 都必须以 root 身份运行,并且一切都是手工制作的。

目标

创建一个处理所有帐户管理的 Dbus 服务,并让 GUI 以不时需要密码的普通用户身份运行。

我环顾四周,发现在org.freedesktop.Accounts 中已经有一个service 在做很多我想做的功能。但是,它也缺少一些。完全缺少的是组的管理。

使用org.freedesktop.Accounts 功能并添加一些附加功能/方法的好方法是什么?

到目前为止的想法

我想到的事情包括:

    只需重做所有工作 - 意味着大量重复工作。 复制接口并编写调用原始接口的函数 编写一个只实现附加功能而不触及原始功能的服务。然后客户端将使用原始服务和新编写的服务。

我所有的测试实验都是用python3pydbus 完成的,这似乎是许多人中最好的选择。

我从未编写过真实世界的 dbus 服务 - 尽管实验确实在 d-feet 中显示了一些结果。这个问题实际上并不是我需要输入什么类型的问题,而是一个最佳实践问题。

【问题讨论】:

【参考方案1】:

最好的长期答案是fix accountsservice upstream to implement groups support。已经为此努力了;它只需要有人把它捡起来并完成它。 accountsservice 是提供org.freedesktop.Accounts 规范实现的项目。

其他方法不好,因为:

只需重做所有工作 - 意味着大量重复工作。

正如你所说,这是很多重复的工作,然后你必须全部维护。

复制接口并编写调用原始接口的函数

这意味着您必须永远跟上帐户服务的更改和添加。

编写一个只实现附加功能而不触及原始功能的服务。然后客户端将使用原始服务和新编写的服务。

这不会带来任何额外的维护问题,但意味着您的服务无法与 accountsservice 很好地集成。例如,您的 D-Bus 对象的更新和 accountsservice 对象的更新之间可能存在竞争条件。您将无法与 accountservice 的(许多)其他用户分担组代码的维护负担。

【讨论】:

感谢您的回答,您可能是对的! - 我很犹豫,因为宣布的replacement of org.freedesktop.Accounts by SSSD 将具有所有必要的接口。然而,这似乎需要相当长的时间才能完成。我可以尝试完成 Accountsservice 的组分支,但这意味着我需要修复一个东西,因为我想修复一个东西,因为我想修复一个东西 - 这什么时候结束;( ...

以上是关于扩展 Dbus 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何在python的扩展类中使用dbus导出方法,继承方法?

简单(但具体)的侦听器和发送器 Python 3 DBus 示例

通过 Dbus 联系 Pulse Audio

在 Gjs / Gnome Shell 中调用 DBus 方法

在gjs中使用GDBus调用DBus方法,没有输出?

用 Onboard -> Hide/Show via DBus 替换 Gnomes 虚拟键盘不起作用