#!/usr/bin/python # sim -- central dispatch for Sim Factory # # Michael Thomas # Center for Computation & Technology # Louisiana State University # import sys, os, shutil ############################################ ## APP SPECIFIC DEFINES ## # # Usage when (-h, --help) is used, this is the first line showing how to call the app # optionGroups which option groups from etc/options to import. common is always imported. App = "sim" Usage = "usage: %prog [args] command" # import all option groups. optionGroups = ['sim-sync', 'sim-build', 'sim-manage', 'sim-info', 'sim-util'] ############################################ ############################################ ## INIT ## if os.path.basename(sys.argv[0]) == App: rp = os.path.realpath(__file__) paths = rp.split(os.sep) paths.pop() global BASE_PATH BASE_PATH = os.sep.join(paths) sys.path.append(BASE_PATH) sys.path.append("%s%s%s%s%s" % (BASE_PATH, os.sep, "lib", os.sep, "modules")) LIB_PATH = "%s%slib" % (BASE_PATH, os.sep) sys.path.append(LIB_PATH) from lib import * import libutil from libutil import dprint global known_commands global associated_binaries known_commands = {'sync':'sim-sync', 'build':'sim-build'} known_binaries = ['sim-sync', 'sim-build', 'sim-manage', 'sim-info', 'sim-util'] # import all of our known binaries for n in known_binaries: __import__(n) ############################################ def buildKnownCommands(): global known_commands for binary in known_binaries: cmds = sys.modules[binary].known_commands for c in cmds: known_commands[c] = binary buildKnownCommands() def buildUsageString(): global Usage cmdString = "%s\n\n\nAvailable Commands:\n" % Usage iString = [] commands = known_commands.keys() for cmd in commands: binary = known_commands[cmd] if sys.modules[binary].usage_strings.has_key(cmd): usage = sys.modules[binary].usage_strings[cmd] else: usage = "" ss = " %-30s%s" % (cmd, usage) iString.append(ss) cmdString = "%s%s" % (cmdString, "\n".join(iString)) return cmdString def CommandDispatch(): global OptionsManager global ConfigurationDatabase global SimLib global DefineDatabase global known_binaries global SimEnvironment command = OptionsManager.args[0] if command == 'help': OptionsManager.PrintHelp() sys.exit(0) # set our command in the environment SimEnvironment.COMMAND = command OptionsManager.args.pop(0) if command not in known_commands: dprint("Error, unknown command %s" % command, True) sys.exit(1) binary = known_commands[command] module = sys.modules[binary] module.main(SimEnvironment) def main(SimEnvironment): global OptionsManager global ConfigurationDatabase global SimLib global DefineDatabase OptionsManager = SimEnvironment.OptionsManager ConfigurationDatabase = SimEnvironment.ConfigurationDatabase SimLib = SimEnvironment.SimLib DefineDatabase = SimEnvironment.DefineDatabase # a small bit of error checking. if len(OptionsManager.args) == 0: OptionsManager.PrintHelp() sys.exit(0) ############################################ dprint("The Simulation Factory: manage and submit adcirc+swan jobs\n", True) dprint("defs: %s" % SimEnvironment.cdb) dprint("app path: %s" % SimEnvironment.APP_PATH) if SimEnvironment.udb != None: dprint("defs.local: %s" % SimEnvironment.udb) print CommandDispatch() # only run if you are App if os.path.basename(sys.argv[0]) == App: global SimEnvironment SimEnvironment = simenv.SimEnvironment(BASE_PATH, os.path.realpath(sys.argv[0])) SimEnvironment.initApp(usageString=buildUsageString(), optionGroups=optionGroups) main(SimEnvironment)