예제 #1
0
def main():
    parser = OptionParser(version=b3.getB3versionString())
    parser.add_option("-c", "--config", dest="config", default=None, help="B3 config file. Example: -c b3.xml")
    parser.add_option(
        "-r", "--restart", action="store_true", dest="restart", default=False, help="Auto-restart B3 on crash"
    )
    parser.add_option(
        "-s", "--setup", action="store_true", dest="setup", default=False, help="Setup main b3.xml config file"
    )

    (options, args) = parser.parse_args()

    if not options.config and len(args) == 1:
        options.config = args[0]

    if options.setup:
        run_setup()

    if options.restart:
        if options.config:
            run_autorestart(["--config", options.config] + args)
        else:
            run_autorestart([])
    else:
        if main_is_frozen():
            # which happens when running from the py2exe build
            try:
                run(config=options.config)
            except SystemExit, msg:
                # make sure we are not writting to the log:
                sys.stdout = sys.__stdout__
                sys.stderr = sys.__stderr__
                print msg
            except:
예제 #2
0
def main():
    """
    Main execution.
    """
    p = argparse.ArgumentParser()
    p.add_argument('-c', '--config', dest='config', default=None, metavar='b3.ini', help='B3 config file. Example: -c b3.ini')
    p.add_argument('-r', '--restart', action='store_true', dest='restart', default=False, help='Auto-restart B3 on crash')
    p.add_argument('-s', '--setup',  action='store_true', dest='setup', default=False, help='Setup main b3.ini config file')
    p.add_argument('-u', '--update', action='store_true', dest='update', default=False, help='Update B3 database to latest version')
    p.add_argument('-v', '--version', action='version', default=False, version=b3.getB3versionString(), help='Show B3 version and exit')
    p.add_argument('-a', '--autorestart', action='store_true', dest='autorestart', default=False, help=argparse.SUPPRESS)

    (options, args) = p.parse_known_args()

    if not options.config and len(args) == 1:
        options.config = args[0]

    if options.setup:
        # setup procedure is deprecated: show configuration file generator web tool url instead
        sys.stdout.write('\n')
        console_exit("  *** NOTICE: the console setup procedure is deprecated!\n" \
                     "  *** Please visit %s to generate a new B3 configuration file.\n" % B3_CONFIG_GENERATOR)

    if options.update:
        ## UPDATE => CONSOLE
        run_update(config=options.config)

    if options.restart:
        ## AUTORESTART => CONSOLE
        if options.config:
            run_autorestart(['--config', options.config] + args)
        else:
            run_autorestart([])
    else:
        run_console(options)
예제 #3
0
def main():
    parser = OptionParser(version=b3.getB3versionString())
    parser.add_option('-c', '--config', dest='config', default=None,
                      help='B3 config file. Example: -c b3.xml')
    parser.add_option('-r', '--restart',
                      action='store_true', dest='restart', default=False,
                      help='Auto-restart B3 on crash')
    parser.add_option('-s', '--setup',
                      action='store_true', dest='setup', default=False,
                      help='Setup main b3.xml config file')

    (options, args) = parser.parse_args()

    if not options.config and len(args) == 1:
        options.config = args[0]

    if options.setup:
        run_setup()

    if options.restart:
        if options.config:
            run_autorestart(['--config', options.config] + args)
        else:
            run_autorestart([])
    else:
        try:
            run(config=options.config)
        except SystemExit, msg:
            print msg
            if sys.stdout != sys.__stdout__:
                # make sure we are not writting to the log:
                sys.stdout = sys.__stdout__
                sys.stderr = sys.__stderr__
                print msg
        except:
