def exit(): sys.stderr.write("Exiting ... ") parser.exit(True, True) sys.stderr.write("Ok \n") sys.stderr.write("Exiting server ... ") global p if p!=None: print("QUIT") p.wait() atexit.unregister(exit) global exitEvent exitEvent.set() sys.stderr.write("Done\n")
def read_stdin(): while(True): try: line=sys.__stdin__.readline().strip() if line.startswith("/"): command=line[1:] if command=="quit": parser.exit(True) exit() else: Armagetronad.SendCommand(line) sys.stderr.write("Command sent to server.\n") except Exception as e: print(e)
def main(): # SETTINGS ############################################## userdatadir="./server/data" userconfigdir="./server/config" # COMMAND LINE OPTIONS ################################## oparser=OptionParser() #parser.add_option("-v", "--vardir", dest="vardir", default=None, help="Path to the var directory (server)") oparser.add_option("-d", "--datadir", dest="datadir", default=None, help="Path to the data directory (server)") oparser.add_option("-c", "--configdir", dest="configdir", default=None, help="Path to the config directory (server)") oparser.add_option("-e", "--executable", dest="server", default=None, help="Path of the server executable", metavar="EXECUTABLE") oparser.add_option("-p", "--prefix", dest="prefix", default=None, help="The prefix the server was installed to.") oparser.add_option("-n", "--name", dest="servername", default=None, help="The name of the server", metavar="SERVERNAME") oparser.add_option("--debug",dest="debug", default=False, action="store_true", help="Run in debug mode") oparser.add_option("--disable", dest="disabledCommands", action="append", help="Disable COMMAND.", metavar="COMMAND", default=[]) oparser.add_option("--default", dest="save", action="store_true", default=False, help="Set this configuration as default") oparser.add_option("-D","--disableExt", dest="disabledExtensions", default=[], action="append", help="Dsiable the extension with the name EXTENSION.", metavar="EXTENSION") oparser.add_option("--list-extensions", dest="list_extensions", default=False, action="store_true", help="List all available extensions.") options=oparser.parse_args()[0] options.vardir="server/var" optionsdict=dict() save_options=["vardir","configdir","server","datadir", "servername", "prefix"] # START ################################################# # Get available extensions if options.list_extensions: print("Extensions:") print("\n".join(extensions.getExtensions())) os.chdir(os.path.dirname(sys.argv[0]) ) if not os.path.exists("run"): os.mkdir("run") os.chdir("run") asked=False # Read prefix def read_prefix(): global asked default="" test_prefixes=["/usr","/usr/local"] for test_prefix in test_prefixes: if os.path.exists(os.path.join(test_prefix,"bin/armagetronad-dedicated")): default="["+test_prefix+"]" break while options.prefix==None or not os.path.exists(options.prefix): options.prefix=input("Prefix the server was installed to "+default+": ") if options.prefix.strip()=="": options.prefix=default[1:-1] if not os.path.exists(options.prefix): print("Error: Prefix doesn't exist.") # Read config files ++++++++++++++++++++++++++++++++ if os.path.exists("config.yaml"): optionsdict2=yaml.load(open("config.yaml","r") ) for key,value in optionsdict2.items(): try: if getattr(options, key)==None: setattr(options, key, value) except: pass else: read_prefix() asked=True if ( not options.prefix or not os.path.exists(options.prefix)) and not all((not os.path.exists(i) for i in (options.datadir, options.configdir, options.server))): read_prefix() asked=True options.server=None options.datadir=None options.configdir=None if not options.server: options.server=os.path.join(options.prefix, "bin/armagetronad-dedicated") if not options.datadir: options.datadir=os.path.join(options.prefix, "share/armagetronad-dedicated") if not options.configdir: options.configdir=os.path.join(options.prefix, "etc/armagetronad-dedicated") if not os.path.exists(options.server): options.server=os.path.join(options.prefix,"games/armagetronad-dedicated") if not os.path.exists(options.configdir): options.configdir=os.path.join(options.prefix, "etc/games/armagetronad-dedicated") if not os.path.exists(options.configdir): options.configir="/etc/armagetronad-dedicated" if not os.path.exists(options.datadir): options.datadir=os.path.join(options.prefix, "share/games/armagetronad-dedicated") Global.datadir=options.datadir Global.configdir=options.configdir Global.debug=options.debug if options.servername==None: options.servername=input("Please enter a name for your server: ") asked=True # Write config files +++++++++++++++++++++++++++++++ for save_option in save_options: optionsdict[save_option]=getattr(options, save_option) if options.save or not os.path.exists("config.yaml") or asked: yaml.dump(optionsdict, open("config.yaml","w"), default_flow_style=False ) if not os.path.exists(userconfigdir): os.makedirs(userconfigdir) if not os.path.exists(userdatadir): os.makedirs(userdatadir) if not os.path.exists(options.vardir): os.makedirs(options.vardir) open(os.path.join(options.vardir,"ladderlog.txt"),"w" ).close() print("[START] Starting server. Serverlog can be found in run/server.log") args=["--vardir",options.vardir, "--datadir",options.datadir, "--configdir",options.configdir, "--userdatadir",userdatadir, "--userconfigdir",userconfigdir] print("[START] Executable: "+options.server) t=Thread(None, target=runServerForever,args=([options.server]+args,options.debug) ) t.daemon=True t.start() while(p==None): time.sleep(1) # Give the the server some time to start up atexit.register(exit) sys.stdout=OutputToProcess() if os.path.exists("debug.log"): os.remove("debug.log") sys.stdin=WatchFile(open(os.path.join(options.vardir,"ladderlog.txt"), encoding="latin-1" ) ) sys.stdin.skipUnreadLines() sys.stderr=FlushFile(sys.__stdout__) t2=Thread(None, read_stdin) t2.daemon=True t2.start() sys.stderr.write("Reading commands from stdin.\n") Global.server_name=options.servername extensions.loadExtensions() sys.stderr.write("[START] Starting script.\n") sys.stderr.write("[START] Press ctrl+c or type /quit to exit.\n") sys.stderr.write("\n") sys.stderr.flush() reloaded=False while True: try: parser.main(debug=options.debug, disabledCommands=options.disabledCommands, reloaded=reloaded) except KeyboardInterrupt: break except SystemExit: break except Global.ReloadException: import tools tools.reload_script_modules() reloaded=True continue except Exception: sys.stderr.write("#####################################################################\n") sys.stderr.write("################## SCRIPT CRASHED ###################################\n") sys.stderr.write("#####################################################################\n") traceback.print_exc(file=sys.stderr) sys.stderr.write("#####################################################################\n") sys.stderr.flush() parser.exit(False, quiet=True) try: sys.stderr.write("Restarting in 3 seconds ... \n") sys.stderr.write("\n") time.sleep(3) reloaded=True except KeyboardInterrupt: break except: continue continue break exit()