Mercurial > dovecot > core-2.2
changeset 12986:c838d40bd38e
doveadm: Added "director dump" command.
It outputs doveadm director commands to add/remove the current host
configuration, so if all directors are stopped, their state can be easily
restored by running the commands.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 03 May 2011 18:41:10 +0200 |
parents | 036260ae0261 |
children | 869795a295b5 |
files | src/director/doveadm-connection.c src/doveadm/doveadm-director.c |
diffstat | 2 files changed, 89 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/director/doveadm-connection.c Tue May 03 09:58:11 2011 +0200 +++ b/src/director/doveadm-connection.c Tue May 03 18:41:10 2011 +0200 @@ -53,6 +53,44 @@ o_stream_send(conn->output, str_data(str), str_len(str)); } +static void doveadm_cmd_host_list_removed(struct doveadm_connection *conn) +{ + struct mail_host_list *orig_hosts_list; + struct mail_host *const *orig_hosts, *const *cur_hosts; + unsigned int i, j, orig_hosts_count, cur_hosts_count; + string_t *str = t_str_new(1024); + int ret; + + orig_hosts_list = mail_hosts_init(); + (void)mail_hosts_parse_and_add(orig_hosts_list, + conn->dir->set->director_mail_servers); + + orig_hosts = array_get(mail_hosts_get(orig_hosts_list), + &orig_hosts_count); + cur_hosts = array_get(mail_hosts_get(conn->dir->mail_hosts), + &cur_hosts_count); + + /* the hosts are sorted by IP */ + for (i = j = 0; i < orig_hosts_count && j < cur_hosts_count; ) { + ret = net_ip_cmp(&orig_hosts[i]->ip, &cur_hosts[j]->ip); + if (ret == 0) + i++, j++; + else if (ret > 0) + j++; + else { + str_printfa(str, "%s\n", + net_ip2addr(&orig_hosts[i]->ip)); + i++; + } + } + for (; i < orig_hosts_count; i++) + str_printfa(str, "%s\n", net_ip2addr(&orig_hosts[i]->ip)); + str_append_c(str, '\n'); + o_stream_send(conn->output, str_data(str), str_len(str)); + + mail_hosts_deinit(&orig_hosts_list); +} + static void doveadm_cmd_director_list(struct doveadm_connection *conn) { struct director_host *const *hostp; @@ -263,6 +301,8 @@ if (strcmp(cmd, "HOST-LIST") == 0) doveadm_cmd_host_list(conn); + else if (strcmp(cmd, "HOST-LIST-REMOVED") == 0) + doveadm_cmd_host_list_removed(conn); else if (strcmp(cmd, "DIRECTOR-LIST") == 0) doveadm_cmd_director_list(conn); else if (strcmp(cmd, "HOST-SET") == 0)
--- a/src/doveadm/doveadm-director.c Tue May 03 09:58:11 2011 +0200 +++ b/src/doveadm/doveadm-director.c Tue May 03 18:41:10 2011 +0200 @@ -20,6 +20,7 @@ const char *socket_path; const char *users_path; struct istream *input; + bool explicit_socket_path; }; struct user_list { @@ -91,6 +92,7 @@ switch (c) { case 'a': ctx->socket_path = optarg; + ctx->explicit_socket_path = TRUE; break; case 'f': ctx->users_path = optarg; @@ -465,6 +467,50 @@ director_disconnect(ctx); } +static void ATTR_FORMAT(3, 4) +director_dump_cmd(struct director_context *ctx, + const char *cmd, const char *args, ...) +{ + va_list va; + + va_start(va, args); + printf("doveadm director %s ", cmd); + if (ctx->explicit_socket_path) + printf("-a %s ", ctx->socket_path); + vprintf(args, va); + putchar('\n'); + va_end(va); +} + +static void cmd_director_dump(int argc, char *argv[]) +{ + struct director_context *ctx; + const char *line, *const *args; + + ctx = cmd_director_init(argc, argv, "a:", cmd_director_dump); + + director_send(ctx, "HOST-LIST\n"); + while ((line = i_stream_read_next_line(ctx->input)) != NULL) { + if (*line == '\0') + break; + T_BEGIN { + args = t_strsplit(line, "\t"); + if (str_array_length(args) >= 2) { + director_dump_cmd(ctx, "add", "%s %s", + args[0], args[1]); + } + } T_END; + } + + director_send(ctx, "HOST-LIST-REMOVED\n"); + while ((line = i_stream_read_next_line(ctx->input)) != NULL) { + if (*line == '\0') + break; + director_dump_cmd(ctx, "remove", "%s", line); + } + director_disconnect(ctx); +} + struct doveadm_cmd doveadm_cmd_director[] = { { cmd_director_status, "director status", "[-a <director socket path>] [<user>]" }, @@ -475,7 +521,9 @@ { cmd_director_remove, "director remove", "[-a <director socket path>] <host>" }, { cmd_director_flush, "director flush", - "[-a <director socket path>] <host>|all" } + "[-a <director socket path>] <host>|all" }, + { cmd_director_dump, "director dump", + "[-a <director socket path>]" } }; static void director_cmd_help(doveadm_command_t *cmd)