예제 #4
0
def main():
    """
    Main execution.
    """
    p = argparse.ArgumentParser()
    p.add_argument('-c', '--config', dest='config', default=None, metavar='b3.ini', help='B3 config file. Example: -c b3.ini')
    p.add_argument('-r', '--restart', action='store_true', dest='restart', default=False, help='Auto-restart B3 on crash')
    p.add_argument('-s', '--setup',  action='store_true', dest='setup', default=False, help='Setup main b3.ini config file')
    p.add_argument('-u', '--update', action='store_true', dest='update', default=False, help='Update B3 database to latest version')
    p.add_argument('-v', '--version', action='version', default=False, version=b3.getB3versionString(), help='Show B3 version and exit')
    p.add_argument('-a', '--autorestart', action='store_true', dest='autorestart', default=False, help=argparse.SUPPRESS)

    (options, args) = p.parse_known_args()

    if not options.config and len(args) == 1:
        options.config = args[0]

    if options.setup:
        # setup procedure is deprecated: show configuration file generator web tool url instead
        sys.stdout.write('\n')
        console_exit("  *** NOTICE: the console setup procedure is deprecated!\n" \
                     "  *** Please visit %s to generate a new B3 configuration file.\n" % B3_CONFIG_GENERATOR)

    if options.update:
        ## UPDATE => CONSOLE
        run_update(config=options.config)

    if options.restart:
        ## AUTORESTART => CONSOLE
        if options.config:
            run_autorestart(['--config', options.config] + args)
        else:
            run_autorestart([])
    else:
        run(options)
예제 #5
0
def main():
    parser = OptionParser(version=b3.getB3versionString())
    parser.add_option('-c',
                      '--config',
                      dest='config',
                      default=None,
                      help='B3 config file. Example: -c b3.xml')
    parser.add_option('-r',
                      '--restart',
                      action='store_true',
                      dest='restart',
                      default=False,
                      help='Auto-restart B3 on crash')
    parser.add_option('-s',
                      '--setup',
                      action='store_true',
                      dest='setup',
                      default=False,
                      help='Setup main b3.xml config file')
    parser.add_option('-n',
                      '--nosetup',
                      action="store_true",
                      dest='nosetup',
                      default=False,
                      help='Do not enter setup mode when config is missing')

    (options, args) = parser.parse_args()

    if not options.config and len(args) == 1:
        options.config = args[0]

    if options.setup:
        run_setup(config=options.config)

    if options.restart:
        if options.config:
            run_autorestart(['--config', options.config] + args)
        else:
            run_autorestart([])
    else:
        try:
            run(config=options.config, nosetup=options.nosetup)
        except SystemExit, msg:
            # This needs some work, is ugly a.t.m. but works... kinda
            if main_is_frozen():
                if sys.stdout != sys.__stdout__:
                    # make sure we are not writing to the log:
                    sys.stdout = sys.__stdout__
                    sys.stderr = sys.__stderr__
                print msg
                raw_input("Press the [ENTER] key")
            raise
        except:
예제 #6
0
def main():
    parser = OptionParser(version=b3.getB3versionString())
    parser.add_option('-c', '--config', dest='config', default=None,
                      help='B3 config file. Example: -c b3.xml')
    parser.add_option('-r', '--restart',
                      action='store_true', dest='restart', default=False,
                      help='Auto-restart B3 on crash')
    parser.add_option('-s', '--setup',
                      action='store_true', dest='setup', default=False,
                      help='Setup main b3.xml config file')
    parser.add_option('-u', '--update',
                      action='store_true', dest='update', default=False,
                      help='Update B3 database to latest version')
    parser.add_option('-n', '--nosetup',
                      action="store_true", dest='nosetup', default=False,
                      help='Do not enter setup mode when config is missing')


    (options, args) = parser.parse_args()

    if not options.config and len(args) == 1:
        options.config = args[0]

    if options.setup:
        run_setup(config=options.config)

    if options.update:
        run_update(config=options.config)

    if options.restart:
        if options.config:
            run_autorestart(['--config', options.config] + args)
        else:
            run_autorestart([])
    else:
        try:
            run(config=options.config, nosetup=options.nosetup)
        except SystemExit, msg:
            # This needs some work, is ugly a.t.m. but works... kinda
            if main_is_frozen():
                if sys.stdout != sys.__stdout__:
                    # make sure we are not writing to the log:
                    sys.stdout = sys.__stdout__
                    sys.stderr = sys.__stderr__
                print msg
                raw_input("Press the [ENTER] key")
            raise
        except:
예제 #7
0
def main():
    p = argparse.ArgumentParser()
    p.add_argument(
        '-c',
        '--config',
        dest='config',
        default=None,
        metavar='b3.ini',
        help='B3 config file. Example: -c b3.ini'
    )
    p.add_argument(
        '-u',
        '--update',
        action='store_true',
        dest='update',
        default=False,
        help='Update B3 database to latest version'
    )
    p.add_argument(
        '-v',
        '--version',
        action='version',
        default=False,
        version=b3.getB3versionString(),
        help='Show B3 version and exit'
    )

    options, args = p.parse_known_args()

    if not options.config and len(args) == 1:
        options.config = args[0]

    if options.update:
        run_update(config=options.config)

    run(options)
예제 #8
0
    def __init__(self, config):
        self._timeStart = self.time()

        if not self.loadConfig(config):
            print('CRITICAL ERROR : COULD NOT LOAD CONFIG')
            raise SystemExit(220)

        # set up logging
        logfile = self.config.getpath('b3', 'logfile')
        log2console = self.config.has_option('devmode', 'log2console') and self.config.getboolean('devmode', 'log2console')
        self.log = b3.output.getInstance(logfile, self.config.getint('b3', 'log_level'), log2console)

        # save screen output to self.screen
        self.screen = sys.stdout
        print('Activating log   : %s' % logfile)
        sys.stdout = b3.output.stdoutLogger(self.log)
        sys.stderr = b3.output.stderrLogger(self.log)

        # setup ip addresses
        self._publicIp = self.config.get('server', 'public_ip')
        self._port = self.config.getint('server', 'port')
        self._rconPort = self._port # if rcon port is the same as the game port, rcon_port can be ommited
        self._rconIp = self.config.get('server', 'rcon_ip')
        if self.config.has_option('server', 'rcon_port'):
            self._rconPort = self.config.getint('server', 'rcon_port')
        self._rconPassword = self.config.get('server', 'rcon_password')


        if self._publicIp[0:1] == '~' or self._publicIp[0:1] == '/':
            # load ip from a file
            f = file(self.getAbsolutePath(self._publicIp))
            self._publicIp = f.read().strip()
            f.close()

        if self._rconIp[0:1] == '~' or self._rconIp[0:1] == '/':
            # load ip from a file
            f = file(self.getAbsolutePath(self._rconIp))
            self._rconIp = f.read().strip()
            f.close()

        try:
            # resolve domain names
            self._rconIp = socket.gethostbyname(self._rconIp)
        except:
            pass

        self.bot('%s', b3.getB3versionString())
        self.bot('Python: %s', sys.version)
        self.bot('Starting %s v%s for server %s:%s', self.__class__.__name__, getattr(getModule(self.__module__), '__version__', ' Unknown'), self._rconIp, self._port)

        # get events
        self.Events = b3.events.eventManager

        self.bot('--------------------------------------------')

        # setup bot
        bot_name = self.config.get('b3', 'bot_name')
        if bot_name:
            self.name = bot_name

        bot_prefix = self.config.get('b3', 'bot_prefix')
        if bot_prefix:
            self.prefix = bot_prefix

        self.msgPrefix = self.prefix

        # delay between log reads
        if self.config.has_option('server', 'delay'):
            delay = self.config.getfloat('server', 'delay')
            if self.delay > 0:
                self.delay = delay

        # delay between each log's line processing
        if self.config.has_option('server', 'lines_per_second'):
            delay2 = self.config.getfloat('server', 'lines_per_second')
            if delay2 > 0:
                self.delay2 = 1/delay2

        # demo mode: use log time
        if self.config.has_option('devmode', 'replay'):
            self.replay = self.config.getboolean('devmode', 'replay')
            if self.replay:
                self._timeStart = 0
                self.bot('Replay mode enabled')

        self.storage = b3.storage.getStorage('database', self.config.get('b3', 'database'), self)

        if self.config.has_option('server','game_log'):
            # open log file
            game_log = self.config.get('server','game_log')
            if game_log[0:6] == 'ftp://' or game_log[0:7] == 'sftp://' or game_log[0:7] == 'http://':
                self.remoteLog = True
                self.bot('Working in Remote-Log-Mode : %s' % game_log)
                
                if self.config.has_option('server', 'local_game_log'):
                    f = self.config.getpath('server', 'local_game_log')
                else:
                    f = os.path.normpath(os.path.expanduser('games_mp.log'))

                if self.config.has_option('server', 'log_append'):
                    if not (self.config.getboolean('server', 'log_append') and os.path.isfile(f)):
                        self.screen.write('Creating Gamelog : %s\n' % f)
                        ftptempfile = open(f, "w")
                        ftptempfile.close()
                    else:
                        self.screen.write('Append to Gamelog: %s\n' % f)
                else:
                    self.screen.write('Creating Gamelog : %s\n' % f)
                    ftptempfile = open(f, "w")
                    ftptempfile.close()
                    
            else:
                self.bot('Game log %s', game_log)
                f = self.config.getpath('server', 'game_log')
            self.bot('Starting bot reading file %s', f)
            self.screen.write('Using Gamelog    : %s\n' % f)

            if os.path.isfile(f):
                self.input  = file(f, 'r')
    
                # seek to point in log file?
                if self.replay:
                    pass
                elif self.config.has_option('server', 'seek'):
                    seek = self.config.getboolean('server', 'seek')
                    if seek:
                        self.input.seek(0, os.SEEK_END)
                else:
                    self.input.seek(0, os.SEEK_END)
            else:
                self.error('Error reading file %s', f)
                raise SystemExit('Error reading file %s\n' % f)

        # setup rcon
        self.output = self.OutputClass(self, (self._rconIp, self._rconPort), self._rconPassword)
        
        if self.config.has_option('server','rcon_timeout'):
            custom_socket_timeout = self.config.getfloat('server','rcon_timeout')
            self.output.socket_timeout = custom_socket_timeout
            self.bot('Setting Rcon socket timeout to %0.3f sec' % custom_socket_timeout)
        
        # testing rcon
        if self.rconTest:
            res = self.output.write('status')
            self.output.flush()
            self.screen.write('Testing RCON     : ')
            self.screen.flush()
            _badRconReplies = ['Bad rconpassword.', 'Invalid password.']
            if res in _badRconReplies:
                self.screen.write('>>> Oops: Bad RCON password\n>>> Hint: This will lead to errors and render B3 without any power to interact!\n')
                self.screen.flush()
                time.sleep(2)
            elif res == '':
                self.screen.write('>>> Oops: No response\n>>> Could be something wrong with the rcon connection to the server!\n>>> Hint 1: The server is not running or it is changing maps.\n>>> Hint 2: Check your server-ip and port.\n')
                self.screen.flush()
                time.sleep(2)
            else:
                self.screen.write('OK\n')

        self.loadEvents()
        self.screen.write('Loading Events   : %s events loaded\n' % len(self._events))
        self.clients  = b3.clients.Clients(self)
        self.loadPlugins()
        self.loadArbPlugins()

        self.game = b3.game.Game(self, self.gameName)
        self.queue = Queue.Queue(15)    # event queue

        atexit.register(self.shutdown)

        self.say('%s ^2[ONLINE]' % b3.version)
