Beispiel #1
0
    def run(self):
        ssbot = None
        botlist = []
        try:
            ssbot = SubspaceBot(False, False, self.MQueue, logging.getLogger(
                "ML." + self.type + ".Core"))
            ssbot.set_bot_info(self.type, self.description, self.owner)
            self.ssbot = ssbot
            ssbot.arena = self.arena  # serexl's bots look at arena in init
            for m in self.modules:
                bot = load_bot(
                    ssbot,
                    m[0],
                    m[1],
                    self.inifile,
                    self.args,
                    logging.getLogger("ML." + self.type + "." + m[0])
                )
                if bot:
                    botlist.append(bot)
            retry = 0
            while self.keepgoing:
                ssbot.connect_to_server(
                    self.host,
                    self.port,
                    self.bname,
                    self.bpassword,
                    self.arena
                )
                while ssbot.is_connected() and self.keepgoing:
                        retry = 0
                        event = ssbot.wait_for_event()
                        for b in botlist:
                            b.handle_events(ssbot, event)
                if ssbot.should_reconnect() and retry < 6:
                    self.logger.debug("Disconnected...")
                    ssbot.reset_state()
                    retry += 1
                    time.sleep(60 * retry)
                    self.logger.debug("Reconnecting...")
                else:
                    break

        except:
            log_exception(self.logger)
        finally:
            if isinstance(ssbot, SubspaceBot) and ssbot.is_connected():
                ssbot.disconnect_from_server()
            for b in botlist:
                b.cleanup()
Beispiel #2
0
def MasterMain():
    ssbot = None
    master = None
    BotList = None
    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 = MasterQueue()
        ssbot = SubspaceBot(
            False, True, Queue, logging.getLogger("ML.Master.Core"))
        ssbot.set_bot_info("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 = load_bot(
                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.should_reconnect():
            ssbot.connect_to_server(config.Host,
                                  config.Port,
                                  config.MasterName,
                                  config.MasterPassword,
                                  config.MasterArena)
            while ssbot.is_connected():
                    wait_time = 0
                    event = ssbot.wait_for_event()
                    for b in BotList:
                        b.handle_events(ssbot, event)
            logger.critical("Master disconnected")
            if ssbot.should_reconnect():
                ssbot.reset_state()
                wait_time += 60

                # if wait is over 10 mins reset wait period
                if wait_time > 600:
                    wait_time = 0

                # wait a little longer if retry fails each time
                time.sleep(wait_time)
                logger.critical("Reconnecting")

    except (KeyboardInterrupt, SystemExit):
        logger.critical("CTRL-c or System.exit() detected")
    except:
        logger.critical("Unhandled Exception")
        log_exception(logger)
    finally:
        if ssbot and ssbot.is_connected():
            ssbot.disconnect_from_server()
        logger.info("Master disconnected")
        logger.info("Waiting For Bots to stop")
        logger.critical("Master shutting down")
        if master:
            master.StopAllBots()
        logger.critical("Requested Stop for all active bots...")
        if BotList:
            for b in BotList:
                b.cleanup()
        logger.critical("Master Bot behaviors cleansed")
        filehandler.close()
        sys.exit(1)
Beispiel #3
0
def MasterMain():
    ssbot = None
    master = None
    BotList = None
    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 = MasterQueue()
        ssbot = SubspaceBot(False, True, Queue,
                            logging.getLogger("ML.Master.Core"))
        ssbot.set_bot_info("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 = load_bot(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.should_reconnect():
            ssbot.connect_to_server(config.Host, config.Port,
                                    config.MasterName, config.MasterPassword,
                                    config.MasterArena)
            while ssbot.is_connected():
                wait_time = 0
                event = ssbot.wait_for_event()
                for b in BotList:
                    b.handle_events(ssbot, event)
            logger.critical("Master disconnected")
            if ssbot.should_reconnect():
                ssbot.reset_state()
                wait_time += 60

                # if wait is over 10 mins reset wait period
                if wait_time > 600:
                    wait_time = 0

                # wait a little longer if retry fails each time
                time.sleep(wait_time)
                logger.critical("Reconnecting")

    except (KeyboardInterrupt, SystemExit):
        logger.critical("CTRL-c or System.exit() detected")
    except:
        logger.critical("Unhandled Exception")
        log_exception(logger)
    finally:
        if ssbot and ssbot.is_connected():
            ssbot.disconnect_from_server()
        logger.info("Master disconnected")
        logger.info("Waiting For Bots to stop")
        logger.critical("Master shutting down")
        if master:
            master.StopAllBots()
        logger.critical("Requested Stop for all active bots...")
        if BotList:
            for b in BotList:
                b.cleanup()
        logger.critical("Master Bot behaviors cleansed")
        filehandler.close()
        sys.exit(1)