diff --git a/site_ansto/instrument/runsics.py b/site_ansto/instrument/runsics.py index 8171b98a..f9a68d93 100755 --- a/site_ansto/instrument/runsics.py +++ b/site_ansto/instrument/runsics.py @@ -17,21 +17,23 @@ sys.stdout = os.fdopen(sys.stdout.fileno(), 'w',0) # TODO These numbers should be available on the system to any application server_port = { - 'sics': {'telnet': 60001, 'interrupt': 60002, 'server': 60003, 'quieck': 60004}, - 'scriptval': {'telnet': 60011, 'interrupt': 60012, 'server': 60013, 'quieck': 60014} + 'sics': {'telnet': 60001, 'interrupt': 60002, 'server': 60003, + 'quieck': 60004}, + 'scriptval': {'telnet': 60011, 'interrupt': 60012, 'server': 60013, + 'quieck': 60014} } inst_test_sockoffset = { - 'wombat': 0, - 'echidna': 100, - 'kowari': 200, - 'quokka': 300, - 'platypus': 400, - 'taipan': 500, - 'pelican': 600, - 'dingo': 700, - 'emu': 800, - 'kookaburra': 900, - 'bilby': 1000 + 'wombat' : 0, + 'echidna' : 100, + 'kowari' : 200, + 'quokka' : 300, + 'platypus' : 400, + 'taipan' : 500, + 'pelican' : 600, + 'dingo' : 700, + 'emu' : 800, + 'kookaburra' : 900, + 'bilby' : 1000 } deflt_dir = '/usr/local/sics/server' @@ -68,14 +70,17 @@ def start_cmd(server, args): SIMENV = sicsenv['scriptval'] else: SIMENV = sicsenv[args.test] - start_str = 'sudo -u %s %s %s/SICServer -d %s' % (args.user, SIMENV, args.dir, args.config) + start_str = 'sudo -u %s %s %s/SICServer -d %s' % (args.user, SIMENV, + args.dir, args.config) # print "DEBUG: start_str:%s" % (start_str) # Suppress output if launching the script validator if (server == 'scriptval'): with open(os.devnull) as fp: - subprocess.call(shlex.split(start_str), preexec_fn=sics_preexec, cwd=args.dir, stderr=fp, stdout=fp) + subprocess.call(shlex.split(start_str), preexec_fn=sics_preexec, + cwd=args.dir, stderr=fp, stdout=fp) else: - subprocess.call(shlex.split(start_str), preexec_fn=sics_preexec, cwd=args.dir) + subprocess.call(shlex.split(start_str), preexec_fn=sics_preexec, + cwd=args.dir) status_cmd(server, args) def stop_cmd(server, args): @@ -86,7 +91,8 @@ def stop_cmd(server, args): int_port = server_port[server]['interrupt'] else: int_port = server_port[server]['interrupt'] + inst_test_sockoffset[args.sockoffset] - print "STOP %s(%d) by sending '%s' to socket %d" % (server, pid, INTMSG, int_port) + print "STOP %s(%d) by sending '%s' to socket %d" % (server, pid, + INTMSG, int_port) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.sendto( INTMSG + '\n\r', ('localhost', int_port) ) sock.close() @@ -105,13 +111,15 @@ def stop_cmd(server, args): if status_fn(server, args) != (0,0): print 'Failed to stop %s' % server print "Fragging PID %d with default KILL" % (pid) - subprocess.call(shlex.split('sudo -u %s /bin/kill %d' % (sics_killer, pid))) + subprocess.call(shlex.split('sudo -u %s /bin/kill %d' % + (sics_killer, pid))) else: return if status_fn(server, args) != (0,0): print 'Failed again!' print "Terminating PID %d with EXTREME PREJUDICE (-15)" % (pid) - subprocess.call(shlex.split('sudo -u %s /bin/kill -15 %d' % sics_killer, (pid))) + subprocess.call(shlex.split('sudo -u %s /bin/kill -15 %d' % + sics_killer, (pid))) else: return if status_cmd(server, args) != (0,0): @@ -125,7 +133,9 @@ def status_fn(server, args): else: sock = server_port[server]['server'] + inst_test_sockoffset[args.sockoffset] status_str = 'sudo -u %s netstat -nltp' % sics_checker - netstat_str, err = subprocess.Popen(shlex.split(status_str), stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() + netstat_str, err = subprocess.Popen(shlex.split(status_str), + stdout=subprocess.PIPE, + stderr=subprocess.PIPE).communicate() # ffr: We can replace the previous Popen().communicate() line with the following two lines if Python is upgraded to V2.7 # with open(os.devnull) as fp: # netstat_str = subprocess.check_output(shlex.split(status_str), stderr=fp) @@ -146,27 +156,64 @@ def status_cmd(server, args): print '%s not running' % server return (sock, pid) +args_adv_grp_help = """ + Options providing more control. Usually only useful for SICS + developers and testers. If you are running multiple instances + of SICS on a single host you can set the TEST_SICS environment + variable to one of the --test values to get nice defaults. + """ +args_config_help = 'Run SICS with the given configuration file. Default=%s' +args_dir_help = 'Run SICS from the given directory. Default=%s' +args_test_help = 'Run SICS in the given mode. Default=%s' +args_user_help = 'Run SICS as the given user. Default=%s' +args_sockoffset_help = """ + Offset the sockets to allow multiple SICS instances on a single + host. Default=%s + """ +args_sicsonly_help = 'Just run SICS without the script validator' +args_scriptval_help = """ + Launch script validator as well as SICServer. Use this to + override the default action when the TEST_SICS environmant + variable is set. + """ +args_dev_help = """ + Launch SICS only in current directory listening on socket %s + and with simulation = fullsim + """ def main(**kwargs): global sics_killer, sics_checker runsics_cmd = {'start': start_cmd, 'stop': stop_cmd, 'status': status_cmd} # Setup defaults. Use nice defaults in test environments. # Parse arguments - parser = argparse.ArgumentParser( description='SICS Server startup script.' ) + parser = argparse.ArgumentParser( description='SICS Server startup script.') cmd_grp = parser.add_argument_group('Commands', 'Runsics commands') - adv_grp = parser.add_argument_group('Advanced', 'Options providing more control. Usually only useful for SICS developers and testers. If you are running multiple instances of SICS on a single host you can set the TEST_SICS environment variable to one of the --test values to get nice defaults.') + adv_grp = parser.add_argument_group('Advanced', args_adv_grp_help) # Mandatory arguments cmd_grp.add_argument('cmd', choices=['start', 'stop', 'status']) # Advanced arguments - adv_grp.add_argument('-c', '--config', help='Run SICS with the given configuration file. Default=%s' % inst_config, default = inst_config ) - adv_grp.add_argument('-d', '--dir', help='Run SICS from the given directory. Default=%s' % deflt_dir, default = deflt_dir) - adv_grp.add_argument('-t', '--test', choices=['fullsim', 'fakedev', 'scriptval'], help='Run SICS in the given mode. Default=%s' % deflt_test, default=deflt_test) - adv_grp.add_argument('-u', '--user', help='Run SICS as the given user. Default=%s' % deflt_user, default = deflt_user ) - adv_grp.add_argument('--sockoffset', help='Offset the sockets to allow multiple SICS instances on a single host. Default=%s' % deflt_sockoffset, choices=inst_test_sockoffset.keys(), default = deflt_sockoffset ) + adv_grp.add_argument('-c', '--config', help= args_config_help % inst_config, + default = inst_config ) + adv_grp.add_argument('-d', '--dir', help=args_dir_help % deflt_dir, + default = deflt_dir) + adv_grp.add_argument('-t', '--test', + choices=['fullsim', 'fakedev', 'scriptval'], + help=args_dir_help % deflt_test, default=deflt_test) + adv_grp.add_argument('-u', '--user', help= args_user_help % deflt_user, + default = deflt_user ) + adv_grp.add_argument('--sockoffset', + help= args_sockoffset_help % deflt_sockoffset, + choices=inst_test_sockoffset.keys(), + default = deflt_sockoffset ) exc_grp = parser.add_mutually_exclusive_group() - exc_grp.add_argument('--sicsonly', help='Just run SICS without the script validator', action='store_true', default=False) - exc_grp.add_argument('--scriptval', help='Launch script validator as well as SICServer. Use this to override the default action when the TEST_SICS environmant variable is set.', action='store_true', default=False) - exc_grp.add_argument('--dev', help='Launch SICS only in current directory listening on socket %s and with simulation = fullsim' % (server_port['sics']['server'] + inst_test_sockoffset[inst_name]), action='store_true') + exc_grp.add_argument('--sicsonly', help= args_sicsonly_help, + action='store_true', default=False) + exc_grp.add_argument('--scriptval', help= args_scriptval_help, + action='store_true', default=False) + exc_grp.add_argument('--dev', + help= args_dir_help % (server_port['sics']['server'] + + inst_test_sockoffset[inst_name]), + action='store_true') args = parser.parse_args() # By default don't launch script validator in development environments. if args.dev: