#!/usr/bin/python3
import re
import shlex
import subprocess
import sys
from tunnel_script.client import ServiceManagerClient
from tunnel_script.config import CONFIG_FILE
from tunnel_script.logger import setup_logger

logger = setup_logger("/var/log/replibit/cleanup-ports.log")

TUNNEL_PORT_MIN = 10000
TUNNEL_PORT_MAX = 50000


def cleanup_ports(config_file, used_ports):
    try:
        client = ServiceManagerClient(config_file, logger)
        return client.cleanup_unused_ports(used_ports)
    except Exception:
        logger.exception("Unable to send used ports data to RMC")
        return False

def get_used_ports():
    used_ports = []
    cmd = shlex.split("ss -ant4 sport ge {} sport le {}".format(TUNNEL_PORT_MIN, TUNNEL_PORT_MAX))
    ss_proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='UTF-8')
    out, err = ss_proc.communicate()

    if ss_proc.returncode != 0:
        logger.error("Unable to run ss command due error: {}".format(ss_proc.stderr))
        return None
    else:
        regexp = re.compile(r'^[A-Z0-9\s\.]+:(\d+)\s.*$')
        for line in out.splitlines():
            match = regexp.match(line)
            if match:
                used_ports.append(match.group(1))
    return used_ports


if __name__ == "__main__":
    ports = get_used_ports()
    if ports is None:
        print("Unable to get used ports", file=sys.stderr)
        sys.exit(1)
    if not cleanup_ports(CONFIG_FILE, ports):
        print("Unable to send cleanup ports request to RMC", file=sys.stderr)
        sys.exit(1)
    sys.exit(0)
