1

firewalldPythondbusモジュールを介して制御しようとしています。

現在のランタイムと永続的な構成の両方について、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で使用できる内部メソッドはありますか?

4

1 に答える 1

1

以下は私にとってはうまくいきます:

>>> 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、 からの戻り値の代わりに、2 番目の呼び出しでリテラル パスを使用した場合にも機能しconfig.getZoneByNameます。

それだけの価値があるので、私は走っています:

  • フェドラ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

アップデート

Fedora ではなく CentOS を使用しているため、新しいものは表示されません。この特定のタスクを解決する最も簡単な方法はfirewall、FirewallD に同梱されている 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モジュールを使用する方がはるかに優れています。

于 2015-12-23T02:25:42.953 に答える