annotate src/director/doveadm-connection.c @ 22535:2805abc195e1

director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 14 Aug 2017 10:06:34 +0300
parents 30549d635210
children 5f09f6aa089b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21312
diff changeset
1 /* Copyright (c) 2010-2017 Dovecot authors, see the included COPYING file */
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "ioloop.h"
15187
02451e967a06 Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
5 #include "net.h"
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "istream.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "ostream.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "array.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "str.h"
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
10 #include "strescape.h"
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "llist.h"
11373
26cfc1c3a4b1 director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents: 11355
diff changeset
12 #include "master-service.h"
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "user-directory.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "mail-host.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include "director.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "director-host.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #include "director-request.h"
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
18 #include "director-connection.h"
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 #include "doveadm-connection.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 #include <unistd.h>
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
11458
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11373
diff changeset
23 #define DOVEADM_PROTOCOL_VERSION_MAJOR 1
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11373
diff changeset
24 #define DOVEADM_HANDSHAKE "VERSION\tdirector-doveadm\t1\t0\n"
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 #define MAX_VALID_VHOST_COUNT 1000
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
27 #define DEFAULT_MAX_MOVING_USERS 100
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
28
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
29 enum doveadm_director_cmd_ret {
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
30 DOVEADM_DIRECTOR_CMD_RET_FAIL = -1,
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
31 DOVEADM_DIRECTOR_CMD_RET_UNFINISHED = 0,
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
32 DOVEADM_DIRECTOR_CMD_RET_OK = 1,
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
33 };
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
34
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
35 struct director_reset_cmd {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
36 struct director_reset_cmd *prev, *next;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
37
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
38 struct director *dir;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
39 struct doveadm_connection *_conn;
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
40 struct director_user_iter *iter;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
41 unsigned int host_idx, hosts_count;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
42 unsigned int max_moving_users;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
43 };
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 struct doveadm_connection {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 struct doveadm_connection *prev, *next;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 int fd;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 struct io *io;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 struct istream *input;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 struct ostream *output;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 struct director *dir;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
54 struct director_reset_cmd *reset_cmd;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
55
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 unsigned int handshaked:1;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 };
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 static struct doveadm_connection *doveadm_connections;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
60 static struct director_reset_cmd *reset_cmds = NULL;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
62 static void doveadm_connection_set_io(struct doveadm_connection *conn);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 static void doveadm_connection_deinit(struct doveadm_connection **_conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
65 static enum doveadm_director_cmd_ret
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
66 doveadm_cmd_host_list(struct doveadm_connection *conn,
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
67 const char *const *args ATTR_UNUSED)
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 struct mail_host *const *hostp;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 string_t *str = t_str_new(1024);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71
11352
19336bddada2 director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents: 11351
diff changeset
72 array_foreach(mail_hosts_get(conn->dir->mail_hosts), hostp) {
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
73 str_printfa(str, "%s\t%u\t%u\t",
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 net_ip2addr(&(*hostp)->ip), (*hostp)->vhost_count,
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 (*hostp)->user_count);
19408
7e47f561ad49 director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents: 19407
diff changeset
76 str_append_tabescaped(str, mail_host_get_tag(*hostp));
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
77 str_printfa(str, "\t%c\t%ld", (*hostp)->down ? 'D' : 'U',
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
78 (long)(*hostp)->last_updown_change);
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
79 str_append_c(str, '\n');
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 str_append_c(str, '\n');
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
82 o_stream_nsend(conn->output, str_data(str), str_len(str));
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
83 return DOVEADM_DIRECTOR_CMD_RET_OK;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
86 static enum doveadm_director_cmd_ret
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
87 doveadm_cmd_host_list_removed(struct doveadm_connection *conn,
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
88 const char *const *args ATTR_UNUSED)
12986
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
89 {
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
90 struct mail_host_list *orig_hosts_list;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
91 struct mail_host *const *orig_hosts, *const *cur_hosts;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
92 unsigned int i, j, orig_hosts_count, cur_hosts_count;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
93 string_t *str = t_str_new(1024);
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
94 int ret;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
95
21079
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
96 orig_hosts_list = mail_hosts_init(conn->dir->set->director_user_expire,
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
97 conn->dir->set->director_consistent_hashing,
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
98 NULL);
12986
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
99 (void)mail_hosts_parse_and_add(orig_hosts_list,
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
100 conn->dir->set->director_mail_servers);
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
101
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
102 orig_hosts = array_get(mail_hosts_get(orig_hosts_list),
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
103 &orig_hosts_count);
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
104 cur_hosts = array_get(mail_hosts_get(conn->dir->mail_hosts),
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
105 &cur_hosts_count);
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
106
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
107 /* the hosts are sorted by IP */
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
108 for (i = j = 0; i < orig_hosts_count && j < cur_hosts_count; ) {
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
109 ret = net_ip_cmp(&orig_hosts[i]->ip, &cur_hosts[j]->ip);
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
110 if (ret == 0)
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
111 i++, j++;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
112 else if (ret > 0)
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
113 j++;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
114 else {
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
115 str_printfa(str, "%s\n",
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
116 net_ip2addr(&orig_hosts[i]->ip));
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
117 i++;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
118 }
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
119 }
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
120 for (; i < orig_hosts_count; i++)
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
121 str_printfa(str, "%s\n", net_ip2addr(&orig_hosts[i]->ip));
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
122 str_append_c(str, '\n');
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
123 o_stream_nsend(conn->output, str_data(str), str_len(str));
12986
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
124
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
125 mail_hosts_deinit(&orig_hosts_list);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
126 return DOVEADM_DIRECTOR_CMD_RET_OK;
12986
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
127 }
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
128
18062
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
129 static void doveadm_director_append_status(struct director *dir, string_t *str)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
130 {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
131 if (!dir->ring_handshaked)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
132 str_append(str, "handshaking");
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
133 else if (dir->ring_synced)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
134 str_append(str, "synced");
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
135 else {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
136 str_printfa(str, "syncing - last sync %d secs ago",
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
137 (int)(ioloop_time - dir->ring_last_sync_time));
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
138 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
139 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
140
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
141 static void
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
142 doveadm_director_connection_append_status(struct director_connection *conn,
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
143 string_t *str)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
144 {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
145 if (!director_connection_is_handshaked(conn))
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
146 str_append(str, "handshaking");
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
147 else if (director_connection_is_synced(conn))
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
148 str_append(str, "synced");
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
149 else
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
150 str_append(str, "syncing");
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
151 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
152
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
153 static void
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
154 doveadm_director_host_append_status(struct director *dir,
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
155 const struct director_host *host,
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
156 string_t *str)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
157 {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
158 struct director_connection *conn = NULL;
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
159
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
160 if (dir->left != NULL &&
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
161 director_connection_get_host(dir->left) == host)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
162 conn = dir->left;
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
163 else if (dir->right != NULL &&
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
164 director_connection_get_host(dir->right) == host)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
165 conn = dir->right;
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
166 else {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
167 /* we might have a connection that is being connected */
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
168 struct director_connection *const *connp;
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
169
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
170 array_foreach(&dir->connections, connp) {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
171 if (director_connection_get_host(*connp) == host) {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
172 conn = *connp;
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
173 break;
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
174 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
175 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
176 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
177
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
178 if (conn != NULL)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
179 doveadm_director_connection_append_status(conn, str);
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
180 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
181
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
182 static enum doveadm_director_cmd_ret
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
183 doveadm_cmd_director_list(struct doveadm_connection *conn,
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
184 const char *const *args ATTR_UNUSED)
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 {
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
186 struct director *dir = conn->dir;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 struct director_host *const *hostp;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 string_t *str = t_str_new(1024);
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
189 const char *type;
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
190 bool left, right;
14432
366b9e5fc85c director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
191 time_t last_failed;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
193 array_foreach(&dir->dir_hosts, hostp) {
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
194 const struct director_host *host = *hostp;
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
195
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
196 left = dir->left != NULL &&
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
197 director_connection_get_host(dir->left) == host;
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
198 right = dir->right != NULL &&
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
199 director_connection_get_host(dir->right) == host;
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
200
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
201 if (host->removed)
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
202 type = "removed";
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
203 else if (dir->self_host == host)
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
204 type = "self";
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
205 else if (left)
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
206 type = right ? "l+r" : "left";
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
207 else if (right)
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
208 type = "right";
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
209 else
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
210 type = "";
14432
366b9e5fc85c director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
211
366b9e5fc85c director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
212 last_failed = I_MAX(host->last_network_failure,
366b9e5fc85c director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
213 host->last_protocol_failure);
18062
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
214 str_printfa(str, "%s\t%u\t%s\t%lu\t",
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
215 net_ip2addr(&host->ip), host->port, type,
14432
366b9e5fc85c director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
216 (unsigned long)last_failed);
18062
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
217 if (dir->self_host == host)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
218 doveadm_director_append_status(dir, str);
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
219 else
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
220 doveadm_director_host_append_status(dir, host, str);
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
221 str_append_c(str, '\n');
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 str_append_c(str, '\n');
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
224 o_stream_nsend(conn->output, str_data(str), str_len(str));
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
225 return DOVEADM_DIRECTOR_CMD_RET_OK;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
228 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
229 doveadm_cmd_director_add(struct doveadm_connection *conn,
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
230 const char *const *args)
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
231 {
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
232 struct director_host *host;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
233 struct ip_addr ip;
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18729
diff changeset
234 in_port_t port = conn->dir->self_port;
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
235
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
236 if (args[0] == NULL ||
20968
2a7e47e01509 director: Make sure IP address parsing works in DIRECTOR-ADD/REMOVE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20967
diff changeset
237 net_addr2ip(args[0], &ip) < 0 ||
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18729
diff changeset
238 (args[1] != NULL && net_str2port(args[1], &port) < 0)) {
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
239 i_error("doveadm sent invalid DIRECTOR-ADD parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
240 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
241 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
242
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
243 if (director_host_lookup(conn->dir, &ip, port) == NULL) {
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
244 host = director_host_add(conn->dir, &ip, port);
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
245 director_notify_ring_added(host, conn->dir->self_host);
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
246 }
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
247 o_stream_nsend(conn->output, "OK\n", 3);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
248 return DOVEADM_DIRECTOR_CMD_RET_OK;
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
249 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
250
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
251 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
252 doveadm_cmd_director_remove(struct doveadm_connection *conn,
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
253 const char *const *args)
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
254 {
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
255 struct director_host *host;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
256 struct ip_addr ip;
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18729
diff changeset
257 in_port_t port = 0;
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
258
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
259 if (args[0] == NULL ||
20968
2a7e47e01509 director: Make sure IP address parsing works in DIRECTOR-ADD/REMOVE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20967
diff changeset
260 net_addr2ip(args[0], &ip) < 0 ||
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18729
diff changeset
261 (args[1] != NULL && net_str2port(args[1], &port) < 0)) {
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
262 i_error("doveadm sent invalid DIRECTOR-REMOVE parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
263 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
264 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
265
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
266 host = port != 0 ?
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
267 director_host_lookup(conn->dir, &ip, port) :
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
268 director_host_lookup_ip(conn->dir, &ip);
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
269 if (host == NULL)
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
270 o_stream_nsend_str(conn->output, "NOTFOUND\n");
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
271 else {
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
272 director_ring_remove(host, conn->dir->self_host);
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
273 o_stream_nsend(conn->output, "OK\n", 3);
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
274 }
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
275 return DOVEADM_DIRECTOR_CMD_RET_OK;
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
276 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
277
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
278 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
279 doveadm_cmd_host_set_or_update(struct doveadm_connection *conn,
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
280 const char *const *args, bool update)
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 {
11352
19336bddada2 director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents: 11351
diff changeset
282 struct director *dir = conn->dir;
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
283 const char *ip_str, *tag = "";
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 struct mail_host *host;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 struct ip_addr ip;
15904
d3cf06639864 Replaced all -1U and (unsigned int)-1 with UINT_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
286 unsigned int vhost_count = UINT_MAX;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
288 ip_str = args[0];
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
289 if (ip_str != NULL) {
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
290 tag = strchr(ip_str, '@');
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
291 if (tag == NULL)
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
292 tag = "";
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
293 else
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
294 ip_str = t_strdup_until(ip_str, tag++);
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
295 }
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
296 if (ip_str == NULL || net_addr2ip(ip_str, &ip) < 0 ||
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
297 (args[1] != NULL && str_to_uint(args[1], &vhost_count) < 0) ||
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
298 (args[1] == NULL && update)) {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
299 i_error("doveadm sent invalid %s parameters",
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
300 update ? "HOST-UPDATE" : "HOST-SET");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
301 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 }
15904
d3cf06639864 Replaced all -1U and (unsigned int)-1 with UINT_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
303 if (vhost_count > MAX_VALID_VHOST_COUNT && vhost_count != UINT_MAX) {
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
304 o_stream_nsend_str(conn->output, "vhost count too large\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
305 return DOVEADM_DIRECTOR_CMD_RET_OK;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 }
11352
19336bddada2 director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents: 11351
diff changeset
307 host = mail_host_lookup(dir->mail_hosts, &ip);
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
308 if (host == NULL) {
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
309 if (update) {
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
310 o_stream_nsend_str(conn->output, "NOTFOUND\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
311 return DOVEADM_DIRECTOR_CMD_RET_OK;
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
312 }
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
313 host = mail_host_add_ip(dir->mail_hosts, &ip, tag);
19497
1d2999cfe0a4 director: If doveadm attempts to change tag for an existing host, return error.
Timo Sirainen <tss@iki.fi>
parents: 19437
diff changeset
314 } else if (tag[0] != '\0' && strcmp(mail_host_get_tag(host), tag) != 0) {
1d2999cfe0a4 director: If doveadm attempts to change tag for an existing host, return error.
Timo Sirainen <tss@iki.fi>
parents: 19437
diff changeset
315 o_stream_nsend_str(conn->output, "host tag can't be changed\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
316 return DOVEADM_DIRECTOR_CMD_RET_OK;
19288
5939512ff017 director: Don't allow doveadm to update backend's state if the state is already being changed.
Timo Sirainen <tss@iki.fi>
parents: 19078
diff changeset
317 } else if (host->desynced) {
5939512ff017 director: Don't allow doveadm to update backend's state if the state is already being changed.
Timo Sirainen <tss@iki.fi>
parents: 19078
diff changeset
318 o_stream_nsend_str(conn->output,
5939512ff017 director: Don't allow doveadm to update backend's state if the state is already being changed.
Timo Sirainen <tss@iki.fi>
parents: 19078
diff changeset
319 "host is already being updated - try again later\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
320 return DOVEADM_DIRECTOR_CMD_RET_OK;
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
321 }
15904
d3cf06639864 Replaced all -1U and (unsigned int)-1 with UINT_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
322 if (vhost_count != UINT_MAX)
21842
86e52ff70044 director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21443
diff changeset
323 mail_host_set_vhost_count(host, vhost_count, "doveadm: ");
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
324 /* NOTE: we don't support changing a tag for an existing host.
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
325 it needs to be removed first. otherwise it would be a bit ugly to
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
326 handle. */
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
327 director_update_host(dir, dir->self_host, NULL, host);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
329 o_stream_nsend(conn->output, "OK\n", 3);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
330 return DOVEADM_DIRECTOR_CMD_RET_OK;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
333 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
334 doveadm_cmd_host_set(struct doveadm_connection *conn, const char *const *args)
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
335 {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
336 return doveadm_cmd_host_set_or_update(conn, args, FALSE);
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
337 }
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
338
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
339 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
340 doveadm_cmd_host_update(struct doveadm_connection *conn, const char *const *args)
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
341 {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
342 return doveadm_cmd_host_set_or_update(conn, args, TRUE);
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
343 }
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
344
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
345 static enum doveadm_director_cmd_ret
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
346 doveadm_cmd_host_updown(struct doveadm_connection *conn, bool down,
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
347 const char *const *args)
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
348 {
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
349 struct mail_host *host;
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
350 struct ip_addr ip;
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
351
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
352 if (args[0] == NULL || net_addr2ip(args[0], &ip) < 0) {
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
353 i_error("doveadm sent invalid %s parameters: %s",
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
354 down ? "HOST-DOWN" : "HOST-UP",
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
355 args[0] == NULL ? "" : args[0]);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
356 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
357 }
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
358 host = mail_host_lookup(conn->dir->mail_hosts, &ip);
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
359 if (host == NULL) {
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
360 o_stream_nsend_str(conn->output, "NOTFOUND\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
361 return DOVEADM_DIRECTOR_CMD_RET_OK;
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
362 }
19288
5939512ff017 director: Don't allow doveadm to update backend's state if the state is already being changed.
Timo Sirainen <tss@iki.fi>
parents: 19078
diff changeset
363 if (host->down == down)
5939512ff017 director: Don't allow doveadm to update backend's state if the state is already being changed.
Timo Sirainen <tss@iki.fi>
parents: 19078
diff changeset
364 ;
5939512ff017 director: Don't allow doveadm to update backend's state if the state is already being changed.
Timo Sirainen <tss@iki.fi>
parents: 19078
diff changeset
365 else if (host->desynced) {
5939512ff017 director: Don't allow doveadm to update backend's state if the state is already being changed.
Timo Sirainen <tss@iki.fi>
parents: 19078
diff changeset
366 o_stream_nsend_str(conn->output,
5939512ff017 director: Don't allow doveadm to update backend's state if the state is already being changed.
Timo Sirainen <tss@iki.fi>
parents: 19078
diff changeset
367 "host is already being updated - try again later\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
368 return DOVEADM_DIRECTOR_CMD_RET_OK;
19288
5939512ff017 director: Don't allow doveadm to update backend's state if the state is already being changed.
Timo Sirainen <tss@iki.fi>
parents: 19078
diff changeset
369 } else {
21842
86e52ff70044 director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21443
diff changeset
370 mail_host_set_down(host, down, ioloop_time, "doveadm: ");
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
371 director_update_host(conn->dir, conn->dir->self_host,
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
372 NULL, host);
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
373 }
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
374 o_stream_nsend(conn->output, "OK\n", 3);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
375 return DOVEADM_DIRECTOR_CMD_RET_OK;
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
376 }
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
377
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
378 static enum doveadm_director_cmd_ret
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
379 doveadm_cmd_host_up(struct doveadm_connection *conn,
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
380 const char *const *args)
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
381 {
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
382 return doveadm_cmd_host_updown(conn, FALSE, args);
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
383 }
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
384
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
385 static enum doveadm_director_cmd_ret
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
386 doveadm_cmd_host_down(struct doveadm_connection *conn,
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
387 const char *const *args)
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
388 {
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
389 return doveadm_cmd_host_updown(conn, TRUE, args);
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
390 }
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
391
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
392 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
393 doveadm_cmd_host_remove(struct doveadm_connection *conn,
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
394 const char *const *args)
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 struct mail_host *host;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 struct ip_addr ip;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
399 if (args[0] == NULL || net_addr2ip(args[0], &ip) < 0) {
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
400 i_error("doveadm sent invalid HOST-REMOVE parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
401 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 }
11352
19336bddada2 director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents: 11351
diff changeset
403 host = mail_host_lookup(conn->dir->mail_hosts, &ip);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 if (host == NULL)
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
405 o_stream_nsend_str(conn->output, "NOTFOUND\n");
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 else {
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
407 director_remove_host(conn->dir, conn->dir->self_host,
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
408 NULL, host);
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
409 o_stream_nsend(conn->output, "OK\n", 3);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 }
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
411 return DOVEADM_DIRECTOR_CMD_RET_OK;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
414 static void
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
415 doveadm_cmd_host_flush_all(struct doveadm_connection *conn)
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
416 {
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
417 struct mail_host *const *hostp;
17725
bd381e882485 director: Log a warning when using "director host flush" for all hosts.
Timo Sirainen <tss@iki.fi>
parents: 17418
diff changeset
418 unsigned int total_user_count = 0;
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
419
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
420 array_foreach(mail_hosts_get(conn->dir->mail_hosts), hostp) {
17725
bd381e882485 director: Log a warning when using "director host flush" for all hosts.
Timo Sirainen <tss@iki.fi>
parents: 17418
diff changeset
421 total_user_count += (*hostp)->user_count;
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
422 director_flush_host(conn->dir, conn->dir->self_host,
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
423 NULL, *hostp);
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
424 }
17725
bd381e882485 director: Log a warning when using "director host flush" for all hosts.
Timo Sirainen <tss@iki.fi>
parents: 17418
diff changeset
425 i_warning("Flushed all backend hosts with %u users. This is an unsafe "
bd381e882485 director: Log a warning when using "director host flush" for all hosts.
Timo Sirainen <tss@iki.fi>
parents: 17418
diff changeset
426 "operation and may cause the same users to end up in multiple backends.",
bd381e882485 director: Log a warning when using "director host flush" for all hosts.
Timo Sirainen <tss@iki.fi>
parents: 17418
diff changeset
427 total_user_count);
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
428 o_stream_nsend(conn->output, "OK\n", 3);
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
429 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
430
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
431 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
432 doveadm_cmd_host_flush(struct doveadm_connection *conn, const char *const *args)
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
433 {
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
434 struct mail_host *host;
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
435 struct ip_addr ip;
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
436
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
437 if (args[0] == NULL || args[0][0] == '\0') {
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
438 doveadm_cmd_host_flush_all(conn);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
439 return DOVEADM_DIRECTOR_CMD_RET_OK;
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
440 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
441
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
442 if (net_addr2ip(args[0], &ip) < 0) {
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
443 i_error("doveadm sent invalid HOST-FLUSH parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
444 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
445 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
446 host = mail_host_lookup(conn->dir->mail_hosts, &ip);
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
447 if (host == NULL)
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
448 o_stream_nsend_str(conn->output, "NOTFOUND\n");
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
449 else {
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
450 director_flush_host(conn->dir, conn->dir->self_host,
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
451 NULL, host);
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
452 o_stream_nsend(conn->output, "OK\n", 3);
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
453 }
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
454 return DOVEADM_DIRECTOR_CMD_RET_OK;
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
455 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
456
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
457 static void doveadm_reset_cmd_free(struct director_reset_cmd *cmd)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
458 {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
459 DLLIST_REMOVE(&reset_cmds, cmd);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
460
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
461 if (cmd->iter != NULL)
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
462 director_iterate_users_deinit(&cmd->iter);
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
463 if (cmd->_conn != NULL)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
464 cmd->_conn->reset_cmd = NULL;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
465 i_free(cmd);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
466 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
467
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
468 static bool
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
469 director_host_reset_users(struct director_reset_cmd *cmd,
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
470 struct mail_host *host)
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
471 {
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
472 struct director *dir = cmd->dir;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
473 struct user *user;
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
474 struct mail_host *new_host;
22506
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
475 bool users_killed = FALSE;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
476
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
477 if (dir->users_moving_count >= cmd->max_moving_users)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
478 return FALSE;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
479
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
480 if (dir->right != NULL)
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
481 director_connection_cork(dir->right);
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
482
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
483 if (cmd->iter == NULL)
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
484 cmd->iter = director_iterate_users_init(dir);
21079
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
485
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
486 while ((user = director_iterate_users_next(cmd->iter)) != NULL) {
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
487 if (user->host != host)
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
488 continue;
22506
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
489
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
490 new_host = mail_host_get_by_hash(dir->mail_hosts,
19408
7e47f561ad49 director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents: 19407
diff changeset
491 user->username_hash,
7e47f561ad49 director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents: 19407
diff changeset
492 mail_host_get_tag(host));
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
493 if (new_host != host) T_BEGIN {
22506
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
494 if (new_host != NULL) {
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
495 director_move_user(dir, dir->self_host, NULL,
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
496 user->username_hash, new_host);
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
497 } else {
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
498 /* there are no more available backends.
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
499 kick the user instead. */
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
500 director_kill_user(dir, dir->self_host, user,
22510
3c4348ffe0d6 director: Fix flush to kick the user also when all backends are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22506
diff changeset
501 user->host->tag, user->host,
3c4348ffe0d6 director: Fix flush to kick the user also when all backends are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22506
diff changeset
502 TRUE);
22506
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
503 users_killed = TRUE;
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
504 }
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
505 } T_END;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
506 if (dir->users_moving_count >= cmd->max_moving_users)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
507 break;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
508 }
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
509 if (user == NULL)
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
510 director_iterate_users_deinit(&cmd->iter);
22506
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
511 if (users_killed) {
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
512 /* no more backends. we already sent kills. now remove the
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
513 users entirely from the host. */
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
514 director_flush_host(dir, dir->self_host, NULL, host);
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
515 }
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
516 if (dir->right != NULL)
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
517 director_connection_uncork(dir->right);
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
518 return user == NULL;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
519 }
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
520
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
521 static bool
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
522 director_reset_cmd_run(struct director_reset_cmd *cmd)
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
523 {
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
524 struct mail_host *const *hosts;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
525 unsigned int count;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
526
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
527 hosts = array_get(mail_hosts_get(cmd->dir->mail_hosts), &count);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
528 if (count > cmd->hosts_count)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
529 count = cmd->hosts_count;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
530 while (cmd->host_idx < count) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
531 if (!director_host_reset_users(cmd, hosts[cmd->host_idx]))
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
532 return FALSE;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
533 cmd->host_idx++;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
534 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
535 if (cmd->_conn != NULL) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
536 struct doveadm_connection *conn = cmd->_conn;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
537
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
538 o_stream_nsend(conn->output, "OK\n", 3);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
539 if (conn->io == NULL)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
540 doveadm_connection_set_io(conn);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
541 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
542 doveadm_reset_cmd_free(cmd);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
543 return TRUE;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
544 }
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
545
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
546 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
547 doveadm_cmd_host_reset_users(struct doveadm_connection *conn,
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
548 const char *const *args)
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
549 {
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
550 struct director_reset_cmd *cmd;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
551 struct ip_addr ip;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
552 struct mail_host *const *hosts;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
553 unsigned int i = 0, count;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
554 unsigned int max_moving_users = DEFAULT_MAX_MOVING_USERS;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
555
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
556 if (args[0] != NULL && args[1] != NULL &&
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
557 str_to_uint(args[1], &max_moving_users) < 0) {
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
558 i_error("doveadm sent invalid HOST-RESET-USERS parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
559 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
560 }
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
561
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
562 hosts = array_get(mail_hosts_get(conn->dir->mail_hosts), &count);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
563 if (args[0] != NULL && args[0][0] != '\0') {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
564 if (net_addr2ip(args[0], &ip) < 0) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
565 i_error("doveadm sent invalid HOST-RESET-USERS ip: %s",
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
566 args[0]);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
567 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
568 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
569
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
570 for (i = 0; i < count; i++) {
20984
d3f2fc420d2b director: Fix HOST-RESET-USERS with host parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20976
diff changeset
571 if (net_ip_compare(&hosts[i]->ip, &ip))
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
572 break;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
573 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
574 if (i == count) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
575 o_stream_nsend_str(conn->output, "NOTFOUND\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
576 return DOVEADM_DIRECTOR_CMD_RET_OK;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
577 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
578 count = i+1;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
579 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
580
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
581 conn->reset_cmd = cmd = i_new(struct director_reset_cmd, 1);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
582 cmd->dir = conn->dir;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
583 cmd->_conn = conn;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
584 cmd->max_moving_users = max_moving_users;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
585 cmd->host_idx = i;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
586 cmd->hosts_count = count;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
587 DLLIST_PREPEND(&reset_cmds, cmd);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
588
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
589 if (!director_reset_cmd_run(cmd)) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
590 /* we still have work to do. don't handle any more doveadm
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
591 input until we're finished. */
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
592 io_remove(&conn->io);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
593 return DOVEADM_DIRECTOR_CMD_RET_UNFINISHED;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
594 }
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
595 return DOVEADM_DIRECTOR_CMD_RET_OK;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
596 }
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
597
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
598 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
599 doveadm_cmd_user_lookup(struct doveadm_connection *conn,
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
600 const char *const *args)
11351
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
601 {
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
602 struct user *user;
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
603 struct mail_host *host;
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
604 const char *username, *tag;
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
605 unsigned int username_hash;
21079
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
606 struct mail_tag *mail_tag;
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
607 string_t *str = t_str_new(256);
11351
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
608
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
609 if (args[0] == NULL) {
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
610 username = "";
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
611 tag = "";
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
612 } else {
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
613 username = args[0];
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
614 tag = args[1] != NULL ? args[1] : "";
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
615 }
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
616 if (str_to_uint(username, &username_hash) < 0)
21076
ef9d8f4c6c67 director: Code cleanup - moved username_hash generation to director.h
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21075
diff changeset
617 username_hash = director_get_username_hash(conn->dir, username);
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
618
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
619 /* get user's current host */
21079
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
620 mail_tag = mail_tag_find(conn->dir->mail_hosts, tag);
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
621 user = mail_tag == NULL ? NULL :
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
622 user_directory_lookup(mail_tag->users, username_hash);
11351
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
623 if (user == NULL)
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
624 str_append(str, "\t0");
11351
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
625 else {
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
626 str_printfa(str, "%s\t%u", net_ip2addr(&user->host->ip),
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
627 user->timestamp +
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
628 conn->dir->set->director_user_expire);
11351
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
629 }
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
630
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
631 /* get host if it wasn't in user directory */
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
632 host = mail_host_get_by_hash(conn->dir->mail_hosts, username_hash, tag);
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
633 if (host == NULL)
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
634 str_append(str, "\t");
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
635 else
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
636 str_printfa(str, "\t%s", net_ip2addr(&host->ip));
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
637
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
638 /* get host with default configuration */
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
639 host = mail_host_get_by_hash(conn->dir->orig_config_hosts,
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
640 username_hash, tag);
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
641 if (host == NULL)
19437
ac30316bed82 director: Fixed "doveadm director status user@domain" not to hang due to missing LF.
Timo Sirainen <tss@iki.fi>
parents: 19408
diff changeset
642 str_append(str, "\t\n");
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
643 else
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
644 str_printfa(str, "\t%s\n", net_ip2addr(&host->ip));
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
645 o_stream_nsend(conn->output, str_data(str), str_len(str));
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
646 return DOVEADM_DIRECTOR_CMD_RET_OK;
11351
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
647 }
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
648
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
649 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
650 doveadm_cmd_user_list(struct doveadm_connection *conn, const char *const *args)
11823
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
651 {
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
652 struct director_user_iter *iter;
11823
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
653 struct user *user;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
654 struct ip_addr ip;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
655
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
656 if (args[0] != NULL && args[0][0] != '\0') {
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
657 if (net_addr2ip(args[0], &ip) < 0) {
11823
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
658 i_error("doveadm sent invalid USER-LIST parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
659 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
11823
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
660 }
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
661 } else {
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
662 ip.family = 0;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
663 }
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
664
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
665 iter = director_iterate_users_init(conn->dir);
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
666 while ((user = director_iterate_users_next(iter)) != NULL) {
11823
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
667 if (ip.family == 0 ||
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
668 net_ip_compare(&ip, &user->host->ip)) T_BEGIN {
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
669 unsigned int expire_time = user->timestamp +
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
670 conn->dir->set->director_user_expire;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
671
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
672 o_stream_nsend_str(conn->output, t_strdup_printf(
11823
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
673 "%u\t%u\t%s\n",
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
674 user->username_hash, expire_time,
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
675 net_ip2addr(&user->host->ip)));
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
676 } T_END;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
677 }
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
678 director_iterate_users_deinit(&iter);
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
679 o_stream_nsend(conn->output, "\n", 1);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
680 return DOVEADM_DIRECTOR_CMD_RET_OK;
11823
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
681 }
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
682
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
683 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
684 doveadm_cmd_user_move(struct doveadm_connection *conn, const char *const *args)
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
685 {
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
686 unsigned int username_hash;
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
687 struct user *user;
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
688 struct mail_host *host;
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
689 struct ip_addr ip;
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
690
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
691 if (args[0] == NULL || args[1] == NULL ||
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
692 net_addr2ip(args[1], &ip) < 0) {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
693 i_error("doveadm sent invalid USER-MOVE parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
694 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
695 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
696 host = mail_host_lookup(conn->dir->mail_hosts, &ip);
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
697 if (host == NULL) {
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
698 o_stream_nsend_str(conn->output, "NOTFOUND\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
699 return DOVEADM_DIRECTOR_CMD_RET_OK;
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
700 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
701
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
702 if (str_to_uint(args[0], &username_hash) < 0)
21076
ef9d8f4c6c67 director: Code cleanup - moved username_hash generation to director.h
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21075
diff changeset
703 username_hash = director_get_username_hash(conn->dir, args[0]);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
704
21079
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
705 user = user_directory_lookup(host->tag->users, username_hash);
20986
410eacd7ad40 director: Code cleanup - added USER_IS_BEING_KILLED() macro
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20984
diff changeset
706 if (user != NULL && USER_IS_BEING_KILLED(user)) {
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
707 o_stream_nsend_str(conn->output, "TRYAGAIN\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
708 return DOVEADM_DIRECTOR_CMD_RET_OK;
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
709 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
710
21432
14e13ad7efde director: Ignore doveadm user move if host is already the same.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
711 if (user == NULL || user->host != host) {
14e13ad7efde director: Ignore doveadm user move if host is already the same.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
712 director_move_user(conn->dir, conn->dir->self_host, NULL,
14e13ad7efde director: Ignore doveadm user move if host is already the same.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
713 username_hash, host);
21443
2b9164c4299a director: "doveadm director move" to same host now refreshes user's timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21432
diff changeset
714 } else {
2b9164c4299a director: "doveadm director move" to same host now refreshes user's timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21432
diff changeset
715 /* already the correct host. reset the user's timeout. */
2b9164c4299a director: "doveadm director move" to same host now refreshes user's timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21432
diff changeset
716 user_directory_refresh(host->tag->users, user);
2b9164c4299a director: "doveadm director move" to same host now refreshes user's timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21432
diff changeset
717 director_update_user(conn->dir, conn->dir->self_host, user);
21432
14e13ad7efde director: Ignore doveadm user move if host is already the same.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
718 }
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
719 o_stream_nsend(conn->output, "OK\n", 3);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
720 return DOVEADM_DIRECTOR_CMD_RET_OK;
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
721 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
722
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
723 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
724 doveadm_cmd_user_kick(struct doveadm_connection *conn, const char *const *args)
17418
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
725 {
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
726 if (args[0] == NULL) {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
727 i_error("doveadm sent invalid USER-KICK parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
728 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
17418
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
729 }
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
730
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
731 director_kick_user(conn->dir, conn->dir->self_host, NULL, args[0]);
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
732 o_stream_nsend(conn->output, "OK\n", 3);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
733 return DOVEADM_DIRECTOR_CMD_RET_OK;
17418
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
734 }
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
735
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
736 static enum doveadm_director_cmd_ret
21312
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
737 doveadm_cmd_user_kick_alt(struct doveadm_connection *conn, const char *const *args)
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
738 {
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
739 if (str_array_length(args) < 2) {
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
740 i_error("doveadm sent invalid USER-KICK-ALT parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
741 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
21312
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
742 }
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
743
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
744 director_kick_user_alt(conn->dir, conn->dir->self_host, NULL,
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
745 args[0], args[1]);
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
746 o_stream_nsend(conn->output, "OK\n", 3);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
747 return DOVEADM_DIRECTOR_CMD_RET_OK;
21312
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
748 }
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
749
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
750 struct {
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
751 const char *name;
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
752 enum doveadm_director_cmd_ret (*cmd)
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
753 (struct doveadm_connection *conn, const char *const *args);
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
754 } doveadm_director_commands[] = {
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
755 { "HOST-LIST", doveadm_cmd_host_list },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
756 { "HOST-LIST-REMOVED", doveadm_cmd_host_list_removed },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
757 { "DIRECTOR-LIST", doveadm_cmd_director_list },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
758 { "DIRECTOR-ADD", doveadm_cmd_director_add },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
759 { "DIRECTOR-REMOVE", doveadm_cmd_director_remove },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
760 { "HOST-SET", doveadm_cmd_host_set },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
761 { "HOST-UPDATE", doveadm_cmd_host_update },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
762 { "HOST-UP", doveadm_cmd_host_up },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
763 { "HOST-DOWN", doveadm_cmd_host_down },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
764 { "HOST-REMOVE", doveadm_cmd_host_remove },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
765 { "HOST-FLUSH", doveadm_cmd_host_flush },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
766 { "HOST-RESET-USERS", doveadm_cmd_host_reset_users },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
767 { "USER-LOOKUP", doveadm_cmd_user_lookup },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
768 { "USER-LIST", doveadm_cmd_user_list },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
769 { "USER-MOVE", doveadm_cmd_user_move },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
770 { "USER-KICK", doveadm_cmd_user_kick },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
771 { "USER-KICK-ALT", doveadm_cmd_user_kick_alt },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
772 };
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
773
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
774 static enum doveadm_director_cmd_ret
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
775 doveadm_connection_cmd(struct doveadm_connection *conn, const char *line)
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
776 {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
777 const char *cmd, *const *args;
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
778
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
779 args = t_strsplit_tabescaped(line);
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
780 if (args[0] == NULL) {
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
781 i_error("doveadm sent empty command line");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
782 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
783 }
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
784 cmd = args[0];
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
785 args++;
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
786
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
787 for (unsigned int i = 0; i < N_ELEMENTS(doveadm_director_commands); i++) {
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
788 if (strcmp(doveadm_director_commands[i].name, cmd) == 0)
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
789 return doveadm_director_commands[i].cmd(conn, args);
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
790 }
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
791 i_error("doveadm sent unknown command: %s", line);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
792 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
793 }
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
794
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
795 static void doveadm_connection_input(struct doveadm_connection *conn)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
796 {
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
797 const char *line;
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
798 enum doveadm_director_cmd_ret ret = DOVEADM_DIRECTOR_CMD_RET_OK;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
799
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
800 if (!conn->handshaked) {
11894
06a7435b6f53 director: If doveadm connection disconnects before handshake, don't loop forever.
Timo Sirainen <tss@iki.fi>
parents: 11823
diff changeset
801 if ((line = i_stream_read_next_line(conn->input)) == NULL) {
06a7435b6f53 director: If doveadm connection disconnects before handshake, don't loop forever.
Timo Sirainen <tss@iki.fi>
parents: 11823
diff changeset
802 if (conn->input->eof || conn->input->stream_errno != 0)
06a7435b6f53 director: If doveadm connection disconnects before handshake, don't loop forever.
Timo Sirainen <tss@iki.fi>
parents: 11823
diff changeset
803 doveadm_connection_deinit(&conn);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
804 return;
11894
06a7435b6f53 director: If doveadm connection disconnects before handshake, don't loop forever.
Timo Sirainen <tss@iki.fi>
parents: 11823
diff changeset
805 }
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
806
11458
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11373
diff changeset
807 if (!version_string_verify(line, "director-doveadm",
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11373
diff changeset
808 DOVEADM_PROTOCOL_VERSION_MAJOR)) {
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
809 i_error("doveadm not compatible with this server "
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
810 "(mixed old and new binaries?)");
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
811 doveadm_connection_deinit(&conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
812 return;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
813 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
814 conn->handshaked = TRUE;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
815 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
816
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
817 while ((line = i_stream_read_next_line(conn->input)) != NULL &&
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
818 ret == DOVEADM_DIRECTOR_CMD_RET_OK) {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
819 T_BEGIN {
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
820 ret = doveadm_connection_cmd(conn, line);
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
821 } T_END;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
822 }
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
823 if (conn->input->eof || conn->input->stream_errno != 0 ||
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
824 ret == DOVEADM_DIRECTOR_CMD_RET_FAIL)
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
825 doveadm_connection_deinit(&conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
826 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
827
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
828 static void doveadm_connection_set_io(struct doveadm_connection *conn)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
829 {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
830 conn->io = io_add(conn->fd, IO_READ, doveadm_connection_input, conn);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
831 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
832
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
833 struct doveadm_connection *
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
834 doveadm_connection_init(struct director *dir, int fd)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
835 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
836 struct doveadm_connection *conn;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
837
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
838 conn = i_new(struct doveadm_connection, 1);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
839 conn->fd = fd;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
840 conn->dir = dir;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
841 conn->input = i_stream_create_fd(conn->fd, 1024, FALSE);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
842 conn->output = o_stream_create_fd(conn->fd, (size_t)-1, FALSE);
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
843 o_stream_set_no_error_handling(conn->output, TRUE);
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
844 doveadm_connection_set_io(conn);
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
845 o_stream_nsend_str(conn->output, DOVEADM_HANDSHAKE);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
846
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
847 DLLIST_PREPEND(&doveadm_connections, conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
848 return conn;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
849 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
850
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
851 static void doveadm_connection_deinit(struct doveadm_connection **_conn)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
852 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
853 struct doveadm_connection *conn = *_conn;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
854
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
855 *_conn = NULL;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
856
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
857 if (conn->reset_cmd != NULL) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
858 /* finish the move even if doveadm disconnected */
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
859 conn->reset_cmd->_conn = NULL;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
860 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
861
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
862 DLLIST_REMOVE(&doveadm_connections, conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
863 io_remove(&conn->io);
11322
12316378922e director: Memory leak fix.
Timo Sirainen <tss@iki.fi>
parents: 11321
diff changeset
864 i_stream_unref(&conn->input);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
865 o_stream_unref(&conn->output);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
866 if (close(conn->fd) < 0)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
867 i_error("close(doveadm connection) failed: %m");
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
868 i_free(conn);
11373
26cfc1c3a4b1 director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents: 11355
diff changeset
869
26cfc1c3a4b1 director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents: 11355
diff changeset
870 master_service_client_connection_destroyed(master_service);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
871 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
872
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
873 void doveadm_connections_deinit(void)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
874 {
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
875 while (reset_cmds != NULL)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
876 doveadm_reset_cmd_free(reset_cmds);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
877 while (doveadm_connections != NULL) {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
878 struct doveadm_connection *conn = doveadm_connections;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
879
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
880 doveadm_connection_deinit(&conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
881 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
882 }
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
883
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
884 void doveadm_connections_continue_reset_cmds(void)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
885 {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
886 while (reset_cmds != NULL) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
887 if (!director_reset_cmd_run(reset_cmds))
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
888 break;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
889 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
890 }