コード例 #1
0
    def test_pid(self):
        from platform import system
        from config import BOT_DATA_DIR

        if system() != 'Windows':
            pid_path = BOT_DATA_DIR + os.path.sep + 'err_test.pid'

            from errbot.pid import PidFile

            pidfile1 = PidFile(pid_path)
            pidfile2 = PidFile(pid_path)

            with pidfile1:
                logging.debug('ok locked the pid')
                with pidfile2:
                    logging.fatal('Should never execute')
コード例 #2
0
ファイル: err.py プロジェクト: jperras/err
def main():

    execution_dir = getcwd()

    # By default insert the execution path (useful to be able to execute err from
    # the source tree directly without installing it.
    sys.path.insert(0, execution_dir)

    parser = argparse.ArgumentParser(description='The main entry point of the XMPP bot err.')
    parser.add_argument('-c', '--config', default=None,
                        help='Full path to your config.py (default: config.py in current working directory).')
    parser.add_argument('-r', '--restore', nargs='?', default=None, const='default',
                        help='Restores a bot from backup.py. (default: backup.py from the bot data directory).')
    parser.add_argument('-l', '--list', action='store_true', help='Lists all the backends found.')

    backend_group = parser.add_mutually_exclusive_group()
    backend_group.add_argument('-X', '--xmpp', action='store_true', help='XMPP backend [DEFAULT]')
    backend_group.add_argument('-H', '--hipchat', action='store_true', help='Hipchat backend')
    backend_group.add_argument('-I', '--irc', action='store_true', help='IRC backend')
    backend_group.add_argument('-S', '--slack', action='store_true', help='Slack backend')
    backend_group.add_argument('-T', '--text', action='store_true', help='locale text debug backend')
    backend_group.add_argument('-G', '--graphic', action='store_true', help='local graphical debug mode backend')
    backend_group.add_argument('-N', '--null', action='store_true', help='no backend')

    if not ON_WINDOWS:
        option_group = parser.add_argument_group('arguments to run it as a Daemon')
        option_group.add_argument('-d', '--daemon', action='store_true', help='Detach the process from the console')
        option_group.add_argument('-p', '--pidfile', default=None,
                                  help='Specify the pid file for the daemon (default: current bot data directory)')

    args = vars(parser.parse_args())  # create a dictionary of args
    config_path = args['config']
    # setup the environment to be able to import the config.py
    if config_path:
        # appends the current config in order to find config.py
        sys.path.insert(0, path.dirname(path.abspath(config_path)))
    else:
        config_path = execution_dir + sep + 'config.py'

    config = get_config(config_path)  # will exit if load fails
    if args['list']:
        from errbot.main import enumerate_backends
        print('Available backends:')
        for backend_name in enumerate_backends(config):
            print('\t\t%s' % backend_name)
        sys.exit(0)

    # this is temporary until the modes are removed to translate the mode names to backend names
    classic_vs_plugin_names = {'text': 'Text',
                               'graphic': 'Graphic',
                               'hipchat': 'Hipchat',
                               'irc': 'IRC',
                               'xmpp': 'XMPP',
                               'slack': 'Slack',
                               'null': 'Null'}

    filtered_mode = [mname for mname in classic_vs_plugin_names.keys() if args[mname]]
    if args['restore']:
        backend = 'Null'  # we don't want any backend when we restore
    elif filtered_mode:
        backend = classic_vs_plugin_names[filtered_mode[0]]
        if backend != 'Text':
            log.warn("""Deprecation notice:
            Please add BACKEND='%s' to your config.py instead of using the '--%s' command line parameter.
            The backend command line parameters will be removed on the next version of Err.
            """ % (backend, filtered_mode[0]))
    elif hasattr(config, 'BACKEND'):
        backend = config.BACKEND
    else:
        log.warn("""Deprecation notice:
        Err is defaulting to XMPP because you did not specify any backend.
        Please add BACKEND='XMPP' to your config.py if you really want that.
        This behaviour will be removed on the next version of Err.
        """)
        backend = 'XMPP'  # default value

    log.info("Selected backend '%s'." % backend)

    # Check if at least we can start to log something before trying to start
    # the bot (esp. daemonize it).

    log.info("Checking for '%s'..." % config.BOT_DATA_DIR)
    if not path.exists(config.BOT_DATA_DIR):
        raise Exception("The data directory '%s' for the bot does not exist" % config.BOT_DATA_DIR)
    if not access(config.BOT_DATA_DIR, W_OK):
        raise Exception("The data directory '%s' should be writable for the bot" % config.BOT_DATA_DIR)

    if (not ON_WINDOWS) and args['daemon']:
        if args['text']:
            raise Exception('You cannot run in text and daemon mode at the same time')
        if args['restore']:
            raise Exception('You cannot restore a backup in daemon mode.')
        if args['pidfile']:
            pid = args['pidfile']
        else:
            pid = config.BOT_DATA_DIR + sep + 'err.pid'

        from errbot.pid import PidFile

        pidfile = PidFile(pid)

        # noinspection PyBroadException
        try:
            def action():
                from errbot.main import main
                main(backend, logger, config)

            daemon = Daemonize(app="err", pid=pid, action=action)
            daemon.start()
        except Exception:
            log.exception('Failed to daemonize the process')
        exit(0)
    from errbot.main import main
    restore = args['restore']
    if restore == 'default':  # restore with no argument, get the default location
        restore = path.join(config.BOT_DATA_DIR, 'backup.py')

    main(backend, logger, config, restore)
    log.info('Process exiting')
コード例 #3
0
            "The data directory '%s' should be writable for the bot" %
            BOT_DATA_DIR)

    if (not ON_WINDOWS) and args['daemon']:
        if args['text']:
            raise Exception(
                'You cannot run in text and daemon mode at the same time')

        if args['pidfile']:
            pid = args['pidfile']
        else:
            pid = BOT_DATA_DIR + sep + 'err.pid'

        from errbot.pid import PidFile

        pidfile = PidFile(pid)

        #noinspection PyBroadException
        try:

            def action():
                from errbot.main import main
                main(bot_class, logger)

            daemon = Daemonize(app="err", pid=pid, action=action)
            daemon.start()
        except Exception as _:
            logging.exception('Failed to daemonize the process')
        exit(0)
    from errbot.main import main
    main(bot_class, logger)