Skip to content
Snippets Groups Projects
test_fail2ban.py 2.43 KiB
Newer Older
#!/usr/bin/env python3
"""
Criticality: Low
This test check 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()))

# pylint: disable=wrong-import-position
from envsetup import utils as u  # noqa: E402


def get_service_state(name: str) -> tuple:
    """Get the systemd service state.

    :param name: Service name
    :type name: str
    :return: Active state, and running state.
    :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",
    )

    return str(active), str(state)


def check_service_running(name: str) -> bool:
    """Check that the given service is active and running.

    :param name: Service name
    :type name: str
    :return: Wether the service active and running or not
    :rtype: bool
    """

    active, state = get_service_state(name)

    if active != "active" or state != "running":
        return False

    return True


def get_jails() -> list:
    """Get the list of active jails.

    :return: List of jails
    :rtype: list
    """

    _, output = u.exec_cmd(["fail2ban-client status | grep 'Jail list'"])
    jails = output.split(":")[1].replace(" ", "").split(",")

    return jails


def check_jail(name: str) -> int:
    _, output = u.exec_cmd("fail2ban-client status {} | grep 'Jail list'".format(name))
    print(output)
    return 0


def main():
    """Run all checks and exits with corresponding exit code."""

    # init
    errors = 0
    warnings = 0

    print("Checking fail2ban state:")
    if not check_service_running("fail2ban"):
        u.warning("fail2ban is not running")
        warnings += 1
    else:
        u.success("fail2ban is running")

    # print("Checking fail2ban jails:")

    if errors:
        sys.exit(1)
    if warnings:
        sys.exit(3)
    else:
        sys.exit(0)


if __name__ == "__main__":
    main()