changeset 20846:9d70a6f86e24

doveadm director kick: Added -f <passdb field> parameter. This works for all the user_* passdb fields.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 06 Oct 2016 15:22:13 +0300
parents 11f6f45baf3e
children 4a5429a7c7c4
files src/director/director-connection.c src/director/director.c src/director/director.h src/doveadm/doveadm-director.c
diffstat 4 files changed, 71 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/director/director-connection.c	Thu Oct 06 15:19:51 2016 +0300
+++ b/src/director/director-connection.c	Thu Oct 06 15:22:13 2016 +0300
@@ -1090,6 +1090,25 @@
 }
 
 static bool
+director_cmd_user_kick_alt(struct director_connection *conn,
+			   const char *const *args)
+{
+	struct director_host *dir_host;
+	int ret;
+
+	if ((ret = director_cmd_is_seen(conn, &args, &dir_host)) != 0)
+		return ret > 0;
+
+	if (str_array_length(args) != 2) {
+		director_cmd_error(conn, "Invalid parameters");
+		return FALSE;
+	}
+
+	director_kick_user_alt(conn->dir, conn->host, dir_host, args[0], args[1]);
+	return TRUE;
+}
+
+static bool
 director_cmd_user_kick_hash(struct director_connection *conn,
 			    const char *const *args)
 {
@@ -1579,6 +1598,8 @@
 		return director_cmd_user_move(conn, args);
 	if (strcmp(cmd, "USER-KICK") == 0)
 		return director_cmd_user_kick(conn, args);
+	if (strcmp(cmd, "USER-KICK-ALT") == 0)
+		return director_cmd_user_kick_alt(conn, args);
 	if (strcmp(cmd, "USER-KICK-HASH") == 0)
 		return director_cmd_user_kick_hash(conn, args);
 	if (strcmp(cmd, "USER-KILLED") == 0)
--- a/src/director/director.c	Thu Oct 06 15:19:51 2016 +0300
+++ b/src/director/director.c	Thu Oct 06 15:22:13 2016 +0300
@@ -907,6 +907,32 @@
 	director_update_send_version(dir, src, DIRECTOR_VERSION_USER_KICK, str_c(cmd));
 }
 
+void director_kick_user_alt(struct director *dir, struct director_host *src,
+			    struct director_host *orig_src,
+			    const char *field, const char *value)
+{
+	string_t *cmd = t_str_new(64);
+
+	str_append(cmd, "proxy\t*\tKICK-ALT\t");
+	str_append_tabescaped(cmd, field);
+	str_append_c(cmd, '\t');
+	str_append_tabescaped(cmd, value);
+	ipc_client_cmd(dir->ipc_proxy, str_c(cmd),
+		       director_kick_user_callback, (void *)NULL);
+
+	if (orig_src == NULL) {
+		orig_src = dir->self_host;
+		orig_src->last_seq++;
+	}
+	str_printfa(cmd, "USER-KICK-ALT\t%s\t%u\t%u\t",
+		net_ip2addr(&orig_src->ip), orig_src->port, orig_src->last_seq);
+	str_append_tabescaped(cmd, field);
+	str_append_c(cmd, '\t');
+	str_append_tabescaped(cmd, value);
+	str_append_c(cmd, '\n');
+	director_update_send_version(dir, src, DIRECTOR_VERSION_USER_KICK_ALT, str_c(cmd));
+}
+
 void director_kick_user_hash(struct director *dir, struct director_host *src,
 			     struct director_host *orig_src,
 			     unsigned int username_hash,
--- a/src/director/director.h	Thu Oct 06 15:19:51 2016 +0300
+++ b/src/director/director.h	Thu Oct 06 15:22:13 2016 +0300
@@ -6,7 +6,7 @@
 
 #define DIRECTOR_VERSION_NAME "director"
 #define DIRECTOR_VERSION_MAJOR 1
-#define DIRECTOR_VERSION_MINOR 7
+#define DIRECTOR_VERSION_MINOR 8
 
 /* weak users supported in protocol */
 #define DIRECTOR_VERSION_WEAK_USERS 1
@@ -24,6 +24,8 @@
 #define DIRECTOR_VERSION_UPDOWN 6
 /* user tag version 2 supported */
 #define DIRECTOR_VERSION_TAGS_V2 7
+/* user-kick-alt supported */
+#define DIRECTOR_VERSION_USER_KICK_ALT 8
 
 /* Minimum time between even attempting to communicate with a director that
    failed due to a protocol error. */
@@ -150,6 +152,10 @@
 void director_kick_user(struct director *dir, struct director_host *src,
 			struct director_host *orig_src, const char *username)
 	ATTR_NULL(3);
+void director_kick_user_alt(struct director *dir, struct director_host *src,
+			    struct director_host *orig_src,
+			    const char *field, const char *value)
+	ATTR_NULL(3);
 void director_kick_user_hash(struct director *dir, struct director_host *src,
 			     struct director_host *orig_src,
 			     unsigned int username_hash,
--- a/src/doveadm/doveadm-director.c	Thu Oct 06 15:19:51 2016 +0300
+++ b/src/doveadm/doveadm-director.c	Thu Oct 06 15:22:13 2016 +0300
@@ -27,6 +27,7 @@
 	const char *ip;
 	const char *port;
 	const char *vhost_count;
+	const char *passdb_field;
 
 	struct istream *users_input;
 	struct istream *input;
@@ -125,6 +126,8 @@
 		ctx->port = NULL;
 	if (!doveadm_cmd_param_str(cctx, "vhost-count", &(ctx->vhost_count)))
 		ctx->vhost_count = NULL;
+	if (!doveadm_cmd_param_str(cctx, "passdb-field", &(ctx->passdb_field)))
+		ctx->passdb_field = NULL;
 	if (!ctx->user_map)
 		director_connect(ctx);
 	return ctx;
@@ -595,11 +598,19 @@
 		return;
 	}
 
-	str_append(cmd, "USER-KICK\t");
-	str_append_tabescaped(cmd, ctx->user);
-	str_append_c(cmd, '\n');
+	if (ctx->passdb_field == NULL) {
+		str_append(cmd, "USER-KICK\t");
+		str_append_tabescaped(cmd, ctx->user);
+		str_append_c(cmd, '\n');
+	} else {
+		str_append(cmd, "USER-KICK-ALT\t");
+		str_append_tabescaped(cmd, ctx->passdb_field);
+		str_append_c(cmd, '\t');
+		str_append_tabescaped(cmd, ctx->user);
+		str_append_c(cmd, '\n');
+	}
+	director_send(ctx, str_c(cmd));
 
-	director_send(ctx, str_c(cmd));
 	line = i_stream_read_next_line(ctx->input);
 	if (line == NULL) {
 		i_error("failed");
@@ -921,9 +932,10 @@
 {
 	.name = "director kick",
 	.cmd = cmd_director_kick,
-	.usage = "[-a <director socket path>] <user>",
+	.usage = "[-a <director socket path>] [-f <passdb field>] <user>",
 DOVEADM_CMD_PARAMS_START
 DOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
+DOVEADM_CMD_PARAM('\0', "passdb-field", CMD_PARAM_STR, 0)
 DOVEADM_CMD_PARAM('\0', "user", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
 DOVEADM_CMD_PARAMS_END
 },