dovecot-2.2: doveadm replicator add <user mask> command added.

dovecot at dovecot.org dovecot at dovecot.org
Mon Apr 28 15:34:52 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/b912147d41c8
changeset: 17280:b912147d41c8
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Apr 28 18:34:27 2014 +0300
description:
doveadm replicator add <user mask> command added.
This allows quickly adding users from userdb that don't exist in replicator.
For example "doveadm replicator add '*'" adds all the new users from userdb.

This isn't really necessary though. Users will be automatically added as
soon as their mailboxes change in some way and replicator gets notified
about them.

diffstat:

 src/doveadm/doveadm-replicator.c                   |  30 ++++++++++++++++++
 src/replication/replicator/Makefile.am             |   1 +
 src/replication/replicator/doveadm-connection.c    |  28 +++++++++++++++++
 src/replication/replicator/replicator-queue-auth.c |  36 ++++++++++++++++++++++
 src/replication/replicator/replicator-queue.h      |   4 ++
 src/replication/replicator/replicator.c            |  25 +--------------
 6 files changed, 101 insertions(+), 23 deletions(-)

diffs (205 lines):

diff -r fac4e7320676 -r b912147d41c8 src/doveadm/doveadm-replicator.c
--- a/src/doveadm/doveadm-replicator.c	Mon Apr 28 18:24:04 2014 +0300
+++ b/src/doveadm/doveadm-replicator.c	Mon Apr 28 18:34:27 2014 +0300
@@ -258,6 +258,34 @@
 	replicator_disconnect(ctx);
 }
 
+static void cmd_replicator_add(int argc, char *argv[])
+{
+	struct replicator_context *ctx;
+	string_t *str;
+	const char *line;
+
+	if (argv[1] == NULL)
+		replicator_cmd_help(cmd_replicator_add);
+
+	ctx = cmd_replicator_init(&argc, &argv, "a:", cmd_replicator_add);
+
+	str = t_str_new(128);
+	str_append(str, "ADD\t");
+	str_append_tabescaped(str, argv[1]);
+	str_append_c(str, '\n');
+	replicator_send(ctx, str_c(str));
+
+	line = i_stream_read_next_line(ctx->input);
+	if (line == NULL) {
+		i_error("Replicator disconnected unexpectedly");
+		doveadm_exit_code = EX_TEMPFAIL;
+	} else if (line[0] != '+') {
+		i_error("Replicator failed: %s", line+1);
+		doveadm_exit_code = EX_USAGE;
+	}
+	replicator_disconnect(ctx);
+}
+
 static void cmd_replicator_remove(int argc, char *argv[])
 {
 	struct replicator_context *ctx;
@@ -293,6 +321,8 @@
 	  "[-a <replicator socket path>]" },
 	{ cmd_replicator_replicate, "replicator replicate",
 	  "[-a <replicator socket path>] [-f] [-p <priority>] <user mask>" },
+	{ cmd_replicator_add, "replicator add",
+	  "[-a <replicator socket path>] <user mask>" },
 	{ cmd_replicator_remove, "replicator remove",
 	  "[-a <replicator socket path>] <username>" },
 };
diff -r fac4e7320676 -r b912147d41c8 src/replication/replicator/Makefile.am
--- a/src/replication/replicator/Makefile.am	Mon Apr 28 18:24:04 2014 +0300
+++ b/src/replication/replicator/Makefile.am	Mon Apr 28 18:34:27 2014 +0300
@@ -20,6 +20,7 @@
 	replicator.c \
 	replicator-brain.c \
 	replicator-queue.c \
+	replicator-queue-auth.c \
 	replicator-settings.c \
 	notify-connection.c
 
diff -r fac4e7320676 -r b912147d41c8 src/replication/replicator/doveadm-connection.c
--- a/src/replication/replicator/doveadm-connection.c	Mon Apr 28 18:24:04 2014 +0300
+++ b/src/replication/replicator/doveadm-connection.c	Mon Apr 28 18:34:27 2014 +0300
@@ -10,6 +10,7 @@
 #include "master-service.h"
 #include "replicator-brain.h"
 #include "replicator-queue.h"
+#include "replicator-settings.h"
 #include "dsync-client.h"
 #include "doveadm-connection.h"
 
@@ -194,6 +195,31 @@
 }
 
 static int
