doveadm-connection.c revision 8913a7f43959c7d5e8692584fe056d420cc2f9e0
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski/* Copyright (c) 2010-2017 Dovecot authors, see the included COPYING file */
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski#define DOVEADM_HANDSHAKE "VERSION\tdirector-doveadm\t1\t0\n"
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski#define DOVEADM_CONNECTION_RING_SYNC_TIMEOUT_MSECS (30*1000)
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC = 0x01,
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowskidoveadm_connection_ring_sync_callback_t(struct doveadm_connection *);
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski doveadm_connection_ring_sync_callback_t *ring_sync_callback;
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowskistatic struct doveadm_connection *doveadm_connections;
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowskistatic struct doveadm_connection *doveadm_ring_sync_pending_connections;
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowskistatic struct director_reset_cmd *reset_cmds = NULL;
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowskistatic void doveadm_connection_set_io(struct doveadm_connection *conn);
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowskistatic void doveadm_connection_deinit(struct doveadm_connection **_conn);
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowskidoveadm_connection_ring_sync_list_move(struct doveadm_connection *conn);
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowskistatic void doveadm_connection_cmd_run_synced(struct doveadm_connection *conn);
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowskidoveadm_cmd_host_list(struct doveadm_connection *conn,
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski array_foreach(mail_hosts_get(conn->dir->mail_hosts), hostp) {
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski net_ip2addr(&(*hostp)->ip), (*hostp)->vhost_count,
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski str_append_tabescaped(str, mail_host_get_tag(*hostp));
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski str_printfa(str, "\t%c\t%ld", (*hostp)->down ? 'D' : 'U',
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski o_stream_nsend(conn->output, str_data(str), str_len(str));
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowskidoveadm_cmd_host_list_removed(struct doveadm_connection *conn,
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski struct mail_host *const *orig_hosts, *const *cur_hosts;
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski unsigned int i, j, orig_hosts_count, cur_hosts_count;
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski orig_hosts_list = mail_hosts_init(conn->dir->set->director_user_expire,
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski (void)mail_hosts_parse_and_add(orig_hosts_list,
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski orig_hosts = array_get(mail_hosts_get(orig_hosts_list),
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski cur_hosts = array_get(mail_hosts_get(conn->dir->mail_hosts),
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski /* the hosts are sorted by IP */
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski for (i = j = 0; i < orig_hosts_count && j < cur_hosts_count; ) {
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski ret = net_ip_cmp(&orig_hosts[i]->ip, &cur_hosts[j]->ip);
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski else if (ret > 0)
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski for (; i < orig_hosts_count; i++)
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski str_printfa(str, "%s\n", net_ip2addr(&orig_hosts[i]->ip));
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowski o_stream_nsend(conn->output, str_data(str), str_len(str));
cbc7f7ea90538f481b528959e9b6cf837b0dd785Till Mossakowskistatic void doveadm_director_append_status(struct director *dir, string_t *str)
static enum doveadm_director_cmd_ret
const char *type;
else if (left)
else if (right)
(unsigned long)last_failed);
return DOVEADM_DIRECTOR_CMD_RET_OK;
static enum doveadm_director_cmd_ret
const char *const *args)
return DOVEADM_DIRECTOR_CMD_RET_FAIL;
return DOVEADM_DIRECTOR_CMD_RET_OK;
static enum doveadm_director_cmd_ret
const char *const *args)
return DOVEADM_DIRECTOR_CMD_RET_FAIL;
static enum doveadm_director_cmd_ret
return DOVEADM_DIRECTOR_CMD_RET_FAIL;
return DOVEADM_DIRECTOR_CMD_RET_OK;
if (update) {
return DOVEADM_DIRECTOR_CMD_RET_OK;
return DOVEADM_DIRECTOR_CMD_RET_OK;
return DOVEADM_DIRECTOR_CMD_RET_OK;
static enum doveadm_director_cmd_ret
static enum doveadm_director_cmd_ret
static enum doveadm_director_cmd_ret
const char *const *args)
return DOVEADM_DIRECTOR_CMD_RET_FAIL;
return DOVEADM_DIRECTOR_CMD_RET_OK;
return DOVEADM_DIRECTOR_CMD_RET_OK;
return DOVEADM_DIRECTOR_CMD_RET_OK;
static enum doveadm_director_cmd_ret
const char *const *args)
static enum doveadm_director_cmd_ret
const char *const *args)
static enum doveadm_director_cmd_ret
const char *const *args)
return DOVEADM_DIRECTOR_CMD_RET_FAIL;
return DOVEADM_DIRECTOR_CMD_RET_OK;
unsigned int total_user_count = 0;
static enum doveadm_director_cmd_ret
return DOVEADM_DIRECTOR_CMD_RET_OK;
return DOVEADM_DIRECTOR_CMD_RET_FAIL;
return DOVEADM_DIRECTOR_CMD_RET_OK;
return FALSE;
} T_END;
unsigned int count;
return FALSE;
return TRUE;
static enum doveadm_director_cmd_ret
const char *const *args)
unsigned int i = 0, count;
return DOVEADM_DIRECTOR_CMD_RET_FAIL;
args[0]);
return DOVEADM_DIRECTOR_CMD_RET_FAIL;
for (i = 0; i < count; i++) {
if (i == count) {
return DOVEADM_DIRECTOR_CMD_RET_OK;
return DOVEADM_DIRECTOR_CMD_RET_OK;
static enum doveadm_director_cmd_ret
const char *const *args)
unsigned int username_hash;
return DOVEADM_DIRECTOR_CMD_RET_OK;
return DOVEADM_DIRECTOR_CMD_RET_OK;
static enum doveadm_director_cmd_ret
return DOVEADM_DIRECTOR_CMD_RET_FAIL;
} T_END;
return DOVEADM_DIRECTOR_CMD_RET_OK;
static enum doveadm_director_cmd_ret
unsigned int username_hash;
return DOVEADM_DIRECTOR_CMD_RET_FAIL;
return DOVEADM_DIRECTOR_CMD_RET_OK;
return DOVEADM_DIRECTOR_CMD_RET_OK;
return DOVEADM_DIRECTOR_CMD_RET_OK;
return DOVEADM_DIRECTOR_CMD_RET_OK;
static enum doveadm_director_cmd_ret
return DOVEADM_DIRECTOR_CMD_RET_FAIL;
return DOVEADM_DIRECTOR_CMD_RET_OK;
static enum doveadm_director_cmd_ret
return DOVEADM_DIRECTOR_CMD_RET_FAIL;
return DOVEADM_DIRECTOR_CMD_RET_OK;
const char *name;
} doveadm_director_commands[] = {
static enum doveadm_director_cmd_ret
const char *const *args, unsigned int i)
return ret;
return DOVEADM_DIRECTOR_CMD_RET_OK;
static enum doveadm_director_cmd_ret
return DOVEADM_DIRECTOR_CMD_RET_FAIL;
args++;
return DOVEADM_DIRECTOR_CMD_RET_FAIL;
const char *line;
T_BEGIN {
} T_END;
struct doveadm_connection *
return conn;
void doveadm_connections_deinit(void)
unsigned int pending_count = 0;
if (pending_count > 0)
static void doveadm_connections_continue_reset_cmds(void)
void doveadm_connections_ring_synced(void)