Example #1
0
 def auth(self, password):
     if config.get('requirepass') == config.EMPTY:
         raise DredisError("client sent AUTH, but no password is set")
     if password != config.get('requirepass'):
         self.authenticated = False
         raise DredisError("invalid password")
     else:
         self.authenticated = True
Example #2
0
def run_command(keyspace, cmd, args):
    logger.debug('[run_command] cmd={}, args={}'.format(repr(cmd), repr(args)))

    str_args = map(str, args)
    if cmd.upper() not in REDIS_COMMANDS:
        raise CommandNotFound("unknown command '{}'".format(cmd))
    else:
        cmd_fn = REDIS_COMMANDS[cmd.upper()]
        if config.get(
                'requirepass'
        ) != config.EMPTY and not keyspace.authenticated and cmd_fn != cmd_auth:
            raise AuthenticationRequiredError()
        if config.get('readonly') == config.TRUE and cmd_fn.flags & CMD_WRITE:
            raise DredisError("Can't execute %r in readonly mode" % cmd)
        else:
            return cmd_fn(keyspace, *str_args)
Example #3
0
def main():
    parser = argparse.ArgumentParser(version=__version__)
    parser.add_argument('--host',
                        default='127.0.0.1',
                        help='server host (defaults to %(default)s)')
    parser.add_argument('--port',
                        default='6377',
                        type=int,
                        help='server port (defaults to %(default)s)')
    parser.add_argument(
        '--dir',
        default=None,
        help='directory to save data (defaults to a temporary directory)')
    parser.add_argument(
        '--backend',
        default=db.DEFAULT_DB_BACKEND,
        choices=db.DB_BACKENDS.keys(),
        help='key/value database backend (defaults to %(default)s)')
    parser.add_argument(
        '--backend-option',
        action='append',
        help='database backend options (e.g., --backend-option map_size=BYTES)'
    )
    parser.add_argument('--rdb', default=None, help='RDB file to seed dredis')
    # boolean arguments
    parser.add_argument('--debug',
                        action='store_true',
                        help='enable debug logs')
    parser.add_argument('--flushall',
                        action='store_true',
                        default=False,
                        help='run FLUSHALL on startup')
    parser.add_argument('--readonly',
                        action='store_true',
                        help='accept read-only commands')
    parser.add_argument(
        '--requirepass',
        default='',
        help=
        'require clients to issue AUTH <password> before processing any other commands'
    )
    parser.add_argument(
        '--gc-interval',
        default=gc.DEFAULT_GC_INTERVAL,
        type=float,
        help='key gc interval in milliseconds (defaults to %(default)s)')
    parser.add_argument('--gc-batch-size',
                        default=gc.DEFAULT_GC_BATCH_SIZE,
                        type=float,
                        help='key gc batch size (defaults to %(default)s)')
    args = parser.parse_args()

    global ROOT_DIR
    if args.dir:
        ROOT_DIR = Path(args.dir)
        ROOT_DIR.makedirs(ignore_if_exists=True)

    else:
        ROOT_DIR = tempfile.mkdtemp(prefix="redis-test-")

    setup_logging(logging.INFO)

    config.set('debug', config.TRUE if args.debug else config.FALSE)
    config.set('readonly', config.TRUE if args.readonly else config.FALSE)
    config.set('requirepass',
               args.requirepass if args.requirepass else config.EMPTY)

    db_backend_options = {}
    if args.backend_option:
        for option in args.backend_option:
            if '=' not in option:
                logger.error(
                    'Expected `key=value` pairs for --backend-option parameter'
                )
                sys.exit(1)
            key, value = map(str.strip, option.split('='))
            db_backend_options[key] = json.loads(value)
    db.DB_MANAGER.setup_dbs(ROOT_DIR, args.backend, db_backend_options)

    keyspace = Keyspace()
    if args.flushall:
        keyspace.flushall()

    if args.rdb:
        logger.info("Loading %s..." % args.rdb)
        start_time = time.time()
        with open(args.rdb, 'rb') as f:
            rdb.load_rdb(keyspace, f)
        logger.info("Finished loading (%.2f seconds)." %
                    (time.time() - start_time))

    RedisServer(args.host, args.port)
    gc_thread = gc.KeyGarbageCollector(args.gc_interval, args.gc_batch_size)
    gc_thread.daemon = True
    gc_thread.start()

    logger.info("Backend: {}".format(args.backend))
    logger.info("Port: {}".format(args.port))
    logger.info("Root directory: {}".format(ROOT_DIR))
    logger.info('PID: {}'.format(os.getpid()))
    logger.info('Readonly: {}'.format(config.get('readonly')))
    logger.info('Ready to accept connections')

    try:
        asyncore.loop(use_poll=True)
    except KeyboardInterrupt:
        logger.info("Shutting down...")