#!/usr/bin/python


##
## Edit this list to update the list of IOCs
##
##  IOCNAME  PORT   Command
## Notes:
##   1. IOCNAME  must be a unique name
##   2. PORT     must be unique number > 2048
##   3. ONBOOT   0 or 1 to set whether to run with '--onboot'
##   4. lines beginning with '#' are ignored.

IOCLIST = """# real iocs, terminal servers
13LAB2          20041   1  /usr/bin/telnet gsets1.cars.aps.anl.gov 4002
13IDE           20028   1  /usr/bin/telnet gsets1.cars.aps.anl.gov 4003
13BMD           20026   1  /usr/bin/telnet gsets1.cars.aps.anl.gov 4004
13IDC           20023   1  /usr/bin/telnet gsets1.cars.aps.anl.gov 4005
13IDD           20022   1  /usr/bin/telnet gsets1.cars.aps.anl.gov 4006
13LAB           20020   1  /usr/bin/telnet gsets1.cars.aps.anl.gov 4007

13BMA           20025   1  /usr/bin/telnet gsets2.cars.aps.anl.gov 4002
13IDA           20024   1  /usr/bin/telnet gsets2.cars.aps.anl.gov 4004
13BMDHUTCH      20027   1  /usr/bin/telnet gsets2.cars.aps.anl.gov 4007
13BMC           20021   1  /usr/bin/telnet gsets2.cars.aps.anl.gov 4008

# soft iocs
13BMA_LINUX     20050   1   /home/epics/support/CARS/iocBoot/ioc13bma_linux/start_epics
13IDA_LINUX     20051   1   /home/epics/support/CARS/iocBoot/ioc13ida_linux/start_epics
13BMD_LINUX     20052   1   /home/epics/support/CARS/iocBoot/ioc13bmd_linux/start_epics
13IDC_LINUX     20053   1   /corvette/home/epics/support/CARS/iocBoot/ioc13idc_linux/start_epics

13BMC_XPS       20129   1   /home/epics/support/CARS/iocBoot/ioc13bmc_GPD_XPS/start_epics
13IDC_XPS       20130   1   /home/epics/support/CARS/iocBoot/ioc13idc_GPD_XPS/start_epics
13IDD_XPS       20133   1   /home/epics/support/CARS/iocBoot/ioc13idd_DAC_XPS/start_epics
13BMD_XPS_DAC   20134   1   /home/epics/support/CARS/iocBoot/ioc13bmd_DAC_XPS/start_epics
13IDCD_MONO_XPS 20135   1   /home/epics/support/CARS/iocBoot/ioc13ida_CD_Mono_XPS/start_epics
13IDE_MONO_XPS  20136   1   /home/epics/support/CARS/iocBoot/ioc13ida_E_Mono_XPS/start_epics
13IDE_MONO_PMAC 20137   0   /home/epics/support/CARS/iocBoot/ioc13ida_E_Mono_PMAC/start_epics.sh
13BMD_XPS_LVP   20138   1   /home/epics/support/CARS/iocBoot/ioc13bmd_LVP_XPS/start_epics
13BMC_DAC_XPS   20139   1   /home/epics/support/CARS/iocBoot/ioc13bmc_DAC_XPS/start_epics
13BMD_AEROTECH  20140   1   /home/epics/support/CARS/iocBoot/ioc13bmd_aerotech/start_epics
13SPARE_TABLE   20141   1   /home/epics/support/CARS/iocBoot/ioc13SpareTable/start_epics
13BMD_TOMO      20142   1   /home/epics/support/tomoscan/iocBoot/iocTomoScan_13BM_PSO/start_IOC
13BMD_LVP_TOMO  20143   1   /home/epics/support/tomoscan/iocBoot/iocTomoScan_13BM_MCS/start_IOC
13MJOLNIR       20144   0   /home/epics/support/CARS/iocBoot/ioc13Mjolnir/start_epics
13BMD_XPS_TOMO  20145   1   /home/epics/support/CARS/iocBoot/ioc13bmd_TOMO_XPS/start_epics
13IDC_BORA      20146   1   /home/epics/support/CARS/iocBoot/ioc13idc_bora/start_epics
13SMARACT1      20147   1   /home/epics/support/CARS/iocBoot/ioc13SmarAct1/start_epics

DDIA30          20310   1   /home/epics/support/CARS/iocBoot/ioc13DDIA30/start_epics
13KEITHLEY1     20311   1   /home/epics/support/CARS/iocBoot/ioc13Keithley1/start_epics
13KEITHLEY2     20312   1   /home/epics/support/CARS/iocBoot/ioc13Keithley2/start_epics
13IDD_PACE5000  20313   1   /home/epics/support/CARS/iocBoot/ioc13idd_pace5000/start_epics
13TABOR         20314   0   /home/epics/support/CARS/iocBoot/ioc13Tabor/start_epics
13BNC505        20315   1   /home/epics/support/CARS/iocBoot/ioc13BNC505/start_epics
13PHD2000       20316   1   /home/epics/support/CARS/iocBoot/ioc13PHD2000/start_epics
13LAE500        20317   0   /home/epics/support/CARS/iocBoot/ioc13LAE500/start_epics
13XRM           20321   1   /home/epics/support/CARS/iocBoot/ioc13XRM/start_epics
13GAS_LOADING   20322   0   /home/epics/support/CARS/iocBoot/ioc13GasLoading/start_epics
13SYRINGE1      20325   0   /home/epics/support/CARS/iocBoot/ioc13Syringe1/start_epics
13SYRINGE2      20326   0   /home/epics/support/CARS/iocBoot/ioc13Syringe2/start_epics
13BMC_PACE5000  20327   0   /home/epics/support/CARS/iocBoot/ioc13bmc_pace5000/start_epics
13BMD_PACE5000  20328   0   /home/epics/support/CARS/iocBoot/ioc13bmd_pace5000/start_epics
13KEITHLEY3     20329   1   /home/epics/support/CARS/iocBoot/ioc13Keithley3/start_epics
13HG100         20330   0   /home/epics/support/CARS/iocBoot/ioc13HG100/start_epics
13ETC_1         20331   0   /home/epics/support/CARS/iocBoot/ioc13MeasCompETC_1/start_epics
13E1608_1       20332   0   /home/epics/support/CARS/iocBoot/ioc13MeasCompE1608_1/start_epics
13IDD_LVP       20333   0   /home/epics/support/CARS/iocBoot/ioc13idd_LVP/start_epics
13RAMAN_PLC     20334   0   /home/epics/support/CARS/iocBoot/ioc13Raman_PLC/start_epics
13E1608_2       20335   0   /home/epics/support/CARS/iocBoot/ioc13MeasCompE1608_2/start_epics
13IDC_DANTE1    20336   0   /home/epics/support/CARS/iocBoot/ioc13idc_dante1/start_epics
13IDD_DANTE1    20337   0   /home/epics/support/CARS/iocBoot/ioc13idd_dante1/start_epics
13BMC_DANTE1    20338   0   /home/epics/support/CARS/iocBoot/ioc13bmc_dante1/start_epics
13BMD_DANTE1    20339   0   /home/epics/support/CARS/iocBoot/ioc13bmd_dante1/start_epics
13CRYOCON1      20340   0   /home/epics/support/CARS/iocBoot/ioc13Cryocon1/start_epics
13RAMAN_PACE5000 20341  0   /home/epics/support/CARS/iocBoot/ioc13raman_pace5000/start_epics
13PECELL        20342   0   /home/epics/support/CARS/iocBoot/ioc13PECell/start_epics
13ETC_2         20343   0   /home/epics/support/CARS/iocBoot/ioc13MeasCompETC_2/start_epics
13ETC_3         20344   0   /home/epics/support/CARS/iocBoot/ioc13MeasCompETC_3/start_epics
13CRYOJET1      20345   0   /home/epics/support/CARS/iocBoot/ioc13CryoJet1/start_epics

#13IDA_PS1       20471   0   /home/epics/support/CARS/iocBoot/ioc13ida_ps1/start_epics
#13IDA_PS2       20472   0   /home/epics/support/CARS/iocBoot/ioc13ida_ps2/start_epics
#13IDB_PS1       20473   0   /home/epics/support/CARS/iocBoot/ioc13idb_ps1/start_epics
#13BMC_PS1       20475   0   /home/epics/support/CARS/iocBoot/ioc13bmc_ps1/start_epics.sh

psic_idc        20002   0   /home/specadm/Versions/current/bin/psic_idc
psic_bmc        20001   0   /home/specadm/Versions/current/bin/psic_bmc
psic_lab        20003   0   /home/specadm/Versions/current/bin/psic_lab
"""