+client_input_add(struct doveadm_connection *client, const char *const *args)
+{
+	struct replicator_queue *queue =
+		replicator_brain_get_queue(client->brain);
+	const struct replicator_settings *set =
+		replicator_brain_get_settings(client->brain);
+
+	/* <usermask> */
+	if (str_array_length(args) != 1) {
+		i_error("%s: ADD: Invalid parameters", client->conn.name);
+		return -1;
+	}
+
+	if (strchr(args[0], '*') == NULL && strchr(args[0], '?') == NULL) {
+		(void)replicator_queue_add(queue, args[0],
+					   REPLICATION_PRIORITY_NONE);
+	} else {
+		replicator_queue_add_auth_users(queue, set->auth_socket_path,
+						args[0], ioloop_time);
+	}
+	o_stream_send_str(client->conn.output, "+\n");
+	return 0;
+}
+
+static int
 client_input_remove(struct doveadm_connection *client, const char *const *args)
 {
 	struct replicator_queue *queue =
@@ -259,6 +285,8 @@
 		return client_input_status_dsyncs(client);
 	else if (strcmp(cmd, "REPLICATE") == 0)
 		return client_input_replicate(client, args);
+	else if (strcmp(cmd, "ADD") == 0)
+		return client_input_add(client, args);
 	else if (strcmp(cmd, "REMOVE") == 0)
 		return client_input_remove(client, args);
 	else if (strcmp(cmd, "NOTIFY") == 0)
diff -r fac4e7320676 -r b912147d41c8 src/replication/replicator/replicator-queue-auth.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/replication/replicator/replicator-queue-auth.c	Mon Apr 28 18:34:27 2014 +0300
@@ -0,0 +1,36 @@
+/* Copyright (c) 2013-2014 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "auth-master.h"
+#include "replicator-queue.h"
+
+#define REPLICATOR_AUTH_SERVICE_NAME "replicator"
+
+void replicator_queue_add_auth_users(struct replicator_queue *queue,
+				     const char *auth_socket_path,
+				     const char *usermask, time_t last_update)
+{
+	struct auth_master_connection *auth_conn;
+	struct auth_master_user_list_ctx *ctx;
+	struct auth_user_info user_info;
+	struct replicator_user *user;
+	const char *username;
+
+	auth_conn = auth_master_init(auth_socket_path,
+				     AUTH_MASTER_FLAG_NO_IDLE_TIMEOUT);
+
+	memset(&user_info, 0, sizeof(user_info));
+	user_info.service = REPLICATOR_AUTH_SERVICE_NAME;
+
+	/* add all users into replication queue, so that we can start doing
+	   full syncs for everyone whose state can't be found */
+	ctx = auth_master_user_list_init(auth_conn, usermask, &user_info);
+	while ((username = auth_master_user_list_next(ctx)) != NULL) {
+		user = replicator_queue_add(queue, username,
+					    REPLICATION_PRIORITY_NONE);
+		user->last_update = last_update;
+	}
+	if (auth_master_user_list_deinit(&ctx) < 0)
+		i_error("listing users failed, can't replicate existing data");
+	auth_master_deinit(&auth_conn);
+}
diff -r fac4e7320676 -r b912147d41c8 src/replication/replicator/replicator-queue.h
--- a/src/replication/replicator/replicator-queue.h	Mon Apr 28 18:24:04 2014 +0300
+++ b/src/replication/replicator/replicator-queue.h	Mon Apr 28 18:34:27 2014 +0300
@@ -78,4 +78,8 @@
 replicator_queue_iter_next(struct replicator_queue_iter *iter);
 void replicator_queue_iter_deinit(struct replicator_queue_iter **iter);
 
+void replicator_queue_add_auth_users(struct replicator_queue *queue,
+				     const char *auth_socket_path,
+				     const char *usermask, time_t last_update);
+
 #endif
diff -r fac4e7320676 -r b912147d41c8 src/replication/replicator/replicator.c
--- a/src/replication/replicator/replicator.c	Mon Apr 28 18:24:04 2014 +0300
+++ b/src/replication/replicator/replicator.c	Mon Apr 28 18:34:27 2014 +0300
@@ -12,7 +12,6 @@
 #include "replicator-queue.h"
 #include "replicator-settings.h"
 
-#define REPLICATOR_AUTH_SERVICE_NAME "replicator"
 #define REPLICATOR_DB_DUMP_INTERVAL_MSECS (1000*60*15)
 /* if syncing fails, try again in 5 minutes */
 #define REPLICATOR_FAILURE_RESYNC_INTERVAL_SECS (60*5)
@@ -35,29 +34,9 @@
 
 static void replication_add_users(struct replicator_queue *queue)
 {
-	struct auth_master_connection *auth_conn;
-	struct auth_master_user_list_ctx *ctx;
-	struct auth_user_info user_info;
-	struct replicator_user *user;
-	const char *path, *username;
+	const char *path;
 
-	auth_conn = auth_master_init(set->auth_socket_path,
-				     AUTH_MASTER_FLAG_NO_IDLE_TIMEOUT);
-
-	memset(&user_info, 0, sizeof(user_info));
-	user_info.service = REPLICATOR_AUTH_SERVICE_NAME;
-
-	/* add all users into replication queue, so that we can start doing
-	   full syncs for everyone whose state can't be found */
-	ctx = auth_master_user_list_init(auth_conn, "", &user_info);
-	while ((username = auth_master_user_list_next(ctx)) != NULL) {
-		user = replicator_queue_add(queue, username,
-					    REPLICATION_PRIORITY_NONE);
-		user->last_update = 0;
-	}
-	if (auth_master_user_list_deinit(&ctx) < 0)
-		i_error("listing users failed, can't replicate existing data");
-	auth_master_deinit(&auth_conn);
+	replicator_queue_add_auth_users(queue, set->auth_socket_path, "*", 0);
 
 	/* add updates from replicator db, if it exists */
 	path = t_strconcat(service_set->state_dir, "/"REPLICATOR_DB_FNAME, NULL);


More information about the dovecot-cvs mailing list