From ebae3805f5cb757113f11cca85dfce2f4d14104b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Diemer?= <stephane.diemer@ubicast.eu>
Date: Tue, 13 Nov 2018 08:51:48 +0100
Subject: [PATCH] Use systemctl if dbus is not installed to get fail2ban state.

---
 tests/test_fail2ban.py | 55 ++++++++++++++++++++++++++++--------------
 1 file changed, 37 insertions(+), 18 deletions(-)

diff --git a/tests/test_fail2ban.py b/tests/test_fail2ban.py
index 14c00ff4..6d30a34e 100755
--- a/tests/test_fail2ban.py
+++ b/tests/test_fail2ban.py
@@ -7,8 +7,6 @@ Checks the current state of the fail2ban service.
 from pathlib import Path
 import sys
 
-# pylint: disable=E0401
-import dbus
 
 sys.path.append(str(Path(__file__).parents[1].resolve()))
 
@@ -25,22 +23,43 @@ def get_service_state(name: str) -> tuple:
     :rtype: tuple
     """
 
-    bus = dbus.SystemBus()
-    systemd = bus.get_object("org.freedesktop.systemd1", "/org/freedesktop/systemd1")
-    manager = dbus.Interface(systemd, "org.freedesktop.systemd1.Manager")
-    unit = manager.LoadUnit("{}.service".format(name))
-    proxy = bus.get_object("org.freedesktop.systemd1", str(unit))
-
-    active = proxy.Get(
-        "org.freedesktop.systemd1.Unit",
-        "ActiveState",
-        dbus_interface="org.freedesktop.DBus.Properties",
-    )
-    state = proxy.Get(
-        "org.freedesktop.systemd1.Unit",
-        "SubState",
-        dbus_interface="org.freedesktop.DBus.Properties",
-    )
+    try:
+        # pylint: disable=E0401
+        import dbus
+    except ImportError:
+        u.log("Using systemctl to get current state.")
+        returncode, output = u.exec_cmd(
+            "systemctl status fail2ban | grep 'Active:'", log_output=False
+        )
+        if returncode != 0:
+            active = "no"
+            state = "not installed"
+        else:
+            info = output.replace("Active:", "").strip().split(" ")
+            if len(info) > 1:
+                active = info[0]
+                state = info[1].strip("()")
+            else:
+                active = "no"
+                state = "unknown"
+    else:
+        u.log("Using dbus to get current state.")
+        bus = dbus.SystemBus()
+        systemd = bus.get_object("org.freedesktop.systemd1", "/org/freedesktop/systemd1")
+        manager = dbus.Interface(systemd, "org.freedesktop.systemd1.Manager")
+        unit = manager.LoadUnit("{}.service".format(name))
+        proxy = bus.get_object("org.freedesktop.systemd1", str(unit))
+
+        active = proxy.Get(
+            "org.freedesktop.systemd1.Unit",
+            "ActiveState",
+            dbus_interface="org.freedesktop.DBus.Properties",
+        )
+        state = proxy.Get(
+            "org.freedesktop.systemd1.Unit",
+            "SubState",
+            dbus_interface="org.freedesktop.DBus.Properties",
+        )
 
     return str(active), str(state)
 
-- 
GitLab