firewalld
Pythondbus
モジュールを介して制御しようとしています。
現在のランタイムと永続的な構成の両方について、IP アドレスをトラスト ゾーンに追加したいと考えています。
firewalld
の dbus インターフェイスの
ドキュメントは次のとおりです。 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 モジュールにあるという結論に飛びつき、2 つの引数が関係し、完全に機能dbus
するという事実を除いて、どういうわけか引数を適切に処理していないと仮定します。PermanentProxy.addSource('aaa.xxx.yyy.zzz')` と同じ署名で、文字列は 1 つだけで、完全に機能します。runtimeProxy.addSource('trusted', ip)
config.getZoneByName('trusted')
それで、私が見逃している何か奇妙なことがあるのでしょうか?でも、それがどうなるかはわかりません...
成功せずに試したその他のこと
addSource
文字列引数なしで呼び出される可能性があり、おそらく何らかの形でカレーが呼び出される可能性があると考えたので、これを試しました:
>>> 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)
これは今ではさらに奇妙です...別のトレースバック内に1つのトレースバックがあり、少なくとも2つの引数を渡す必要があると主張していますが、2つの引数を与えたと言っています(実際には1つしか与えなかったので、どのようにとにかく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で使用できる内部メソッドはありますか?