dovecot-2.2: doveadm director map: Added -h and -u parameters to...

dovecot at dovecot.org dovecot at dovecot.org
Wed Apr 23 19:30:51 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/bc9863fa07af
changeset: 17257:bc9863fa07af
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Apr 23 22:30:28 2014 +0300
description:
doveadm director map: Added -h and -u parameters to quickly map between username and hash.

diffstat:

 src/doveadm/doveadm-director.c |  48 ++++++++++++++++++++++++++++++++++++-----
 1 files changed, 42 insertions(+), 6 deletions(-)

diffs (95 lines):

diff -r 14752b3cd609 -r bc9863fa07af src/doveadm/doveadm-director.c
--- a/src/doveadm/doveadm-director.c	Wed Apr 23 22:15:28 2014 +0300
+++ b/src/doveadm/doveadm-director.c	Wed Apr 23 22:30:28 2014 +0300
@@ -23,6 +23,7 @@
 	const char *users_path;
 	struct istream *input;
 	bool explicit_socket_path;
+	bool hash_map, user_map;
 };
 
 struct user_list {
@@ -102,6 +103,12 @@
 		case 'f':
 			ctx->users_path = optarg;
 			break;
+		case 'h':
+			ctx->hash_map = TRUE;
+			break;
+		case 'u':
+			ctx->user_map = TRUE;
+			break;
 		default:
 			director_cmd_help(cmd);
 		}
@@ -280,13 +287,28 @@
 	struct user_list *user;
 	unsigned int ips_count, user_hash, expires;
 
-	ctx = cmd_director_init(argc, argv, "a:f:", cmd_director_map);
-	if (argv[optind] == NULL)
+	ctx = cmd_director_init(argc, argv, "a:f:hu", cmd_director_map);
+	argc -= optind;
+	argv += optind;
+	if (argc > 1 ||
+	    (ctx->hash_map && ctx->user_map) ||
+	    ((ctx->hash_map || ctx->user_map) && argc == 0))
+		director_cmd_help(cmd_director_map);
+
+	if (ctx->user_map) {
+		/* user -> hash mapping */
+		user_hash = mail_user_hash(argv[0], doveadm_settings->director_username_hash);
+		doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE);
+		doveadm_print_header("hash", "hash", DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
+		doveadm_print(t_strdup_printf("%u", user_hash));
+		director_disconnect(ctx);
+		return;
+	}
+
+	if (argv[0] == NULL || ctx->hash_map)
 		ips_count = 0;
-	else if (argv[optind+1] != NULL)
-		director_cmd_help(cmd_director_map);
 	else
-		director_get_host(argv[optind], &ips, &ips_count);
+		director_get_host(argv[0], &ips, &ips_count);
 
 	pool = pool_alloconly_create("director map users", 1024*128);
 	hash_table_create_direct(&users, pool, 0);
@@ -295,6 +317,19 @@
 	else
 		user_file_get_user_list(ctx->users_path, pool, users);
 
+	if (ctx->hash_map) {
+		/* hash -> usernames mapping */
+		if (str_to_uint(argv[0], &user_hash) < 0)
+			i_fatal("Invalid username hash: %s", argv[0]);
+
+		doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE);
+		doveadm_print_header("user", "user", DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
+		user = hash_table_lookup(users, POINTER_CAST(user_hash));
+		for (; user != NULL; user = user->next)
+			doveadm_print(user->name);
+		goto deinit;
+	}
+
 	doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE);
 	doveadm_print_header("user", "user", DOVEADM_PRINT_HEADER_FLAG_EXPAND);
 	doveadm_print_header_simple("hash");
@@ -341,6 +376,7 @@
 		i_error("Director disconnected unexpectedly");
 		doveadm_exit_code = EX_TEMPFAIL;
 	}
+deinit:
 	director_disconnect(ctx);
 	hash_table_destroy(&users);
 	pool_unref(&pool);
@@ -683,7 +719,7 @@
 	{ cmd_director_status, "director status",
 	  "[-a <director socket path>] [<user>]" },
 	{ cmd_director_map, "director map",
-	  "[-a <director socket path>] [-f <users file>] [<host>]" },
+	  "[-a <director socket path>] [-f <users file>] [-h | -u] [<host>]" },
 	{ cmd_director_add, "director add",
 	  "[-a <director socket path>] <host> [<vhost count>]" },
 	{ cmd_director_remove, "director remove",


More information about the dovecot-cvs mailing list