Esempio n. 1
0
	def run(self):
		try:
			BotList = []
			ssbot = SubspaceBot(False,False,self.MQueue,logging.getLogger("ML." +self.type +".Core"))
			ssbot.setBotInfo(self.type,self.description,self.owner)
			self.ssbot = ssbot
			ssbot.arena = self.arena# serexl's bots look at arena in init
			bot = None
			for m in self.modules:
				bot = LoadBot(ssbot,m[0],m[1],self.inifile,self.args,logging.getLogger("ML." +self.type +"."+ m[0]))
				if bot:
					BotList.append (bot)
				bot = None
			retry = 0	 
			while self.keepgoing:
				ssbot.connectToServer(self.host, 
									self.port,
									self.bname,
									self.bpassword, 
									self.arena)	
				while ssbot.isConnected() and self.keepgoing:
						retry = 0
						event = ssbot.waitForEvent()
						for b in BotList:
							b.HandleEvents(ssbot,event);
				if 	ssbot.shouldReconnect() and retry < 6:	
					self.logger.debug("Disconnected...")				
					ssbot.resetState()
					retry +=1
					time.sleep(60*retry)
					self.logger.debug("Reconnecting...")
				else:
					break

		except:
			LogException(self.logger)  
		finally:
			if ssbot.isConnected():
				ssbot.disconnectFromServer()
			for b in BotList:
				b.Cleanup()
Esempio n. 2
0
def MasterMain():
	try:
		#other bots use logging i dont want it to spamm the main logger
		rootlogger = logging.getLogger('')
		rootlogger.addHandler(NullHandler())
		rootlogger.setLevel(logging.DEBUG)
		#logging.basicConfig(level=logging.ERROR,
		#					format='%(asctime)s:%(name)s:%(levelname)s:%(message)s',
		#					datefmt='%m-%d %H:%M')
		
		logger = logging.getLogger("ML")
		logger.setLevel(logging.DEBUG)	
		
		
		# set a format
		formatter = logging.Formatter('%(asctime)s:%(name)s:%(levelname)s:%(message)s')
		
		
		# define a Handler which writes INFO messages or higher to the sys.stderr
		console = logging.StreamHandler()
		console.setLevel(logging.DEBUG)
		# tell the handler to use this format
		console.setFormatter(formatter)
		# add the handler to the mainloop logger
		logger.addHandler(console)
	
		
		filehandler  = logging.FileHandler(os.path.join(os.getcwd(),"Bots.log"),mode='a')
		filehandler.setLevel(logging.ERROR)
		filehandler.setFormatter(formatter)
		logger.addHandler(filehandler)
	
		#command Line Options
		parser = OptionParser()
		
		parser.add_option("-c", "--ConfigFile", dest="ConfigFile",
					  help="Load Configuration from a non default file",
					  default=os.path.join(os.getcwd(),"Bots.json"))
		
		
		parser.add_option("-p", "--Password", dest="Password",
					  help="pass sysop/smod pass by commandline instead of in config",
					  default=None)
		
		(options, args) = parser.parse_args()
	
		Queue = MasterQue()
		ssbot = SubspaceBot(False,True,Queue,logging.getLogger("ML.Master.Core"))
		ssbot.setBotInfo("Master","MasterBot Manages the starting/stopping of bots", None)
		BotList = [ ]
		config = GlobalConfiguration(options.ConfigFile,options.Password)
		#this adds dir's to pythonpath so we can run the dev code out of seperate dirs
		for p in config.paths:
			sys.path.append(p)
		#get the module object for the current file...	
		module = sys.modules[globals()['__name__']]
		#loads atleast the masterbot
		md = ModuleData("Master",module,"None",config.ConfigurationFile,"",logging.getLogger("ML.Master"))
		master = Bot(ssbot,md,config,Queue)
		BotList.append(master)
		#load any bots that are specified in the config
		bot = None
		for m in config.Modules:
			bot = LoadBot(ssbot,m[0],m[1],config.ConfigurationFile,"",logging.getLogger("ML.Master."  + m[0]))
			if bot:
				BotList.append (bot)
			bot = None
		wait_time = 0
		while ssbot.shouldReconnect():
			ssbot.connectToServer(config.Host,
								  config.Port, 
								  config.MasterName, 
								  config.MasterPassword,
								  config.MasterArena)		   
			while ssbot.isConnected():
					wait_time = 0
					event = ssbot.waitForEvent()
					for b in BotList:
						b.HandleEvents(ssbot,event)
			logger.critical("Master disconnected")
			if ssbot.shouldReconnect():				
				ssbot.resetState()
				wait_time+=60
				if wait_time > 600: #if wait is over 10 mins reset wait period
					wait_time = 0
				time.sleep(wait_time) # wait a little longer if retry fails each time
				logger.critical("Reconnecting")	
		
	except (KeyboardInterrupt, SystemExit):
		logger.critical("CTRL-c or System.exit() detected")	
	except:
		logger.critical("Unhandled Exception")
		LogException(logger)
	finally:
		if ssbot.isConnected():
			ssbot.disconnectFromServer()
		logger.info( "Master disconnected" )
		logger.info( "Waiting For Bots to stop")
		logger.critical("Master shutting down")
		master.StopAllBots()
		logger.critical("Requested Stop for all active bots...")
		for b in BotList:
			b.Cleanup()
		logger.critical("Master Bot behaviors cleansed")
		filehandler.close()
		sys.exit(1)