dovecot-2.2: doveadm director update command added.
dovecot at dovecot.org
dovecot at dovecot.org
Thu Sep 3 13:05:43 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/7ac9ec913a39
changeset: 19078:7ac9ec913a39
user: Timo Sirainen <tss at iki.fi>
date: Thu Sep 03 16:04:26 2015 +0300
description:
doveadm director update command added.
The difference to "doveadm director add" is that if the IP doesn't already
exist, it's not added.
diffstat:
src/director/doveadm-connection.c | 32 +++++++++++++++++++++++++++-----
src/doveadm/doveadm-director.c | 34 ++++++++++++++++++++++++++--------
2 files changed, 53 insertions(+), 13 deletions(-)
diffs (159 lines):
diff -r f17065f4f9f2 -r 7ac9ec913a39 src/director/doveadm-connection.c
--- a/src/director/doveadm-connection.c Thu Sep 03 14:10:36 2015 +0300
+++ b/src/director/doveadm-connection.c Thu Sep 03 16:04:26 2015 +0300
@@ -246,7 +246,8 @@
}
static bool
-doveadm_cmd_host_set(struct doveadm_connection *conn, const char *line)
+doveadm_cmd_host_set_or_update(struct doveadm_connection *conn, const char *line,
+ bool update)
{
struct director *dir = conn->dir;
const char *const *args, *ip_str, *tag = "";
@@ -264,8 +265,10 @@
ip_str = t_strdup_until(ip_str, tag++);
}
if (ip_str == NULL || net_addr2ip(ip_str, &ip) < 0 ||
- (args[1] != NULL && str_to_uint(args[1], &vhost_count) < 0)) {
- i_error("doveadm sent invalid HOST-SET parameters: %s", line);
+ (args[1] != NULL && str_to_uint(args[1], &vhost_count) < 0) ||
+ (args[1] == NULL && update)) {
+ i_error("doveadm sent invalid %s parameters: %s",
+ update ? "HOST-UPDATE" : "HOST-SET", line);
return FALSE;
}
if (vhost_count > MAX_VALID_VHOST_COUNT && vhost_count != UINT_MAX) {
@@ -273,11 +276,16 @@
return TRUE;
}
host = mail_host_lookup(dir->mail_hosts, &ip);
- if (host == NULL)
+ if (host == NULL) {
+ if (update) {
+ o_stream_nsend_str(conn->output, "NOTFOUND\n");
+ return TRUE;
+ }
host = mail_host_add_ip(dir->mail_hosts, &ip, tag);
+ }
if (vhost_count != UINT_MAX)
mail_host_set_vhost_count(dir->mail_hosts, host, vhost_count);
- /* NOTE: we don't supporting changing a tag for an existing host.
+ /* NOTE: we don't support changing a tag for an existing host.
it needs to be removed first. otherwise it would be a bit ugly to
handle. */
director_update_host(dir, dir->self_host, NULL, host);
@@ -287,6 +295,18 @@
}
static bool
+doveadm_cmd_host_set(struct doveadm_connection *conn, const char *line)
+{
+ return doveadm_cmd_host_set_or_update(conn, line, FALSE);
+}
+
+static bool
+doveadm_cmd_host_update(struct doveadm_connection *conn, const char *line)
+{
+ return doveadm_cmd_host_set_or_update(conn, line, TRUE);
+}
+
+static bool
doveadm_cmd_host_updown(struct doveadm_connection *conn, bool down,
const char *line)
{
@@ -616,6 +636,8 @@
ret = doveadm_cmd_director_remove(conn, args);
else if (strcmp(cmd, "HOST-SET") == 0)
ret = doveadm_cmd_host_set(conn, args);
+ else if (strcmp(cmd, "HOST-UPDATE") == 0)
+ ret = doveadm_cmd_host_update(conn, args);
else if (strcmp(cmd, "HOST-UP") == 0)
ret = doveadm_cmd_host_updown(conn, FALSE, args);
else if (strcmp(cmd, "HOST-DOWN") == 0)
diff -r f17065f4f9f2 -r 7ac9ec913a39 src/doveadm/doveadm-director.c
--- a/src/doveadm/doveadm-director.c Thu Sep 03 14:10:36 2015 +0300
+++ b/src/doveadm/doveadm-director.c Thu Sep 03 16:04:26 2015 +0300
@@ -407,7 +407,9 @@
pool_unref(&pool);
}
-static void cmd_director_add(int argc, char *argv[])
+static void
+cmd_director_add_or_update(int argc, char *argv[], doveadm_command_t *cmd_func,
+ const char *director_cmd)
{
struct director_context *ctx;
struct ip_addr *ips;
@@ -415,18 +417,20 @@
const char *host, *line;
string_t *cmd;
- ctx = cmd_director_init(argc, argv, "a:t:", cmd_director_add);
+ ctx = cmd_director_init(argc, argv, "a:t:", cmd_func);
if (ctx->tag != NULL && ctx->tag[0] == '\0')
ctx->tag = NULL;
host = argv[optind++];
if (host == NULL)
- director_cmd_help(cmd_director_add);
+ director_cmd_help(cmd_func);
if (argv[optind] != NULL) {
if (str_to_uint(argv[optind++], &vhost_count) < 0)
- director_cmd_help(cmd_director_add);
- }
+ director_cmd_help(cmd_func);
+ } else if (strcmp(director_cmd, "HOST-UPDATE") == 0)
+ director_cmd_help(cmd_func);
+
if (argv[optind] != NULL)
- director_cmd_help(cmd_director_add);
+ director_cmd_help(cmd_func);
if (ctx->tag == NULL) {
ctx->tag = strchr(host, '@');
@@ -437,7 +441,7 @@
cmd = t_str_new(128);
for (i = 0; i < ips_count; i++) {
str_truncate(cmd, 0);
- str_printfa(cmd, "HOST-SET\t%s", net_ip2addr(&ips[i]));
+ str_printfa(cmd, "%s\t%s", director_cmd, net_ip2addr(&ips[i]));
if (ctx->tag != NULL)
str_printfa(cmd, "@%s", ctx->tag);
if (vhost_count != UINT_MAX)
@@ -449,7 +453,9 @@
line = i_stream_read_next_line(ctx->input);
if (line == NULL || strcmp(line, "OK") != 0) {
fprintf(stderr, "%s: %s\n", net_ip2addr(&ips[i]),
- line == NULL ? "failed" : line);
+ line == NULL ? "failed" :
+ strcmp(line, "NOTFOUND") == 0 ?
+ "doesn't exist" : line);
doveadm_exit_code = EX_TEMPFAIL;
} else if (doveadm_verbose) {
printf("%s: OK\n", net_ip2addr(&ips[i]));
@@ -458,6 +464,16 @@
director_disconnect(ctx);
}
+static void cmd_director_add(int argc, char *argv[])
+{
+ cmd_director_add_or_update(argc, argv, cmd_director_add, "HOST-SET");
+}
+
+static void cmd_director_update(int argc, char *argv[])
+{
+ cmd_director_add_or_update(argc, argv, cmd_director_update, "HOST-UPDATE");
+}
+
static void
cmd_director_ipcmd(const char *cmd_name, doveadm_command_t *cmd,
const char *success_result, int argc, char *argv[])
@@ -808,6 +824,8 @@
"[-a <director socket path>] [-f <users file>] [-h | -u] [<host>]" },
{ cmd_director_add, "director add",
"[-a <director socket path>] [-t <tag>] <host> [<vhost count>]" },
+ { cmd_director_update, "director update",
+ "[-a <director socket path>] [-t <tag>] <host> <vhost count>" },
{ cmd_director_up, "director up",
"[-a <director socket path>] <host>" },
{ cmd_director_down, "director down",
More information about the dovecot-cvs
mailing list