#!/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 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)

    subnet_name = connectemc_cfg["remote_support_subnet"]
    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()
    for subnet in flexcfg.subnets:
        if subnet.name == subnet_name:
            break
    else:
        syslog.syslog(syslog.LOG_ERR, "Failed isi_run_gwext: Could not find "
                "subnet %s" % subnet_name)
        sys.exit(1)

    my_devid = cluster.Cluster().local_devid()
    addrs = []
    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)
