dovecot-2.2: doveadm: Added dict commands to access lib-dict via...
dovecot at dovecot.org
dovecot at dovecot.org
Mon Jul 28 13:42:22 UTC 2014
details: http://hg.dovecot.org/dovecot-2.2/rev/098725138469
changeset: 17634:098725138469
user: Timo Sirainen <tss at iki.fi>
date: Mon Jul 28 16:40:25 2014 +0300
description:
doveadm: Added dict commands to access lib-dict via command line.
For debugging and data dumping purposes.
diffstat:
src/doveadm/Makefile.am | 1 +
src/doveadm/doveadm-dict.c | 186 +++++++++++++++++++++++++++++++++++++++++++++
src/doveadm/doveadm.c | 1 +
src/doveadm/doveadm.h | 1 +
4 files changed, 189 insertions(+), 0 deletions(-)
diffs (223 lines):
diff -r 4b8a098a70b7 -r 098725138469 src/doveadm/Makefile.am
--- a/src/doveadm/Makefile.am Mon Jul 28 15:14:17 2014 +0300
+++ b/src/doveadm/Makefile.am Mon Jul 28 16:40:25 2014 +0300
@@ -84,6 +84,7 @@
$(common) \
doveadm.c \
doveadm-auth.c \
+ doveadm-dict.c \
doveadm-director.c \
doveadm-dump.c \
doveadm-dump-dbox.c \
diff -r 4b8a098a70b7 -r 098725138469 src/doveadm/doveadm-dict.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/doveadm/doveadm-dict.c Mon Jul 28 16:40:25 2014 +0300
@@ -0,0 +1,186 @@
+/* Copyright (c) 2014 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "dict.h"
+#include "doveadm.h"
+#include "doveadm-print.h"
+
+#include <stdio.h>
+#include <unistd.h>
+
+static void dict_cmd_help(doveadm_command_t *cmd);
+
+static struct dict *
+cmd_dict_init(int *argc, char **argv[], int own_arg_count, int key_arg_idx,
+ doveadm_command_t *cmd)
+{
+ struct dict *dict;
+ const char *error, *username = "";
+ int c;
+
+ while ((c = getopt(*argc, *argv, "u:")) > 0) {
+ switch (c) {
+ case 'u':
+ username = optarg;
+ break;
+ default:
+ dict_cmd_help(cmd);
+ }
+ }
+ *argc -= optind;
+ *argv += optind;
+
+ if (*argc != 1 + own_arg_count)
+ dict_cmd_help(cmd);
+
+ dict_drivers_register_builtin();
+ if (dict_init((*argv)[0], DICT_DATA_TYPE_STRING, username,
+ doveadm_settings->base_dir, &dict, &error) < 0)
+ i_fatal("dict_init(%s) failed: %s", (*argv)[0], error);
+
+ *argc += 1;
+ *argv += 1;
+
+ if (key_arg_idx >= 0) {
+ const char *key = (*argv)[key_arg_idx];
+
+ if (strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE)) != 0 &&
+ strncmp(key, DICT_PATH_SHARED, strlen(DICT_PATH_SHARED)) != 0) {
+ i_fatal("Key must begin with '"DICT_PATH_PRIVATE
+ "' or '"DICT_PATH_SHARED"': %s", key);
+ }
+ if (username[0] == '\0' &&
+ strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE)) == 0)
+ i_fatal("-u must be specified for "DICT_PATH_PRIVATE" keys");
+ }
+ return dict;
+}
+
+static void cmd_dict_get(int argc, char *argv[])
+{
+ struct dict *dict;
+ const char *value;
+ int ret;
+
+ dict = cmd_dict_init(&argc, &argv, 1, 0, cmd_dict_get);
+
+ doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE);
+ doveadm_print_header("value", "", DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
+
+ ret = dict_lookup(dict, pool_datastack_create(), argv[0], &value);
+ if (ret < 0) {
+ i_error("dict_lookup(%s) failed", argv[0]);
+ doveadm_exit_code = EX_TEMPFAIL;
+ } else if (ret == 0) {
+ i_error("%s doesn't exist", argv[0]);
+ doveadm_exit_code = DOVEADM_EX_NOTFOUND;
+ } else {
+ doveadm_print(value);
+ }
+ dict_deinit(&dict);
+}
+
+static void cmd_dict_set(int argc, char *argv[])
+{
+ struct dict *dict;
+ struct dict_transaction_context *trans;
+
+ dict = cmd_dict_init(&argc, &argv, 2, 0, cmd_dict_set);
+ trans = dict_transaction_begin(dict);
+ dict_set(trans, argv[0], argv[1]);
+ if (dict_transaction_commit(&trans) <= 0) {
+ i_error("dict_transaction_commit() failed");
+ doveadm_exit_code = EX_TEMPFAIL;
+ }
+ dict_deinit(&dict);
+}
+
+static void cmd_dict_unset(int argc, char *argv[])
+{
+ struct dict *dict;
+ struct dict_transaction_context *trans;
+
+ dict = cmd_dict_init(&argc, &argv, 1, 0, cmd_dict_unset);
+ trans = dict_transaction_begin(dict);
+ dict_unset(trans, argv[0]);
+ if (dict_transaction_commit(&trans) <= 0) {
+ i_error("dict_transaction_commit() failed");
+ doveadm_exit_code = EX_TEMPFAIL;
+ }
+ dict_deinit(&dict);
+}
+
+static void cmd_dict_inc(int argc, char *argv[])
+{
+ struct dict *dict;
+ struct dict_transaction_context *trans;
+ long long diff;
+ int ret;
+
+ dict = cmd_dict_init(&argc, &argv, 2, 0, cmd_dict_inc);
+ if (str_to_llong(argv[1], &diff) < 0)
+ i_fatal("Invalid diff: %s", argv[1]);
+
+ trans = dict_transaction_begin(dict);
+ dict_atomic_inc(trans, argv[0], diff);
+ ret = dict_transaction_commit(&trans);
+ if (ret < 0) {
+ i_error("dict_transaction_commit() failed");
+ doveadm_exit_code = EX_TEMPFAIL;
+ } else if (ret == 0) {
+ i_error("%s doesn't exist", argv[0]);
+ doveadm_exit_code = DOVEADM_EX_NOTFOUND;
+ }
+ dict_deinit(&dict);
+}
+
+static void cmd_dict_iter(int argc, char *argv[])
+{
+ struct dict *dict;
+ struct dict_iterate_context *iter;
+ const char *key, *value;
+
+ dict = cmd_dict_init(&argc, &argv, 1, 0, cmd_dict_iter);
+
+ doveadm_print_init(DOVEADM_PRINT_TYPE_TAB);
+ doveadm_print_header_simple("key");
+ doveadm_print_header_simple("value");
+
+ iter = dict_iterate_init(dict, argv[0], DICT_ITERATE_FLAG_RECURSE);
+ while (dict_iterate(iter, &key, &value)) {
+ doveadm_print(key);
+ doveadm_print(value);
+ }
+ if (dict_iterate_deinit(&iter) < 0) {
+ i_error("dict_iterate_deinit(%s) failed", argv[0]);
+ doveadm_exit_code = EX_TEMPFAIL;
+ }
+ dict_deinit(&dict);
+}
+
+struct doveadm_cmd doveadm_cmd_dict[] = {
+ { cmd_dict_get, "dict get", "[-u <user>] <dict uri> <key>" },
+ { cmd_dict_set, "dict set", "[-u <user>] <dict uri> <key> <value>" },
+ { cmd_dict_unset, "dict unset", "[-u <user>] <dict uri> <key>" },
+ { cmd_dict_inc, "dict inc", "[-u <user>] <dict uri> <key> <diff>" },
+ { cmd_dict_iter, "dict iter", "[-u <user>] <dict uri> <prefix>" }
+};
+
+static void dict_cmd_help(doveadm_command_t *cmd)
+{
+ unsigned int i;
+
+ for (i = 0; i < N_ELEMENTS(doveadm_cmd_dict); i++) {
+ if (doveadm_cmd_dict[i].cmd == cmd)
+ help(&doveadm_cmd_dict[i]);
+ }
+ i_unreached();
+}
+
+void doveadm_register_dict_commands(void)
+{
+ unsigned int i;
+
+ for (i = 0; i < N_ELEMENTS(doveadm_cmd_dict); i++)
+ doveadm_register_cmd(&doveadm_cmd_dict[i]);
+}
diff -r 4b8a098a70b7 -r 098725138469 src/doveadm/doveadm.c
--- a/src/doveadm/doveadm.c Mon Jul 28 15:14:17 2014 +0300
+++ b/src/doveadm/doveadm.c Mon Jul 28 16:40:25 2014 +0300
@@ -368,6 +368,7 @@
doveadm_register_proxy_commands();
doveadm_register_log_commands();
doveadm_register_replicator_commands();
+ doveadm_register_dict_commands();
doveadm_register_fs_commands();
doveadm_dump_init();
doveadm_mail_init();
diff -r 4b8a098a70b7 -r 098725138469 src/doveadm/doveadm.h
--- a/src/doveadm/doveadm.h Mon Jul 28 15:14:17 2014 +0300
+++ b/src/doveadm/doveadm.h Mon Jul 28 16:40:25 2014 +0300
@@ -47,6 +47,7 @@
void doveadm_register_instance_commands(void);
void doveadm_register_mount_commands(void);
void doveadm_register_replicator_commands(void);
+void doveadm_register_dict_commands(void);
void doveadm_register_fs_commands(void);
#endif
More information about the dovecot-cvs
mailing list