예제 #9
0
    def __init__(self, config):
        self._timeStart = self.time()

        if not self.loadConfig(config):
            print ("CRITICAL ERROR : COULD NOT LOAD CONFIG")
            raise SystemExit(220)

        # set up logging
        logfile = self.config.getpath("b3", "logfile")
        log2console = self.config.has_option("devmode", "log2console") and self.config.getboolean(
            "devmode", "log2console"
        )
        log2both = self.config.has_option("devmode", "log2both") and self.config.getboolean("devmode", "log2both")
        self.log = b3.output.getInstance(logfile, self.config.getint("b3", "log_level"), log2console, log2both)

        # save screen output to self.screen
        self.screen = sys.stdout
        print ("Activating log   : %s" % logfile)
        sys.stdout = b3.output.stdoutLogger(self.log)
        sys.stderr = b3.output.stderrLogger(self.log)

        # setup ip addresses
        self._publicIp = self.config.get("server", "public_ip")
        self._port = self.config.getint("server", "port")
        self._rconPort = self._port  # if rcon port is the same as the game port, rcon_port can be ommited
        self._rconIp = self.config.get("server", "rcon_ip")
        if self.config.has_option("server", "rcon_port"):
            self._rconPort = self.config.getint("server", "rcon_port")
        self._rconPassword = self.config.get("server", "rcon_password")

        if self._publicIp[0:1] == "~" or self._publicIp[0:1] == "/":
            # load ip from a file
            f = file(self.getAbsolutePath(self._publicIp))
            self._publicIp = f.read().strip()
            f.close()

        if self._rconIp[0:1] == "~" or self._rconIp[0:1] == "/":
            # load ip from a file
            f = file(self.getAbsolutePath(self._rconIp))
            self._rconIp = f.read().strip()
            f.close()

        try:
            # resolve domain names
            self._rconIp = socket.gethostbyname(self._rconIp)
        except:
            pass

        self.bot("%s", b3.getB3versionString())
        self.bot("Python: %s", sys.version)
        self.bot(
            "Starting %s v%s for server %s:%s",
            self.__class__.__name__,
            getattr(getModule(self.__module__), "__version__", " Unknown"),
            self._rconIp,
            self._port,
        )

        # get events
        self.Events = b3.events.eventManager

        self.bot("--------------------------------------------")

        # setup bot
        bot_name = self.config.get("b3", "bot_name")
        if bot_name:
            self.name = bot_name

        bot_prefix = self.config.get("b3", "bot_prefix")
        if bot_prefix:
            self.prefix = bot_prefix

        self.msgPrefix = self.prefix

        # delay between log reads
        if self.config.has_option("server", "delay"):
            delay = self.config.getfloat("server", "delay")
            if self.delay > 0:
                self.delay = delay

        # delay between each log's line processing
        if self.config.has_option("server", "lines_per_second"):
            delay2 = self.config.getfloat("server", "lines_per_second")
            if delay2 > 0:
                self.delay2 = 1 / delay2

        # demo mode: use log time
        if self.config.has_option("devmode", "replay"):
            self.replay = self.config.getboolean("devmode", "replay")
            if self.replay:
                self._timeStart = 0
                self.bot("Replay mode enabled")

        self.storage = b3.storage.getStorage("database", self.config.get("b3", "database"), self)

        if self.config.has_option("server", "game_log"):
            # open log file
            game_log = self.config.get("server", "game_log")
            if game_log[0:6] == "ftp://" or game_log[0:7] == "sftp://" or game_log[0:7] == "http://":
                self.remoteLog = True
                self.bot("Working in Remote-Log-Mode : %s" % game_log)

                if self.config.has_option("server", "local_game_log"):
                    f = self.config.getpath("server", "local_game_log")
                else:
                    f = os.path.normpath(os.path.expanduser("games_mp.log"))

                if self.config.has_option("server", "log_append"):
                    if not (self.config.getboolean("server", "log_append") and os.path.isfile(f)):
                        self.screen.write("Creating Gamelog : %s\n" % f)
                        ftptempfile = open(f, "w")
                        ftptempfile.close()
                    else:
                        self.screen.write("Append to Gamelog: %s\n" % f)
                else:
                    self.screen.write("Creating Gamelog : %s\n" % f)
                    ftptempfile = open(f, "w")
                    ftptempfile.close()

            else:
                self.bot("Game log %s", game_log)
                f = self.config.getpath("server", "game_log")
            self.bot("Starting bot reading file %s", f)
            self.screen.write("Using Gamelog    : %s\n" % f)

            if os.path.isfile(f):
                self.input = file(f, "r")

                # seek to point in log file?
                if self.replay:
                    pass
                elif self.config.has_option("server", "seek"):
                    seek = self.config.getboolean("server", "seek")
                    if seek:
                        self.input.seek(0, os.SEEK_END)
                else:
                    self.input.seek(0, os.SEEK_END)
            else:
                self.error("Error reading file %s", f)
                raise SystemExit("Error reading file %s\n" % f)

        # setup rcon
        self.output = self.OutputClass(self, (self._rconIp, self._rconPort), self._rconPassword)

        if self.config.has_option("server", "rcon_timeout"):
            custom_socket_timeout = self.config.getfloat("server", "rcon_timeout")
            self.output.socket_timeout = custom_socket_timeout
            self.bot("Setting Rcon socket timeout to %0.3f sec" % custom_socket_timeout)

        # testing rcon
        if self.rconTest:
            res = self.output.write("status")
            self.output.flush()
            self.screen.write("Testing RCON     : ")
            self.screen.flush()
            _badRconReplies = ["Bad rconpassword.", "Invalid password."]
            if res in _badRconReplies:
                self.screen.write(
                    ">>> Oops: Bad RCON password\n>>> Hint: This will lead to errors and render B3 without any power to interact!\n"
                )
                self.screen.flush()
                time.sleep(2)
            elif res == "":
                self.screen.write(
                    ">>> Oops: No response\n>>> Could be something wrong with the rcon connection to the server!\n>>> Hint 1: The server is not running or it is changing maps.\n>>> Hint 2: Check your server-ip and port.\n"
                )
                self.screen.flush()
                time.sleep(2)
            else:
                self.screen.write("OK\n")

        self.loadEvents()
        self.screen.write("Loading Events   : %s events loaded\n" % len(self._events))
        self.clients = b3.clients.Clients(self)
        self.loadPlugins()
        self.loadArbPlugins()

        self.game = b3.game.Game(self, self.gameName)
        self.queue = Queue.Queue(15)  # event queue

        atexit.register(self.shutdown)

        self.say("%s ^2[ONLINE]" % b3.version)
