dovecot-2.0: doveadm director map: Added -f parameter to alterna...

dovecot at dovecot.org dovecot at dovecot.org
Fri Jul 16 02:11:53 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/2d6bac30ea75
changeset: 11832:2d6bac30ea75
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Jul 16 00:11:50 2010 +0100
description:
doveadm director map: Added -f parameter to alternatively get a list of usernames.

diffstat:

 src/doveadm/doveadm-director.c |  79 ++++++++++++++++++++++++++++-----------
 1 files changed, 56 insertions(+), 23 deletions(-)

diffs (184 lines):

diff -r e58a270a6287 -r 2d6bac30ea75 src/doveadm/doveadm-director.c
--- a/src/doveadm/doveadm-director.c	Thu Jul 15 22:49:40 2010 +0000
+++ b/src/doveadm/doveadm-director.c	Fri Jul 16 00:11:50 2010 +0100
@@ -14,9 +14,11 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <fcntl.h>
 
 struct director_context {
 	const char *socket_path;
+	const char *users_path;
 	struct istream *input;
 };
 
@@ -65,7 +67,8 @@
 }
 
 static struct director_context *
-cmd_director_init(int argc, char *argv[], doveadm_command_t *cmd)
+cmd_director_init(int argc, char *argv[], const char *getopt_args,
+		  doveadm_command_t *cmd)
 {
 	struct director_context *ctx;
 	int c;
@@ -74,11 +77,14 @@
 	ctx->socket_path = t_strconcat(doveadm_settings->base_dir,
 				       "/director-admin", NULL);
 
-	while ((c = getopt(argc, argv, "a:")) > 0) {
+	while ((c = getopt(argc, argv, getopt_args)) > 0) {
 		switch (c) {
 		case 'a':
 			ctx->socket_path = optarg;
 			break;
+		case 'f':
+			ctx->users_path = optarg;
+			break;
 		default:
 			director_cmd_help(cmd);
 		}
@@ -123,7 +129,7 @@
 	struct director_context *ctx;
 	const char *line, *const *args;
 
-	ctx = cmd_director_init(argc, argv, cmd_director_status);
+	ctx = cmd_director_init(argc, argv, "a:", cmd_director_status);
 	if (argv[optind] != NULL) {
 		cmd_director_status_user(ctx, argv[optind]);
 		return;
@@ -164,14 +170,28 @@
 }
 
 static void
-get_user_list(const char *auth_socket_path, pool_t pool,
-	      struct hash_table *users)
+user_list_add(const char *username, pool_t pool, struct hash_table *users)
+{
+	struct user_list *user, *old_user;
+	unsigned int user_hash;
+
+	user = p_new(pool, struct user_list, 1);
+	user->name = p_strdup(pool, username);
+	user_hash = director_username_hash(username);
+
+	old_user = hash_table_lookup(users, POINTER_CAST(user_hash));
+	if (old_user != NULL)
+		user->next = old_user;
+	hash_table_insert(users, POINTER_CAST(user_hash), user);
+}
+
+static void
+userdb_get_user_list(const char *auth_socket_path, pool_t pool,
+		     struct hash_table *users)
 {
 	struct auth_master_user_list_ctx *ctx;
 	struct auth_master_connection *conn;
 	const char *username;
-	struct user_list *user, *old_user;
-	unsigned int user_hash;
 
 	if (auth_socket_path == NULL) {
 		auth_socket_path = t_strconcat(doveadm_settings->base_dir,
@@ -180,16 +200,8 @@
 
 	conn = auth_master_init(auth_socket_path, 0);
 	ctx = auth_master_user_list_init(conn);
-	while ((username = auth_master_user_list_next(ctx)) != NULL) {
-		user = p_new(pool, struct user_list, 1);
-		user->name = p_strdup(pool, username);
-		user_hash = director_username_hash(username);
-
-		old_user = hash_table_lookup(users, POINTER_CAST(user_hash));
-		if (old_user != NULL)
-			user->next = old_user;
-		hash_table_insert(users, POINTER_CAST(user_hash), user);
-	}
+	while ((username = auth_master_user_list_next(ctx)) != NULL)
+		user_list_add(username, pool, users);
 	if (auth_master_user_list_deinit(&ctx) < 0) {
 		i_error("user listing failed");
 		exit(1);
@@ -197,6 +209,24 @@
 	auth_master_deinit(&conn);
 }
 
+static void
+user_file_get_user_list(const char *path, pool_t pool, struct hash_table *users)
+{
+	struct auth_master_connection *conn;
+	struct istream *input;
+	const char *username;
+	int fd;
+
+	fd = open(path, O_RDONLY);
+	if (fd == -1)
+		i_fatal("open(%s) failed: %m", path);
+	input = i_stream_create_fd(fd, (size_t)-1, TRUE);
+	while ((username = i_stream_read_next_line(input)) != NULL)
+		user_list_add(username, pool, users);
+	auth_master_deinit(&conn);
+	i_stream_unref(&input);
+}
+
 static void director_get_host(const char *host, struct ip_addr **ips_r,
 			      unsigned int *ips_count_r)
 {
@@ -233,7 +263,7 @@
 	struct user_list *user;
 	unsigned int ips_count, user_hash, expires;
 
-	ctx = cmd_director_init(argc, argv, cmd_director_map);
+	ctx = cmd_director_init(argc, argv, "a:f:", cmd_director_map);
 	if (argv[optind] == NULL)
 		ips_count = 0;
 	else if (argv[optind+1] != NULL)
@@ -243,7 +273,10 @@
 
 	pool = pool_alloconly_create("director map users", 1024*128);
 	users = hash_table_create(default_pool, pool, 0, NULL, NULL);
-	get_user_list(NULL, pool, users);
+	if (ctx->users_path == NULL)
+		userdb_get_user_list(NULL, pool, users);
+	else
+		user_file_get_user_list(ctx->users_path, pool, users);
 
 	doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE);
 	doveadm_print_header_simple("user");
@@ -292,7 +325,7 @@
 	unsigned int i, ips_count, vhost_count = -1U;
 	const char *host, *cmd, *line;
 
-	ctx = cmd_director_init(argc, argv, cmd_director_add);
+	ctx = cmd_director_init(argc, argv, "a:", cmd_director_add);
 	host = argv[optind++];
 	if (host == NULL)
 		director_cmd_help(cmd_director_add);
@@ -333,7 +366,7 @@
 	unsigned int i, ips_count;
 	const char *host, *line;
 
-	ctx = cmd_director_init(argc, argv, cmd_director_remove);
+	ctx = cmd_director_init(argc, argv, "a:", cmd_director_remove);
 	host = argv[optind++];
 	if (host == NULL || argv[optind] != NULL)
 		director_cmd_help(cmd_director_remove);
@@ -383,7 +416,7 @@
 	struct ip_addr ip;
 	const char *host, *line;
 
-	ctx = cmd_director_init(argc, argv, cmd_director_flush);
+	ctx = cmd_director_init(argc, argv, "a:", cmd_director_flush);
 	host = argv[optind++];
 	if (host == NULL || argv[optind] != NULL)
 		director_cmd_help(cmd_director_flush);
@@ -424,7 +457,7 @@
 	{ cmd_director_status, "director status",
 	  "[-a <director socket path>] [<user>]", NULL },
 	{ cmd_director_map, "director map",
-	  "[-a <director socket path>] [<host>]", NULL },
+	  "[-a <director socket path>] [-f <users file>] [<host>]", NULL },
 	{ cmd_director_add, "director add",
 	  "[-a <director socket path>] <host> [<vhost count>]", NULL },
 	{ cmd_director_remove, "director remove",


More information about the dovecot-cvs mailing list