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
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)
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...")