예제 #10
0
    def __init__(self, config):
        self._timeStart = self.time()

        if not self.loadConfig(config):
            print('CRITICAL ERROR : COULD NOT LOAD CONFIG')
            raise SystemExit(220)

        # set up logging
        logfile = self.config.getpath('b3', 'logfile')
        log2console = self.config.has_option('devmode', 'log2console') and self.config.getboolean('devmode', 'log2console')
        log2both = self.config.has_option('devmode', 'log2both') and self.config.getboolean('devmode', 'log2both')
        self.log = b3.output.getInstance(logfile, self.config.getint('b3', 'log_level'), log2console, log2both)

        # save screen output to self.screen
        self.screen = sys.stdout
        print('Activating log   : %s' % logfile)
        sys.stdout = b3.output.stdoutLogger(self.log)
        sys.stderr = b3.output.stderrLogger(self.log)

        # setup ip addresses
        self._publicIp = self.config.get('server', 'public_ip')
        self._port = self.config.getint('server', 'port')
        self._rconPort = self._port # if rcon port is the same as the game port, rcon_port can be ommited
        self._rconIp = self.config.get('server', 'rcon_ip')
        if self.config.has_option('server', 'rcon_port'):
            self._rconPort = self.config.getint('server', 'rcon_port')
        self._rconPassword = self.config.get('server', 'rcon_password')


        if self._publicIp[0:1] == '~' or self._publicIp[0:1] == '/':
            # load ip from a file
            f = file(self.getAbsolutePath(self._publicIp))
            self._publicIp = f.read().strip()
            f.close()

        if self._rconIp[0:1] == '~' or self._rconIp[0:1] == '/':
            # load ip from a file
            f = file(self.getAbsolutePath(self._rconIp))
            self._rconIp = f.read().strip()
            f.close()

        try:
            # resolve domain names
            self._rconIp = socket.gethostbyname(self._rconIp)
        except:
            pass

        self.bot('%s', b3.getB3versionString())
        self.bot('Python: %s', sys.version)
        self.bot('Starting %s v%s for server %s:%s', self.__class__.__name__, getattr(getModule(self.__module__), '__version__', ' Unknown'), self._rconIp, self._port)

        # get events
        self.Events = b3.events.eventManager

        self.bot('--------------------------------------------')

        # setup bot
        bot_name = self.config.get('b3', 'bot_name')
        if bot_name:
            self.name = bot_name

        bot_prefix = self.config.get('b3', 'bot_prefix')
        if bot_prefix:
            self.prefix = bot_prefix

        self.msgPrefix = self.prefix

        # delay between log reads
        if self.config.has_option('server', 'delay'):
            delay = self.config.getfloat('server', 'delay')
            if self.delay > 0:
                self.delay = delay

        # delay between each log's line processing
        if self.config.has_option('server', 'lines_per_second'):
            delay2 = self.config.getfloat('server', 'lines_per_second')
            if delay2 > 0:
                self.delay2 = 1/delay2

        # demo mode: use log time
        if self.config.has_option('devmode', 'replay'):
            self.replay = self.config.getboolean('devmode', 'replay')
            if self.replay:
                self._timeStart = 0
                self.bot('Replay mode enabled')

        self.storage = b3.storage.getStorage('database', self.config.get('b3', 'database'), self)

        if self.config.has_option('server','game_log'):
            # open log file
            game_log = self.config.get('server','game_log')
            if game_log[0:6] == 'ftp://' or game_log[0:7] == 'sftp://' or game_log[0:7] == 'http://':
                self.remoteLog = True
                self.bot('Working in Remote-Log-Mode : %s' % game_log)
                
                if self.config.has_option('server', 'local_game_log'):
                    f = self.config.getpath('server', 'local_game_log')
                else:
                    f = os.path.normpath(os.path.expanduser('games_mp.log'))

                if self.config.has_option('server', 'log_append'):
                    if not (self.config.getboolean('server', 'log_append') and os.path.isfile(f)):
                        self.screen.write('Creating Gamelog : %s\n' % f)
                        ftptempfile = open(f, "w")
                        ftptempfile.close()
                    else:
                        self.screen.write('Append to Gamelog: %s\n' % f)
                else:
                    self.screen.write('Creating Gamelog : %s\n' % f)
                    ftptempfile = open(f, "w")
                    ftptempfile.close()
                    
            else:
                self.bot('Game log %s', game_log)
                f = self.config.getpath('server', 'game_log')
            self.bot('Starting bot reading file %s', f)
            self.screen.write('Using Gamelog    : %s\n' % f)

            if os.path.isfile(f):
                self.input  = file(f, 'r')
    
                # seek to point in log file?
                if self.replay:
                    pass
                elif self.config.has_option('server', 'seek'):
                    seek = self.config.getboolean('server', 'seek')
                    if seek:
                        self.input.seek(0, os.SEEK_END)
                else:
                    self.input.seek(0, os.SEEK_END)
            else:
                self.error('Error reading file %s', f)
                raise SystemExit('Error reading file %s\n' % f)

        # setup rcon
        self.output = self.OutputClass(self, (self._rconIp, self._rconPort), self._rconPassword)
        
        if self.config.has_option('server','rcon_timeout'):
            custom_socket_timeout = self.config.getfloat('server','rcon_timeout')
            self.output.socket_timeout = custom_socket_timeout
            self.bot('Setting Rcon socket timeout to %0.3f sec' % custom_socket_timeout)
        
        # testing rcon
        if self.rconTest:
            res = self.output.write('status')
            self.output.flush()
            self.screen.write('Testing RCON     : ')
            self.screen.flush()
            _badRconReplies = ['Bad rconpassword.', 'Invalid password.']
            if res in _badRconReplies:
                self.screen.write('>>> Oops: Bad RCON password\n>>> Hint: This will lead to errors and render B3 without any power to interact!\n')
                self.screen.flush()
                time.sleep(2)
            elif res == '':
                self.screen.write('>>> Oops: No response\n>>> Could be something wrong with the rcon connection to the server!\n>>> Hint 1: The server is not running or it is changing maps.\n>>> Hint 2: Check your server-ip and port.\n')
                self.screen.flush()
                time.sleep(2)
            else:
                self.screen.write('OK\n')

        self.loadEvents()
        self.screen.write('Loading Events   : %s events loaded\n' % len(self._events))
        self.clients  = b3.clients.Clients(self)
        self.loadPlugins()
        self.loadArbPlugins()

        self.game = b3.game.Game(self, self.gameName)
        self.queue = Queue.Queue(15)    # event queue

        atexit.register(self.shutdown)

        self.say('%s ^2[ONLINE]' % b3.version)