python - 通过 Python 的 dbus 模块控制 CentOS 中的 firewalld?

标签 python centos dbus centos7 firewalld

我的目标是使用 Python 在 CentOS 7 机器上自动配置防火墙。

该操作系统带有firewalld,所以这就是我正在使用的。我调查了一下,发现它使用了 dbus(我从来没有听说过或处理过这些 - 如果我说的任何内容不正确,请纠正我。)

我找到了有关如何使用 Python 控制 dbus 进程的文档:
http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.txt

我查了一下,操作系统附带的 Python 版本包括 dbus模块,所以这似乎是一个有希望的开始。

该文档表明我需要了解更多关于 firewalld 通过 dbus 接口(interface)公开的内容。所以我做了更多的研究,发现了这个:
https://www.mankier.com/5/firewalld.dbus

第一份文件说我需要从一个“众所周知的名字”开始。他们的例子是 org.freedesktop.NetworkManager .第二个文件的标题是 firewalld.dbus ,所以我认为这是一个很好的名称,因为该文档没有在其他任何地方明确给出名称。

第一个文档还说我需要一个对象路径的名称。他们的例子是/org/freedesktop/NetworkManager .第二个文档的对象路径为 /org/fedoraproject/FirewallD1 .

我将它们放在一起并尝试使用第一个文档建议的第一种方法,SystemBusget_object() :

>>> from dbus import SystemBus
>>> bus = SystemBus()
>>> proxy = bus.get_object('firewalld.dbus', '/org/fedoraproject/FirewallD1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/site-packages/dbus/bus.py", line 241, in get_object
    follow_name_owner_changes=follow_name_owner_changes)
  File "/usr/lib64/python2.7/site-packages/dbus/proxies.py", line 248, in __init__
    self._named_service = conn.activate_name_owner(bus_name)
  File "/usr/lib64/python2.7/site-packages/dbus/bus.py", line 180, in activate_name_owner
    self.start_service_by_name(bus_name)
  File "/usr/lib64/python2.7/site-packages/dbus/bus.py", line 278, in start_service_by_name
    'su', (bus_name, flags)))
  File "/usr/lib64/python2.7/site-packages/dbus/connection.py", line 651, in call_blocking
    message, timeout)
dbus.exceptions.DBusException:
    org.freedesktop.DBus.Error.ServiceUnknown:
        The name firewalld.dbus was not provided by any .service files

我也给了org.fedoraproject.FirewallD1尝试作为第一个参数,但最终得到类似的错误消息。

为什么这些不起作用?有什么方法可以让我发现正确的名称是什么?它在错误消息的末尾提到了“.service files”......这样的文件应该放在哪里?

编辑 : 使用 find / -name *.service 找到了几个“.service 文件” .其中之一位于 /usr/lib/systemd/system/firewalld.service ...看起来很有希望,所以我会检查一下。

编辑 2 : 这是一个相当短的文件......只有大约 10 行。其中一位说BusName=org.fedoraproject.FirewallD1 .所以我不确定为什么它说任何 .service 文件都没有提供该名称......除非它由于某种原因没有使用这个文件?

最佳答案

如果单元文件说:

BusName=org.fedoraproject.FirewallD1

那么也许你应该尝试使用它作为你的总线名称:
>>> import dbus
>>> bus = dbus.SystemBus()
>>> p = bus.get_object('org.fedoraproject.FirewallD1', '/org/fedoraproject/FirewallD1')
>>> p.getDefaultZone()
dbus.String(u'FedoraWorkstation')

我根据以下事实弄清楚了这一点:
>>> help(bus.get_object)

get_object调用看起来像:
get_object(self, bus_name, object_path, introspect=True, follow_name_owner_changes=False, **kwargs)

关于python - 通过 Python 的 dbus 模块控制 CentOS 中的 firewalld?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34402914/

相关文章:

linux - aplay 命令中的混淆。

dbus - 如何使用busctl 将将字符串映射到结构的字典传递给 d-bus 方法?

python - OpenCV 误差校准教程 (solvePnPRansac)

linux - xdg-mime 安装不更新文件 mime 类型关联

linux - 如何在 Linux 中从互联网下载 eclipselink jar 文件

centos - 将 DCOS 代理节点重新附加到 DCOS

python - (unittest) 测试 Flask-Security : Cannot get past login page

python - 在脚本中以一种方式运行 scipy anova

python - Pandas date_range 从结束日期到开始日期

java - 从具有子类的类中删除 $init$ 方法