#!/usr/bin/python3
# -*- coding: UTF-8 -*-
"""
Handle OpenVPN client connection event.
"""
# © 2012, Multapplied Networks, Inc.
import json
import logging
import os
import re
import socket
import sys
from systemd.journal import JournalHandler


# This uses a very short timeout since OpenVPN blocks while this script runs
TIMEOUT = 1
LOG_LEVEL = logging.INFO


class EventError(Exception):
    pass


def send_disconnect(
    node_id,
    path="/run/bondingadmin/mgmtvpn-event.sock"
) -> None:
    """
    Send the disconnect event.
    """
    request = {
        "event": "disconnect",
        "id": node_id,
    }

    sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    sock.settimeout(TIMEOUT)
    try:
        sock.connect(path)
    except OSError as e:
        raise EventError(f"Could not connect to event handler socket: {e}")
    sock.send(json.dumps(request).encode())
    data = sock.recv(1024)
    try:
        response = json.loads(data)
    except ValueError:
        raise EventError("Invalid response data")

    if "error" in response:
        raise EventError(f"Got error from server: {response['error']}")


if __name__ == "__main__":
    logger = logging.getLogger()
    logger.setLevel(LOG_LEVEL)
    handler = JournalHandler()
    handler.setLevel(LOG_LEVEL)
    logger.addHandler(handler)

    node_id = None
    try:
        node_id_match = re.match(r"node-([0-9]+)-", os.environ["common_name"])
        node_id = int(node_id_match.group(1))
        logger.info(f"Node {node_id}: Starting disconnect")

        try:
            config = send_disconnect(node_id)
        except EventError as e:
            logger.error(f"Node {node_id}: Got error handling event: {e}")
            sys.exit(1)
    except Exception as e:
        logger.exception(f"Node {node_id}: Got exception handling event")
        sys.exit(1)  # This disconnects the client.

    logger.info(f"Node {node_id}: Completed disconnect event")
