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