gpt4 book ai didi

python - dbus_to_python() 正好接受 1 个参数?

转载 作者:太空宇宙 更新时间:2023-11-03 17:21:37 24 4
gpt4 key购买 nike

我正在尝试通过 Python dbus 模块控制 firewalld

我想为我当前的运行时以及我的永久配置添加一个 IP 地址到受信任的区域。

这是 firewalld 的 dbus 接口(interface)的文档: http://manpages.ubuntu.com/manpages/wily/man5/firewalld.dbus.5.html

什么有效:运行时配置

我可以将它添加到运行时配置中:

def trustIP(ip):
''' firewalld must already be running '''
from dbus import SystemBus
bus = SystemBus()
runtimeProxy = bus.get_object('org.fedoraproject.FirewallD1',
'/org/fedoraproject/FirewallD1')
runtimeProxy.addSource('trusted', ip)

非常简单。

什么不起作用:永久配置

事实证明,将其添加到永久配置中更加困难。到目前为止,这是我以交互方式尝试过的内容:

>>> from dbus import SystemBus
>>> bus = SystemBus()

# First I need to find out which object is for the trusted zone...
>>> config = bus.get_object('org.fedoraproject.FirewallD1',
'/org/fedoraproject/FirewallD1/config')
>>> config.getZoneByName('trusted')
dbus.ObjectPath('/org/fedoraproject/FirewallD1/config/zone/7')

>>> permanentProxy = bus.get_object('org.fedoraproject.FirewallD1',
'/org/fedoraproject/FirewallD1/config/zone/7')

# A quick check to make sure I have the right object:
>>> permanentProxy.getShort()
dbus.String(u'Trusted')

# Exactly what I expected, so move on and...
>>> permanentProxy.addSource('aaa.xxx.yyy.zzz') # Actual ip removed...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/dbus/proxies.py", line 145, in __call__
**keywords)
File "/usr/lib64/python2.7/site-packages/dbus/connection.py", line 651, in call_blocking
message, timeout)
dbus.exceptions.DBusException:
org.freedesktop.DBus.Python.dbus.exceptions.DBusException:
dbus_to_python() takes exactly 1 argument (2 given)

我还尝试检查 permanentProxy.getDescription(),它返回了应该有的描述,我尝试了 permanentProxy.setDescription('test'),但失败了与 permanentProxy.addSource('aaa.xxx.yyy.zzz') 完全相同的堆栈跟踪。

