#!/usr/bin/env python

import os
import os.path
import sys
import syslog
import traceback
import subprocess


import isi.app.lib.cluster as cluster
import isi.gconfig as gconfig
import isi.net.flexnet as flexnet
from isi.celog.constants import ESRS_PROVISIONED_FLAG

def parse(subnet_pool_list):
    pairs = []
    for pair in subnet_pool_list:
        pair = pair.rstrip('\n')
        l = pair.split(':')
        if len(l) != 2:
            pairs = []
            break
        pairs.append({'subnet': l[0], 'pools': l[1].split(';')})

    return pairs

def main():
    tree = gconfig.Tree("remote-support")
    base = c = gconfig.open(tree)
    ctx = c.ctx_new()
    connectemc_cfg = ctx.read("connectemc")
    if not connectemc_cfg["enabled"]:
        # Nothing to do
        sys.exit(0)
    
    serialno = cluster.DeviceInfo().serial_number()
    if not serialno:
        syslog.syslog(syslog.LOG_ERR, "Failed isi_run_gwext: need serial "
                "number")
        sys.exit(1)
    flexcfg = flexnet.config_try_load()
    my_devid = cluster.Cluster().local_devid()
    addrs = []
    empty = 1

    if os.path.exists("/etc/ifs/esrs_subnet_pools.txt"):
        sp_file = open("/etc/ifs/esrs_subnet_pools.txt")
        subnet_pools_list = parse(sp_file)
        sp_file.close()
        if subnet_pools_list != []:
            empty = 0
            for subnet in flexcfg.subnets:
                for d in subnet_pools_list:
                    if subnet.name == d['subnet']:
                        for pool in subnet.pools:
                            if pool.name in d['pools']:
                                for iid in pool.iface_ids:
                                    if iid.devid == my_devid:
                                        addrs += pool.get_addrs(iid)
    if empty:
        subnet_name = connectemc_cfg['remote_support_subnet']
        for subnet in flexcfg.subnets:
            if subnet.name == subnet_name:
                for pool in subnet.pools:
                    for iid in pool.iface_ids:
                        if iid.devid == my_devid:
                            addrs += pool.get_addrs(iid)

    if not addrs:
        if os.path.exists(ESRS_PROVISIONED_FLAG):
            os.remove(ESRS_PROVISIONED_FLAG)
        sys.exit(0)

    # Lets arbitrarily choose the first IP we find.
    my_address = str(addrs[0])

    primary_gateway = connectemc_cfg["primary_esrs_gateway"]
    secondary_gateway = connectemc_cfg["secondary_esrs_gateway"]

    os.chdir("/opt/connectemc/ESRSGWExt")
    for gateway in (primary_gateway, secondary_gateway):
        if gateway:
            ret = subprocess.call(["/usr/local/connectemc/ESRSGWExt/GWExt",
                                   "--devicesn=%s" % serialno,
                                   "--deviceip=%s" % my_address,
                                   "--gatewayip=%s" % gateway,
                                   "--operation=Manage"])
            ret = subprocess.call(["/usr/local/connectemc/ESRSGWExt/GWExt",
                                   "--devicesn=%s" % serialno,
                                   "--deviceip=%s" % my_address,
                                   "--gatewayip=%s" % gateway,
                                   "--operation=Update"])
            open(ESRS_PROVISIONED_FLAG, "w").close()

if __name__ == '__main__':
    try:
        main()
    except Exception as e:
        syslog.syslog(syslog.LOG_ERR,
                "Failed isi_run_gwext %s" % (traceback.format_exc(),))
        sys.exit(1)