##
##
## Usage message
USAGE = """Usage: start_ioc [options]  ioc_name

start Epics IOC with provServ

Options:
   -h / --help    show this help
   -c / --connect connect (telnet) to ioc after starting [default True]
   -s / --silent  do not connect to ioc after starting   [default False]
   -l / --list    list all iocs, with port and command
   -b / --boot   start all "on boot" iocs (silently)
"""

# procServ command
#procserv = '/usr/local/bin/procServ -n "%s_IOC" --logstamp -L /home/epics/logs/%s.log %s %s'
procserv = '/corvette/usr/local/bin/procServ --logstamp -n "%s_IOC" -L /corvette/home/epics/logs/%s.log %s %s'

import sys
from os import system
from getopt import getopt


def list_iocs():
    print(" IOC_NAME        PORT        Command")
    print("-------------------------------------------")
    print(IOCLIST)
    sys.exit()

def do_system(cmd):
    #print("do system ", cmd)
    system(cmd)

def show_usage():
    print(USAGE)
    sys.exit()

def read_ioclist(bootonly=False):
    iocs = {}
    for line in IOCLIST.split('\n'):
        line = line.strip()
        if len(line) > 3 and not line.startswith('#'):
            name, port, bootflag, cmd = line.split(None, 3)
            if int(bootflag) == 1  or (not bootonly):
                iocs[name] = (port, cmd)
    return iocs

def start(iocname, connect=False):
    iocs = read_ioclist()
    if iocname in iocs:
        port, cmd = iocs[iocname]
        pcmd = procserv % (iocname, iocname, port, cmd)
        print(pcmd)
        try:
            do_system(pcmd)
        except:
            pass
        if connect:
            system("telnet localhost %s" % port)
    else:
        print('unknown IOC: ', iocname)
        print('to list known IOCs, use  start_ioc -l')

if __name__ == '__main__':
    try:
        opts, args = getopt(sys.argv[1:], 'hlbcs',
                            ['help', 'list', 'onboot', 'connect', 'silent'])
    except:
        show_usage()

    connect = True
    for key, val in opts:
        if key in ('-h', '--help'):
            show_usage()
        elif key in ('-l', '--list'):
            list_iocs()
        elif key in ('-c', '--connect'):
            connect = True
        elif key in ('-s', '--silent'):
            connect = False
        elif key in ('-b', '--onboot'):
            connect = False
            args = read_ioclist(bootonly=True).keys()

    if len(args) < 1:
        show_usage()

    for iocname in args:
        start(iocname, connect=connect)

##