我会直接得出错误存在于 python dbus 模块中的结论,并假设它无法以某种方式正确处理参数,除了 runtimeProxy.addSource('trusted ', ip) 涉及两个参数并且工作完美。 config.getZoneByName('trusted') 甚至具有与 permanentProxy.addSource('aaa.xxx.yyy.zzz')` 相同的签名,完全是一个字符串,并且工作完美。

所以也许我遗漏了什么奇怪的东西?但我不知道那会是什么......

我尝试了更多但没有成功的东西

我考虑过这样一种可能性,即 addSource 应该在没有字符串参数的情况下被调用,并且可能以某种方式 curry ,所以我尝试了这个:

>>> permanentProxy.addSource()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/dbus/proxies.py", line 145, in __call__
**keywords)
File "/usr/lib64/python2.7/site-packages/dbus/connection.py", line 651, in call_blocking
message, timeout)
dbus.exceptions.DBusException: org.freedesktop.DBus.Python.TypeError: Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/slip/dbus/service.py", line 123, in reply_handler
result = method(self, *p, **k)
TypeError: addSource() takes at least 2 arguments (2 given)

现在这更奇怪了……我在另一个回溯中有一个回溯坚持我需要传递至少 2 个参数,但也说我给了它两个参数(实际上我只给了它一个,所以如何无论如何它想出了两个?)

我尝试了一些没有成功的事情:

>>> permanentProxy.addSource(dbus_interface='org.fedoraproject.FirewallD1.config.zone')
ERROR:dbus.connection:Unable to set arguments () according to signature u's': <type 'exceptions.TypeError'>: More items found in D-Bus signature than in Python arguments
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/dbus/proxies.py", line 145, in __call__
**keywords)
File "/usr/lib64/python2.7/site-packages/dbus/connection.py", line 641, in call_blocking
message.append(signature=signature, *args)
TypeError: More items found in D-Bus signature than in Python arguments

>>> permanentProxy.addSource('aaa.xxx.yyy.zzz', dbus_interface='org.fedoraproject.FirewallD1.config.zone')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/dbus/proxies.py", line 145, in __call__
**keywords)
File "/usr/lib64/python2.7/site-packages/dbus/connection.py", line 651, in call_blocking
message, timeout)
dbus.exceptions.DBusException:
org.freedesktop.DBus.Python.dbus.exceptions.DBusException:
dbus_to_python() takes exactly 1 argument (2 given)

>>> from dbus import Interface
>>> Interface(permanentProxy, 'org.fedoraproject.FirewallD1.config.zone').addSource('aaa.xxx.yyy.zzz')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/dbus/proxies.py", line 145, in __call__
**keywords)
File "/usr/lib64/python2.7/site-packages/dbus/connection.py", line 651, in call_blocking
message, timeout)
dbus.exceptions.DBusException:
org.freedesktop.DBus.Python.dbus.exceptions.DBusException:
dbus_to_python() takes exactly 1 argument (2 given)

啊!

这看起来真的像是 dbus 中的一个错误......不知何故,它最初错误地解析了 addSource 并认为它需要更少的参数,但是如果你给它更少的参数,比如它想要,它会通过那个错误的检查,然后它会正确地解析并失败,因为你的参数不匹配它。

无论如何,这就是我的理论。有人看到我没有看到的东西吗?有什么方法可以解决这个错误,如果真的有的话? IE...是否有某种我可以在 dbus 上使用的内部方法会强制它调用正确的方法?

最佳答案

以下对我有用:

>>> import dbus
>>> bus = dbus.SystemBus()
>>> config = bus.get_object('org.fedoraproject.FirewallD1',
... '/org/fedoraproject/FirewallD1/config')
>>> path = config.getZoneByName('trusted')
>>> zone = bus.get_object('org.fedoraproject.FirewallD1', path)
>>> zone.addSource('192.168.1.0/24')

此时,如果我查看 /etc/firewalld/zones/trusted.xml,我可以看到源地址已按预期添加:

<?xml version="1.0" encoding="utf-8"?>
<zone target="ACCEPT">
<short>Trusted</short>
<description>All network connections are accepted.</description>
<interface name="docker0"/>
<interface name="virbr0"/>
<source address="192.168.1.0/24"/>
</zone>

...表示我已成功更改持久化配置。

如果我在第二个 get_object 调用中使用文字路径,而不是 config.getZoneByName 的返回值,上述方法也有效。

为了它的值(value),我正在运行:

  • 软呢帽 23
  • firewalld-0.3.14.2-4.fc23.noarch
  • dbus-1.10.6-1.fc23.x86_64
  • dbus-python-1.2.0-12.fc23.x86_64

更新

您没有看到任何更新的内容,因为您使用的是 CentOS,而不是 Fedora。看起来解决这个特定任务的最简单方法可能是使用 FirewallD 附带的 firewall python 模块。以下适用于 CentOS 7:

>>> from firewall.client import *
>>> client = FirewallClient()
>>> zone = client.config().getZoneByName('public')
>>> settings = zone.getSettings()
>>> settings.addSource('192.168.1.0/24')
>>> zone.update(settings)

另一个更新

浏览 firewall.client 模块的源代码,您可以像这样直接通过 dbus 执行此操作:

>>> zone = bus.get_object('org.fedoraproject.FirewallD1', path)
>>> settings = zone.getSettings()
>>> settings[11].append('192.168.20.0/24')
>>> zone.update(settings)

在 CentOS 下工作得很好......但你最好使用 firewall 模块。

关于python - dbus_to_python() 正好接受 1 个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34424037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com