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

CONFIG_FILE_UMASK = 0o77 # Mask all group, other bits
URI = "/openvpn/client-disconnected"
CLIENT_CONNECT_KEY_FILE = "/etc/bondingadmin/local-www-key"
DEFAULT_SERVER = "localhost"
TIMEOUT = 10.0
MSG_PREFIX = "openvpn-client-disconnect"


def alert_disconnected(server, connect_key, node_id):
    """Tell the web server that this client disconnected."""
    return requests.post(
        "https://%s%s" % (server, URI),
        data={
            "key": connect_key,
            "id": node_id,
        },
        timeout=TIMEOUT,
        verify=False,
    )

if __name__ == "__main__":
    node_id = None
    try:
        with open(CLIENT_CONNECT_KEY_FILE, "r") as connect_key_file:
            connect_key = connect_key_file.read().strip()

        node_id_match = re.match(r"node-([0-9]+)-", os.environ["common_name"])
        node_id = int(node_id_match.group(1))
        journal.send("%s: Starting disconnect for node %s." % (MSG_PREFIX, node_id))

        response = alert_disconnected(DEFAULT_SERVER, connect_key, node_id)

        if response.status_code != requests.codes.no_content:
            journal.send("%s: Unexpected response to node %s disconnection: %s" % (MSG_PREFIX, node_id, response.status_code))
            sys.exit(1)
    except requests.exceptions.RequestException as e:
        journal.send("%s: Failed to notify of node %s disconnection: %s" % (MSG_PREFIX, node_id, e))
        sys.exit(1)
    except Exception as e:
        tb = traceback.format_exc()
        journal.send("%s: Encountered an exception while disconnecting node %s: %s" % (MSG_PREFIX, node_id, tb))
        sys.exit(1)
    journal.send("%s: Finished disconnect for node %s." % (MSG_PREFIX, node_id))
