#!/usr/bin/python3 -tt

import atexit
import logging
import os
import re
import subprocess
import sys

sys.path.append("/usr/share/fence")
from fencing import *  # noqa: E402


logging.basicConfig(level=logging.DEBUG)

want_power_status = None


def get_power_status(conn, options):
    method = options["--ngcp-method"].lower()
    ip = options["--ip"]

    logging.info(f"Checking power status of {ip}")

    if method == "dummy" and want_power_status:
        logging.debug(f"Returning fake power status '{want_power_status}'")
        return want_power_status
    elif method == "reload":
        logging.debug(f"Checking pacemaker status of {ip} via ssh")
        ret = subprocess.run(
            [
                "timeout",
                "3",
                "ngcp-ssh",
                options["--ip"],
                "systemctl",
                "status",
                "pacemaker",
            ],
            capture_output=True,
        )
    else:
        logging.debug(f"Checking power status of {ip} via ssh")
        ret = subprocess.run(
            ["timeout", "3", "ngcp-ssh", options["--ip"], "true"],
            capture_output=True,
        )

    status = "on" if ret.returncode == 0 else "off"
    logging.info(f"Returning power status {status}")
    return status


def set_power_status(conn, options):
    global want_power_status

    action = options["--action"]
    method = options["--ngcp-method"].lower()
    ip = options["--ip"]

    logging.info(
        f"Setting power status of {ip} to '{action}' via method '{method}'"
    )

    if method == "dummy":
        want_power_status = action
        logging.debug(f"Set fake power status to '{action}'")
    elif method == "reload":
        logging.debug(f"Launching reload action for {ip}")
        subprocess.run(
            [
                "timeout",
                "5",
                "ngcp-ssh",
                ip,
                "systemctl",
                "restart",
                "pacemaker",
                "corosync",
            ],
            check=True,
        )
        logging.debug(f"Reload action for {ip} finished")
    elif method == "reboot":
        logging.debug(f"Launching reboot action for {ip}")
        subprocess.run(
            ["timeout", "10", "ngcp-ssh", ip, "systemctl", "reboot"],
            check=True,
        )
        logging.debug(f"Reboot action for {ip} finished")
    else:
        logging.error(f"Unknown fencing method '{method}'")
        return False

    return True


def main():
    # set up basic environment
    os.environ["USER"] = "root"
    os.environ["HOME"] = "/root"

    device_opt = ["ipaddr", "secure", "passwd", "ngcp-method"]

    atexit.register(atexit_handler)

    all_opt["ngcp-method"] = {
        "getopt": ":",
        "longopt": "ngcp-method",
        "help": (
            "--ngcp-method=[method]          Fencing method, e.g. 'reboot'"
        ),
        "shortdesc": "Fencing method.",
        "required": "0",
        "order": 2,
        "default": "reload",
        "choices": ["dummy", "reload", "reboot"],
    }

    opt = process_input(device_opt)
    options = check_input(device_opt, opt)

    docs = {}
    docs["shortdesc"] = "NGCP fencing agent"
    docs["longdesc"] = "NGCP fencing agent"
    docs["vendorurl"] = "https://www.sipwise.com/"
    show_docs(options, docs)

    result = fence_action(
        None, options, set_power_status, get_power_status, None
    )
    sys.exit(result)


if __name__ == "__main__":
    main()
