]> git.saurik.com Git - redis.git/commitdiff
added support for command renaming/suppression in redis.conf
authorantirez <antirez@gmail.com>
Wed, 3 Nov 2010 11:14:36 +0000 (12:14 +0100)
committerantirez <antirez@gmail.com>
Wed, 3 Nov 2010 11:14:36 +0000 (12:14 +0100)
redis.conf
src/config.c
src/redis.c

index 8ad5cc2e642ddc5965cdc176e6c12baed5a60b1e..36f650ed0e3322ac0e408443758f21842659d530 100644 (file)
@@ -125,6 +125,22 @@ dir ./
 #
 # requirepass foobared
 
+# Command renaming.
+#
+# It is possilbe to change the name of dangerous commands in a shared
+# environment. For instance the CONFIG command may be renamed into something
+# of hard to guess so that it will be still available for internal-use
+# tools but not available for general clients.
+#
+# Example:
+#
+# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
+#
+# It is also possilbe to completely kill a command renaming it into
+# an empty string:
+#
+# rename-command CONFIG ""
+
 ################################### LIMITS ####################################
 
 # Set the max number of connected clients at the same time. By default there
index d59381071dbdd93caebb656af63cf8a38c8ba132..2b5063c8fa7919ba2c629588d9ce05f785c540d7 100644 (file)
@@ -214,16 +214,40 @@ void loadServerConfig(char *filename) {
             server.vm_pages = memtoll(argv[1], NULL);
         } else if (!strcasecmp(argv[0],"vm-max-threads") && argc == 2) {
             server.vm_max_threads = strtoll(argv[1], NULL, 10);
-        } else if (!strcasecmp(argv[0],"hash-max-zipmap-entries") && argc == 2){
+        } else if (!strcasecmp(argv[0],"hash-max-zipmap-entries") && argc == 2) {
             server.hash_max_zipmap_entries = memtoll(argv[1], NULL);
-        } else if (!strcasecmp(argv[0],"hash-max-zipmap-value") && argc == 2){
+        } else if (!strcasecmp(argv[0],"hash-max-zipmap-value") && argc == 2) {
             server.hash_max_zipmap_value = memtoll(argv[1], NULL);
         } else if (!strcasecmp(argv[0],"list-max-ziplist-entries") && argc == 2){
             server.list_max_ziplist_entries = memtoll(argv[1], NULL);
-        } else if (!strcasecmp(argv[0],"list-max-ziplist-value") && argc == 2){
+        } else if (!strcasecmp(argv[0],"list-max-ziplist-value") && argc == 2) {
             server.list_max_ziplist_value = memtoll(argv[1], NULL);
-        } else if (!strcasecmp(argv[0],"set-max-intset-entries") && argc == 2){
+        } else if (!strcasecmp(argv[0],"set-max-intset-entries") && argc == 2) {
             server.set_max_intset_entries = memtoll(argv[1], NULL);
+        } else if (!strcasecmp(argv[0],"rename-command") && argc == 3) {
+            struct redisCommand *cmd = lookupCommand(argv[1]);
+            int retval;
+
+            if (!cmd) {
+                err = "No such command in rename-command";
+                goto loaderr;
+            }
+
+            /* If the target command name is the emtpy string we just
+             * remove it from the command table. */
+            retval = dictDelete(server.commands, argv[1]);
+            redisAssert(retval == DICT_OK);
+
+            /* Otherwise we re-add the command under a different name. */
+            if (sdslen(argv[2]) != 0) {
+                sds copy = sdsdup(argv[2]);
+
+                retval = dictAdd(server.commands, copy, cmd);
+                if (retval != DICT_OK) {
+                    sdsfree(copy);
+                    err = "Target command name already exists"; goto loaderr;
+                }
+            }
         } else {
             err = "Bad directive or wrong number of arguments"; goto loaderr;
         }
index d099551e9c67b939d80bf8079f0621784ea1a585..30fe807d3c87380c320526d8b31732222fd2ebd7 100644 (file)
@@ -799,6 +799,14 @@ void initServerConfig() {
     R_PosInf = 1.0/R_Zero;
     R_NegInf = -1.0/R_Zero;
     R_Nan = R_Zero/R_Zero;
+
+    /* Command table -- we intiialize it here as it is part of the
+     * initial configuration, since command names may be changed via
+     * redis.conf using the rename-command directive. */
+    server.commands = dictCreate(&commandTableDictType,NULL);
+    populateCommandTable();
+    server.delCommand = lookupCommandByCString("del");
+    server.multiCommand = lookupCommandByCString("multi");
 }
 
 void initServer() {
@@ -814,12 +822,6 @@ void initServer() {
         redisLog(REDIS_WARNING, "Can't open /dev/null: %s", server.neterr);
         exit(1);
     }
-
-    server.commands = dictCreate(&commandTableDictType,NULL);
-    populateCommandTable();
-    server.delCommand = lookupCommandByCString("del");
-    server.multiCommand = lookupCommandByCString("multi");
-
     server.clients = listCreate();
     server.slaves = listCreate();
     server.monitors = listCreate();