Mercurial > dovecot > core-2.2
annotate src/director/doveadm-connection.c @ 23017:c1d36f2575c7 default tip
lib-imap: Fix "Don't accept strings with NULs" cherry-pick
author | Timo Sirainen <timo.sirainen@open-xchange.com> |
---|---|
date | Thu, 29 Aug 2019 09:55:25 +0300 |
parents | cb108f786fb4 |
children |
rev | line source |
---|---|
22713
cb108f786fb4
Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22687
diff
changeset
|
1 /* Copyright (c) 2010-2018 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" |
22652
09523ad05bef
director: Log whenever HOST-RESET-USERS is used
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
12 #include "time-util.h" |
11373
26cfc1c3a4b1
director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents:
11355
diff
changeset
|
13 #include "master-service.h" |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include "user-directory.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include "mail-host.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 #include "director.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 #include "director-host.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 #include "director-request.h" |
13320
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
19 #include "director-connection.h" |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 #include "doveadm-connection.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 #include <unistd.h> |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
11458
4274d1549fa0
Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents:
11373
diff
changeset
|
24 #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
|
25 #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
|
26 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 #define MAX_VALID_VHOST_COUNT 1000 |
22661
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
28 |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
29 #define DOVEADM_CONNECTION_RING_SYNC_TIMEOUT_MSECS (30*1000) |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
30 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
31 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
|
32 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
|
33 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
|
34 DOVEADM_DIRECTOR_CMD_RET_OK = 1, |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
35 DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK, |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
36 }; |
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
37 |
22537
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
38 enum doveadm_director_cmd_flag { |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
39 DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC = 0x01, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
40 }; |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
41 |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
42 typedef void |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
43 doveadm_connection_ring_sync_callback_t(struct doveadm_connection *); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
44 |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
45 struct director_reset_cmd { |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
46 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
|
47 |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
48 struct director *dir; |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
49 struct doveadm_connection *_conn; |
22652
09523ad05bef
director: Log whenever HOST-RESET-USERS is used
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
50 struct timeval start_time; |
09523ad05bef
director: Log whenever HOST-RESET-USERS is used
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
51 |
21075
6a363cb51d7f
director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21074
diff
changeset
|
52 struct director_user_iter *iter; |
22652
09523ad05bef
director: Log whenever HOST-RESET-USERS is used
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
53 unsigned int host_start_idx, host_idx, hosts_count; |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
54 unsigned int max_moving_users; |
22652
09523ad05bef
director: Log whenever HOST-RESET-USERS is used
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
55 unsigned int reset_count; |
22552
7b8e95de2bff
director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22537
diff
changeset
|
56 bool users_killed; |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
57 }; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 |
22661
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
59 struct director_kick_cmd { |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
60 struct director_kick_cmd *prev, *next; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
61 |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
62 struct doveadm_connection *_conn; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
63 struct director *dir; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
64 char *mask, *field, *value; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
65 bool alt:1; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
66 }; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
67 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 struct doveadm_connection { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 struct doveadm_connection *prev, *next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 int fd; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 struct io *io; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 struct istream *input; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 struct ostream *output; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 struct director *dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
77 struct timeout *to_ring_sync_abort; |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
78 struct director_reset_cmd *reset_cmd; |
22661
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
79 struct director_kick_cmd *kick_cmd; |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
80 doveadm_connection_ring_sync_callback_t *ring_sync_callback; |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
81 |
22537
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
82 const char **cmd_pending_args; |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
83 unsigned int cmd_pending_idx; |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
84 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 unsigned int handshaked:1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 }; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 static struct doveadm_connection *doveadm_connections; |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
89 static struct doveadm_connection *doveadm_ring_sync_pending_connections; |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
90 static struct director_reset_cmd *reset_cmds = NULL; |
22661
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
91 static struct director_kick_cmd *kick_cmds = NULL; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
93 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
|
94 static void doveadm_connection_deinit(struct doveadm_connection **_conn); |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
95 static void |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
96 doveadm_connection_ring_sync_list_move(struct doveadm_connection *conn); |
22537
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
97 static void doveadm_connection_cmd_run_synced(struct doveadm_connection *conn); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
99 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
|
100 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
|
101 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
|
102 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 struct mail_host *const *hostp; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 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
|
105 |
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
|
106 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
|
107 str_printfa(str, "%s\t%u\t%u\t", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22631
diff
changeset
|
108 (*hostp)->ip_str, (*hostp)->vhost_count, |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 (*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
|
110 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
|
111 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
|
112 (long)(*hostp)->last_updown_change); |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
113 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
|
114 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 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
|
116 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
|
117 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
|
118 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
120 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
|
121 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
|
122 const char *const *args ATTR_UNUSED) |
12986
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
123 { |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
124 struct mail_host_list *orig_hosts_list; |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
125 struct mail_host *const *orig_hosts, *const *cur_hosts; |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
126 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
|
127 string_t *str = t_str_new(1024); |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
128 int ret; |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
129 |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21076
diff
changeset
|
130 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
|
131 conn->dir->set->director_consistent_hashing, |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21076
diff
changeset
|
132 NULL); |
12986
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
133 (void)mail_hosts_parse_and_add(orig_hosts_list, |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
134 conn->dir->set->director_mail_servers); |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
135 |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
136 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
|
137 &orig_hosts_count); |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
138 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
|
139 &cur_hosts_count); |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
140 |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
141 /* the hosts are sorted by IP */ |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
142 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
|
143 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
|
144 if (ret == 0) |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
145 i++, j++; |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
146 else if (ret > 0) |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
147 j++; |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
148 else { |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22631
diff
changeset
|
149 str_printfa(str, "%s\n", orig_hosts[i]->ip_str); |
12986
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
150 i++; |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
151 } |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
152 } |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
153 for (; i < orig_hosts_count; i++) |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22631
diff
changeset
|
154 str_printfa(str, "%s\n", orig_hosts[i]->ip_str); |
12986
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
155 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
|
156 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
|
157 |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
158 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
|
159 return DOVEADM_DIRECTOR_CMD_RET_OK; |
12986
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
160 } |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
161 |
22631
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
162 static void |
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
163 doveadm_director_host_append_status(const struct director_host *host, |
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
164 const char *type, string_t *str) |
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
165 { |
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
166 time_t last_failed = I_MAX(host->last_network_failure, |
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
167 host->last_protocol_failure); |
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
168 str_printfa(str, "%s\t%u\t%s\t%ld\t", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22631
diff
changeset
|
169 host->ip_str, host->port, type, |
22631
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
170 (long)last_failed); |
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
171 } |
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
172 |
18062
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
173 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
|
174 { |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
175 if (!dir->ring_handshaked) |
22681
592564b39e03
director: DIRECTOR-LIST - Add "ring " prefix to self's status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22680
diff
changeset
|
176 str_append(str, "ring handshaking"); |
18062
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
177 else if (dir->ring_synced) |
22681
592564b39e03
director: DIRECTOR-LIST - Add "ring " prefix to self's status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22680
diff
changeset
|
178 str_append(str, "ring synced"); |
18062
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
179 else { |
22681
592564b39e03
director: DIRECTOR-LIST - Add "ring " prefix to self's status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22680
diff
changeset
|
180 str_printfa(str, "ring syncing - last sync %d secs ago", |
18062
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
181 (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
|
182 } |
22630
0170e1657f4d
doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22571
diff
changeset
|
183 str_printfa(str, "\t%u", dir->last_sync_msecs); |
18062
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
184 } |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
185 |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
186 static void |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
187 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
|
188 string_t *str) |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
189 { |
22630
0170e1657f4d
doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22571
diff
changeset
|
190 struct director_connection_status status; |
0170e1657f4d
doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22571
diff
changeset
|
191 |
22680
21e9717ba702
director: DIRECTOR-LIST - Show number of USERs sent/received in "handshaking" state
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22676
diff
changeset
|
192 director_connection_get_status(conn, &status); |
21e9717ba702
director: DIRECTOR-LIST - Show number of USERs sent/received in "handshaking" state
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22676
diff
changeset
|
193 if (!director_connection_is_handshaked(conn)) { |
21e9717ba702
director: DIRECTOR-LIST - Show number of USERs sent/received in "handshaking" state
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22676
diff
changeset
|
194 str_append(str, "handshaking - "); |
21e9717ba702
director: DIRECTOR-LIST - Show number of USERs sent/received in "handshaking" state
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22676
diff
changeset
|
195 if (director_connection_is_incoming(conn)) |
21e9717ba702
director: DIRECTOR-LIST - Show number of USERs sent/received in "handshaking" state
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22676
diff
changeset
|
196 str_printfa(str, "%u USERs received", status.handshake_users_received); |
21e9717ba702
director: DIRECTOR-LIST - Show number of USERs sent/received in "handshaking" state
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22676
diff
changeset
|
197 else |
21e9717ba702
director: DIRECTOR-LIST - Show number of USERs sent/received in "handshaking" state
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22676
diff
changeset
|
198 str_printfa(str, "%u USERs sent", status.handshake_users_sent); |
21e9717ba702
director: DIRECTOR-LIST - Show number of USERs sent/received in "handshaking" state
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22676
diff
changeset
|
199 } else if (director_connection_is_synced(conn)) |
18062
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
200 str_append(str, "synced"); |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
201 else |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
202 str_append(str, "syncing"); |
22630
0170e1657f4d
doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22571
diff
changeset
|
203 |
0170e1657f4d
doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22571
diff
changeset
|
204 str_printfa(str, "\t%u\t%"PRIuUOFF_T"\t%"PRIuUOFF_T"\t%zu\t%zu\t" |
0170e1657f4d
doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22571
diff
changeset
|
205 "%ld\t%ld", status.last_ping_msecs, |
0170e1657f4d
doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22571
diff
changeset
|
206 status.bytes_read, status.bytes_sent, |
0170e1657f4d
doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22571
diff
changeset
|
207 status.bytes_buffered, status.peak_bytes_buffered, |
0170e1657f4d
doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22571
diff
changeset
|
208 (long)status.last_input.tv_sec, |
0170e1657f4d
doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22571
diff
changeset
|
209 (long)status.last_output.tv_sec); |
18062
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
210 } |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
211 |
22686
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
212 static void |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
213 doveadm_director_connection_append(struct director *dir, |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
214 struct director_connection *conn, |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
215 const struct director_host *host, |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
216 string_t *str) |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
217 { |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
218 const char *type; |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
219 |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
220 if (conn == dir->left) |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
221 type = "left"; |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
222 else if (conn == dir->right) |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
223 type = "right"; |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
224 else if (director_connection_is_incoming(conn)) |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
225 type = "in"; |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
226 else |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
227 type = "out"; |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
228 |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
229 if (host != NULL) |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
230 doveadm_director_host_append_status(host, type, str); |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
231 doveadm_director_connection_append_status(conn, str); |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
232 str_append_c(str, '\n'); |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
233 } |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
234 |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
235 static void |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
236 doveadm_director_host_append(struct director *dir, |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
237 const struct director_host *host, string_t *str) |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
238 { |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
239 const char *type; |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
240 |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
241 if (host->removed) |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
242 type = "removed"; |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
243 else if (dir->self_host == host) |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
244 type = "self"; |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
245 else |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
246 type = ""; |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
247 |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
248 doveadm_director_host_append_status(host, type, str); |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
249 if (dir->self_host == host) |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
250 doveadm_director_append_status(dir, str); |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
251 str_append_c(str, '\n'); |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
252 } |
7347dab76be0
director: DIRECTOR-LIST - Move connection/host output to their own functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22681
diff
changeset
|
253 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
254 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
|
255 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
|
256 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
|
257 { |
13320
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
258 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
|
259 struct director_host *const *hostp; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 string_t *str = t_str_new(1024); |
22631
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
261 struct director_connection *const *connp; |
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
262 ARRAY(struct director_host *) hosts; |
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
263 |
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
264 t_array_init(&hosts, array_count(&dir->dir_hosts)); |
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
265 array_append_array(&hosts, &dir->dir_hosts); |
22687
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
266 array_sort(&hosts, director_host_cmp_p); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 |
22687
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
268 /* first show incoming connections that have no known host yet */ |
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
269 array_foreach(&dir->connections, connp) { |
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
270 if (director_connection_get_host(*connp) == NULL) |
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
271 doveadm_director_connection_append(dir, *connp, NULL, str); |
22631
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
272 } |
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
273 |
22687
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
274 /* show other connections and host without connections sorted by host */ |
22631
53082f1df8a6
director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22630
diff
changeset
|
275 array_foreach(&hosts, hostp) { |
13320
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
276 const struct director_host *host = *hostp; |
22687
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
277 bool have_connections = FALSE; |
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
278 |
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
279 array_foreach(&dir->connections, connp) { |
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
280 const struct director_host *conn_host = |
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
281 director_connection_get_host(*connp); |
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
282 if (conn_host != host) |
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
283 continue; |
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
284 have_connections = TRUE; |
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
285 doveadm_director_connection_append(dir, *connp, host, str); |
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
286 } |
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
287 if (!have_connections) |
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
288 doveadm_director_host_append(dir, host, str); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 } |
22687
e024078c62c9
director: DIRECTOR-LIST - Return results sorted by host
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22686
diff
changeset
|
290 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 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
|
292 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
|
293 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
|
294 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
296 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
|
297 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
|
298 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
|
299 { |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
300 struct director_host *host; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
301 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
|
302 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
|
303 |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
304 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
|
305 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
|
306 (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
|
307 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
|
308 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
|
309 } |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
310 |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
311 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
|
312 host = director_host_add(conn->dir, &ip, port); |
22562
3af1ba6b5248
director: Log info line whenever a director is added/removed from ring
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22559
diff
changeset
|
313 director_notify_ring_added(host, conn->dir->self_host, TRUE); |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
314 } |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14571
diff
changeset
|
315 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
|
316 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
|
317 } |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
318 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
319 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
|
320 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
|
321 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
|
322 { |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
323 struct director_host *host; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
324 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
|
325 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
|
326 |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
327 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
|
328 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
|
329 (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
|
330 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
|
331 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
|
332 } |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
333 |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
334 host = port != 0 ? |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
335 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
|
336 director_host_lookup_ip(conn->dir, &ip); |
22571
4057b92ed502
director: Don't crash on doveadm director ring remove for unknown director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22569
diff
changeset
|
337 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
|
338 o_stream_nsend_str(conn->output, "NOTFOUND\n"); |
22571
4057b92ed502
director: Don't crash on doveadm director ring remove for unknown director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22569
diff
changeset
|
339 return DOVEADM_DIRECTOR_CMD_RET_OK; |
4057b92ed502
director: Don't crash on doveadm director ring remove for unknown director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22569
diff
changeset
|
340 } else { |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
341 director_ring_remove(host, conn->dir->self_host); |
22571
4057b92ed502
director: Don't crash on doveadm director ring remove for unknown director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22569
diff
changeset
|
342 return DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK; |
4057b92ed502
director: Don't crash on doveadm director ring remove for unknown director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22569
diff
changeset
|
343 } |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
344 } |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
345 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
346 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
|
347 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
|
348 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
|
349 { |
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
|
350 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
|
351 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
|
352 struct mail_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
353 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
|
354 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
|
355 |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
356 ip_str = args[0]; |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
357 if (ip_str != NULL) { |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
358 tag = strchr(ip_str, '@'); |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
359 if (tag == NULL) |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
360 tag = ""; |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
361 else |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
362 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
|
363 } |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
364 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
|
365 (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
|
366 (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
|
367 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
|
368 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
|
369 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
|
370 } |
15904
d3cf06639864
Replaced all -1U and (unsigned int)-1 with UINT_MAX.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
371 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
|
372 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
|
373 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
|
374 } |
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
|
375 host = mail_host_lookup(dir->mail_hosts, &ip); |
19078
7ac9ec913a39
doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
376 if (host == NULL) { |
7ac9ec913a39
doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
377 if (update) { |
7ac9ec913a39
doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
378 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
|
379 return DOVEADM_DIRECTOR_CMD_RET_OK; |
19078
7ac9ec913a39
doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
380 } |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
381 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
|
382 } 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
|
383 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
|
384 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
|
385 } 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
|
386 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
|
387 "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
|
388 return DOVEADM_DIRECTOR_CMD_RET_OK; |
19078
7ac9ec913a39
doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
389 } |
15904
d3cf06639864
Replaced all -1U and (unsigned int)-1 with UINT_MAX.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
390 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
|
391 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
|
392 /* 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
|
393 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
|
394 handle. */ |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
395 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
|
396 |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
397 return DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
398 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
399 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
400 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
|
401 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
|
402 { |
20970
d653bcdff8a2
director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20969
diff
changeset
|
403 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
|
404 } |
7ac9ec913a39
doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
405 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
406 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
|
407 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
|
408 { |
20970
d653bcdff8a2
director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20969
diff
changeset
|
409 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
|
410 } |
7ac9ec913a39
doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
411 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
412 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
|
413 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
|
414 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
|
415 { |
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18709
diff
changeset
|
416 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
|
417 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
|
418 |
20970
d653bcdff8a2
director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20969
diff
changeset
|
419 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
|
420 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
|
421 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
|
422 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
|
423 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
|
424 } |
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18709
diff
changeset
|
425 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
|
426 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
|
427 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
|
428 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
|
429 } |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
430 if (host->down == down) { |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
431 o_stream_nsend_str(conn->output, "OK\n"); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
432 return DOVEADM_DIRECTOR_CMD_RET_OK; |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
433 } else if (host->desynced) { |
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
|
434 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
|
435 "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
|
436 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
|
437 } else { |
21842
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21443
diff
changeset
|
438 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
|
439 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
|
440 NULL, host); |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
441 return DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK; |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18709
diff
changeset
|
442 } |
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18709
diff
changeset
|
443 } |
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18709
diff
changeset
|
444 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
445 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
|
446 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
|
447 const char *const *args) |
30549d635210
director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22510
diff
changeset
|
448 { |
30549d635210
director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22510
diff
changeset
|
449 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
|
450 } |
30549d635210
director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22510
diff
changeset
|
451 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
452 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
|
453 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
|
454 const char *const *args) |
30549d635210
director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22510
diff
changeset
|
455 { |
30549d635210
director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22510
diff
changeset
|
456 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
|
457 } |
30549d635210
director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22510
diff
changeset
|
458 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
459 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
|
460 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
|
461 const char *const *args) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
462 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
463 struct mail_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
464 struct ip_addr ip; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
465 |
20970
d653bcdff8a2
director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20969
diff
changeset
|
466 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
|
467 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
|
468 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
|
469 } |
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
|
470 host = mail_host_lookup(conn->dir->mail_hosts, &ip); |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
471 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
|
472 o_stream_nsend_str(conn->output, "NOTFOUND\n"); |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
473 return DOVEADM_DIRECTOR_CMD_RET_OK; |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
474 } else { |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
475 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
|
476 NULL, host); |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
477 return DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
478 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
479 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
480 |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
481 static void |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
482 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
|
483 { |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
484 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
|
485 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
|
486 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
487 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
|
488 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
|
489 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
|
490 NULL, *hostp); |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
491 } |
17725
bd381e882485
director: Log a warning when using "director host flush" for all hosts.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
492 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
|
493 "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
|
494 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
|
495 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
|
496 } |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
497 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
498 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
|
499 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
|
500 { |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
501 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
|
502 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
|
503 |
20970
d653bcdff8a2
director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20969
diff
changeset
|
504 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
|
505 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
|
506 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
|
507 } |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
508 |
20970
d653bcdff8a2
director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20969
diff
changeset
|
509 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
|
510 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
|
511 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
|
512 } |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
513 host = mail_host_lookup(conn->dir->mail_hosts, &ip); |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
514 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
|
515 o_stream_nsend_str(conn->output, "NOTFOUND\n"); |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
516 return DOVEADM_DIRECTOR_CMD_RET_OK; |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
517 } else { |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
518 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
|
519 NULL, host); |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
520 return DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK; |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
521 } |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
522 } |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
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 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
|
525 { |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
526 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
|
527 |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
528 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
|
529 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
|
530 if (cmd->_conn != NULL) |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
531 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
|
532 i_free(cmd); |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
533 } |
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 static bool |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
536 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
|
537 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
|
538 { |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
539 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
|
540 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
|
541 struct mail_host *new_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
|
542 |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
543 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
|
544 return FALSE; |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
545 |
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
|
546 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
|
547 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
|
548 |
22552
7b8e95de2bff
director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22537
diff
changeset
|
549 if (cmd->iter == NULL) { |
22676
c9549bea9106
director: Don't send USERs in handshake that were already sent between handshake
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22662
diff
changeset
|
550 cmd->iter = director_iterate_users_init(dir, FALSE); |
22552
7b8e95de2bff
director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22537
diff
changeset
|
551 cmd->users_killed = FALSE; |
7b8e95de2bff
director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22537
diff
changeset
|
552 } |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21076
diff
changeset
|
553 |
21075
6a363cb51d7f
director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21074
diff
changeset
|
554 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
|
555 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
|
556 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
|
557 |
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 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
|
559 user->username_hash, |
7e47f561ad49
director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents:
19407
diff
changeset
|
560 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
|
561 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
|
562 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
|
563 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
|
564 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
|
565 } else { |
3afbfedcdd31
director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
566 /* 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
|
567 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
|
568 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
|
569 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
|
570 TRUE); |
22552
7b8e95de2bff
director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22537
diff
changeset
|
571 cmd->users_killed = 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
|
572 } |
22652
09523ad05bef
director: Log whenever HOST-RESET-USERS is used
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
573 cmd->reset_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
|
574 } T_END; |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
575 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
|
576 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
|
577 } |
22552
7b8e95de2bff
director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22537
diff
changeset
|
578 if (user == NULL) { |
22652
09523ad05bef
director: Log whenever HOST-RESET-USERS is used
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
579 int msecs = timeval_diff_msecs(&ioloop_timeval, &cmd->start_time); |
09523ad05bef
director: Log whenever HOST-RESET-USERS is used
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
580 i_info("Moved %u users in %u hosts in %u.%03u secs (max parallel=%u)", |
09523ad05bef
director: Log whenever HOST-RESET-USERS is used
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
581 cmd->reset_count, cmd->hosts_count - cmd->host_start_idx, |
09523ad05bef
director: Log whenever HOST-RESET-USERS is used
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
582 msecs / 1000, msecs % 1000, cmd->max_moving_users); |
21075
6a363cb51d7f
director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21074
diff
changeset
|
583 director_iterate_users_deinit(&cmd->iter); |
22552
7b8e95de2bff
director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22537
diff
changeset
|
584 if (cmd->users_killed) { |
7b8e95de2bff
director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22537
diff
changeset
|
585 /* no more backends. we already sent kills. now remove |
7b8e95de2bff
director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22537
diff
changeset
|
586 the users entirely from the host. */ |
7b8e95de2bff
director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22537
diff
changeset
|
587 director_flush_host(dir, dir->self_host, NULL, host); |
7b8e95de2bff
director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22537
diff
changeset
|
588 } |
22506
3afbfedcdd31
director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
589 } |
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
|
590 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
|
591 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
|
592 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
|
593 } |
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 |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
595 static bool |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
596 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
|
597 { |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
598 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
|
599 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
|
600 |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
601 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
|
602 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
|
603 count = cmd->hosts_count; |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
604 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
|
605 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
|
606 return FALSE; |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
607 cmd->host_idx++; |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
608 } |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
609 if (cmd->_conn != NULL) { |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
610 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
|
611 |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
612 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
|
613 if (conn->io == NULL) |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
614 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
|
615 } |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
616 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
|
617 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
|
618 } |
618c8d76bc5d
director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents:
18541
diff
changeset
|
619 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
620 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
|
621 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
|
622 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
|
623 { |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
624 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
|
625 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
|
626 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
|
627 unsigned int i = 0, count; |
22662
7fe2a998bc1f
director: Add director_max_parallel_moves/kicks settings
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22661
diff
changeset
|
628 unsigned int max_moving_users = |
7fe2a998bc1f
director: Add director_max_parallel_moves/kicks settings
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22661
diff
changeset
|
629 conn->dir->set->director_max_parallel_moves; |
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
|
630 |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
631 if (args[0] != NULL && args[1] != NULL && |
22656
1789bf2a1e01
director: Make sure HOST-RESET-USERS isn't used with max_moving_users=0
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22652
diff
changeset
|
632 (str_to_uint(args[1], &max_moving_users) < 0 || |
1789bf2a1e01
director: Make sure HOST-RESET-USERS isn't used with max_moving_users=0
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22652
diff
changeset
|
633 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
|
634 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
|
635 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
|
636 } |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
637 |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
638 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
|
639 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
|
640 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
|
641 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
|
642 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
|
643 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
|
644 } |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
645 |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
646 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
|
647 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
|
648 break; |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
649 } |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
650 if (i == count) { |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
651 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
|
652 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
|
653 } |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
654 count = i+1; |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
655 } |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
656 |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
657 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
|
658 cmd->dir = conn->dir; |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
659 cmd->_conn = conn; |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
660 cmd->max_moving_users = max_moving_users; |
22652
09523ad05bef
director: Log whenever HOST-RESET-USERS is used
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
661 cmd->host_start_idx = i; |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
662 cmd->host_idx = i; |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
663 cmd->hosts_count = count; |
22652
09523ad05bef
director: Log whenever HOST-RESET-USERS is used
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
664 cmd->start_time = ioloop_timeval; |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
665 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
|
666 |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
667 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
|
668 /* 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
|
669 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
|
670 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
|
671 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
|
672 } |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
673 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
|
674 } |
618c8d76bc5d
director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents:
18541
diff
changeset
|
675 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
676 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
|
677 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
|
678 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
|
679 { |
c57c1ff9c5f1
doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents:
11322
diff
changeset
|
680 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
|
681 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
|
682 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
|
683 unsigned int username_hash; |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21076
diff
changeset
|
684 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
|
685 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
|
686 |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
687 if (args[0] == NULL) { |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
688 username = ""; |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
689 tag = ""; |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
690 } else { |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
691 username = args[0]; |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
692 tag = args[1] != NULL ? args[1] : ""; |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
693 } |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
694 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
|
695 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
|
696 |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
697 /* get user's current host */ |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21076
diff
changeset
|
698 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
|
699 user = mail_tag == NULL ? NULL : |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21076
diff
changeset
|
700 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
|
701 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
|
702 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
|
703 else { |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22631
diff
changeset
|
704 str_printfa(str, "%s\t%u", user->host->ip_str, |
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
|
705 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
|
706 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
|
707 } |
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
|
708 |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
709 /* 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
|
710 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
|
711 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
|
712 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
|
713 else |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22631
diff
changeset
|
714 str_printfa(str, "\t%s", host->ip_str); |
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
|
715 |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
716 /* 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
|
717 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
|
718 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
|
719 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
|
720 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
|
721 else |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22631
diff
changeset
|
722 str_printfa(str, "\t%s\n", host->ip_str); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14571
diff
changeset
|
723 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
|
724 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
|
725 } |
c57c1ff9c5f1
doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents:
11322
diff
changeset
|
726 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
727 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
|
728 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
|
729 { |
21075
6a363cb51d7f
director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21074
diff
changeset
|
730 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
|
731 struct user *user; |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
732 struct ip_addr ip; |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
733 |
20970
d653bcdff8a2
director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20969
diff
changeset
|
734 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
|
735 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
|
736 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
|
737 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
|
738 } |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
739 } else { |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
740 ip.family = 0; |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
741 } |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
742 |
22676
c9549bea9106
director: Don't send USERs in handshake that were already sent between handshake
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22662
diff
changeset
|
743 iter = director_iterate_users_init(conn->dir, FALSE); |
21075
6a363cb51d7f
director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21074
diff
changeset
|
744 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
|
745 if (ip.family == 0 || |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
746 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
|
747 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
|
748 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
|
749 |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14571
diff
changeset
|
750 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
|
751 "%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
|
752 user->username_hash, expire_time, |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22631
diff
changeset
|
753 user->host->ip_str)); |
11823
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
754 } T_END; |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
755 } |
21075
6a363cb51d7f
director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21074
diff
changeset
|
756 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
|
757 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
|
758 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
|
759 } |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
760 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
761 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
|
762 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
|
763 { |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
764 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
|
765 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
|
766 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
|
767 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
|
768 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
769 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
|
770 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
|
771 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
|
772 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
|
773 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
774 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
|
775 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
|
776 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
|
777 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
|
778 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
779 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
780 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
|
781 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
|
782 |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21076
diff
changeset
|
783 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
|
784 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
|
785 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
|
786 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
|
787 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
788 |
21432
14e13ad7efde
director: Ignore doveadm user move if host is already the same.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
789 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
|
790 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
|
791 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
|
792 } else { |
2b9164c4299a
director: "doveadm director move" to same host now refreshes user's timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21432
diff
changeset
|
793 /* 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
|
794 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
|
795 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
|
796 } |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14571
diff
changeset
|
797 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
|
798 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
|
799 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
800 |
22661
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
801 static void doveadm_kick_cmd_free(struct director_kick_cmd **_cmd) |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
802 { |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
803 struct director_kick_cmd *cmd = *_cmd; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
804 *_cmd = NULL; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
805 |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
806 if (cmd->_conn != NULL) |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
807 cmd->_conn->kick_cmd = NULL; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
808 |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
809 i_free(cmd->field); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
810 i_free(cmd->value); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
811 i_free(cmd->mask); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
812 i_free(cmd); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
813 } |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
814 |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
815 static bool doveadm_cmd_user_kick_run(struct director_kick_cmd *cmd) |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
816 { |
22662
7fe2a998bc1f
director: Add director_max_parallel_moves/kicks settings
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22661
diff
changeset
|
817 if (cmd->dir->users_kicking_count >= |
7fe2a998bc1f
director: Add director_max_parallel_moves/kicks settings
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22661
diff
changeset
|
818 cmd->dir->set->director_max_parallel_kicks) |
22661
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
819 return FALSE; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
820 |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
821 if (cmd->alt) |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
822 director_kick_user_alt(cmd->dir, cmd->dir->self_host, |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
823 NULL, cmd->field, cmd->value); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
824 else |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
825 director_kick_user(cmd->dir, cmd->dir->self_host, |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
826 NULL, cmd->mask); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
827 if (cmd->_conn != NULL) { |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
828 struct doveadm_connection *conn = cmd->_conn; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
829 |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
830 o_stream_nsend(conn->output, "OK\n", 3); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
831 if (conn->io == NULL) |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
832 doveadm_connection_set_io(conn); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
833 } |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
834 DLLIST_REMOVE(&kick_cmds, cmd); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
835 doveadm_kick_cmd_free(&cmd); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
836 return TRUE; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
837 } |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
838 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
839 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
|
840 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
|
841 { |
22661
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
842 struct director_kick_cmd *cmd; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
843 bool wait = TRUE; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
844 |
17418
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
845 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
|
846 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
|
847 return DOVEADM_DIRECTOR_CMD_RET_FAIL; |
17418
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
848 } |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
849 |
22661
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
850 if (null_strcmp(args[1], "nowait") == 0) |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
851 wait = FALSE; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
852 |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
853 cmd = conn->kick_cmd = i_new(struct director_kick_cmd, 1); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
854 cmd->alt = FALSE; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
855 cmd->mask = i_strdup(args[0]); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
856 cmd->dir = conn->dir; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
857 cmd->_conn = conn; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
858 |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
859 DLLIST_PREPEND(&kick_cmds, cmd); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
860 |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
861 if (!doveadm_cmd_user_kick_run(cmd)) { |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
862 if (wait) { |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
863 /* we have work to do, wait until it finishes */ |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
864 io_remove(&conn->io); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
865 return DOVEADM_DIRECTOR_CMD_RET_UNFINISHED; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
866 } else { |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
867 o_stream_nsend_str(conn->output, "TRYAGAIN\n"); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
868 /* need to remove it here */ |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
869 DLLIST_REMOVE(&kick_cmds, cmd); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
870 doveadm_kick_cmd_free(&cmd); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
871 } |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
872 } |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
873 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
874 return DOVEADM_DIRECTOR_CMD_RET_OK; |
17418
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
875 } |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
876 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
877 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
|
878 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
|
879 { |
22661
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
880 bool wait = TRUE; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
881 struct director_kick_cmd *cmd; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
882 |
21312
f9db0ad9001e
director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21079
diff
changeset
|
883 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
|
884 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
|
885 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
|
886 } |
f9db0ad9001e
director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21079
diff
changeset
|
887 |
22661
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
888 if (null_strcmp(args[2], "nowait") == 0) |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
889 wait = FALSE; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
890 |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
891 conn->kick_cmd = cmd = i_new(struct director_kick_cmd, 1); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
892 cmd->alt = TRUE; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
893 cmd->field = i_strdup(args[0]); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
894 cmd->value = i_strdup(args[1]); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
895 cmd->dir = conn->dir; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
896 cmd->_conn = conn; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
897 |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
898 DLLIST_PREPEND(&kick_cmds, cmd); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
899 |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
900 if (!doveadm_cmd_user_kick_run(cmd)) { |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
901 if (wait) { |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
902 /* we have work to do, wait until it finishes */ |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
903 io_remove(&conn->io); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
904 return DOVEADM_DIRECTOR_CMD_RET_UNFINISHED; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
905 } else { |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
906 o_stream_nsend_str(conn->output, "TRYAGAIN\n"); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
907 DLLIST_REMOVE(&kick_cmds, cmd); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
908 doveadm_kick_cmd_free(&cmd); |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
909 } |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
910 } |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
911 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
912 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
|
913 } |
f9db0ad9001e
director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21079
diff
changeset
|
914 |
22534
30549d635210
director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22510
diff
changeset
|
915 struct { |
30549d635210
director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22510
diff
changeset
|
916 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
|
917 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
|
918 (struct doveadm_connection *conn, const char *const *args); |
22537
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
919 enum doveadm_director_cmd_flag flags; |
22534
30549d635210
director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22510
diff
changeset
|
920 } doveadm_director_commands[] = { |
22537
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
921 { "HOST-LIST", doveadm_cmd_host_list, 0 }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
922 { "HOST-LIST-REMOVED", doveadm_cmd_host_list_removed, 0 }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
923 { "DIRECTOR-LIST", doveadm_cmd_director_list, 0 }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
924 { "DIRECTOR-ADD", doveadm_cmd_director_add, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
925 { "DIRECTOR-REMOVE", doveadm_cmd_director_remove, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
926 { "HOST-SET", doveadm_cmd_host_set, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
927 { "HOST-UPDATE", doveadm_cmd_host_update, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
928 { "HOST-UP", doveadm_cmd_host_up, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
929 { "HOST-DOWN", doveadm_cmd_host_down, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
930 { "HOST-REMOVE", doveadm_cmd_host_remove, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
931 { "HOST-FLUSH", doveadm_cmd_host_flush, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
932 { "HOST-RESET-USERS", doveadm_cmd_host_reset_users, 0 }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
933 { "USER-LOOKUP", doveadm_cmd_user_lookup, 0 }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
934 { "USER-LIST", doveadm_cmd_user_list, 0 }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
935 { "USER-MOVE", doveadm_cmd_user_move, 0 }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
936 { "USER-KICK", doveadm_cmd_user_kick, 0 }, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
937 { "USER-KICK-ALT", doveadm_cmd_user_kick_alt, 0 }, |
22534
30549d635210
director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22510
diff
changeset
|
938 }; |
30549d635210
director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22510
diff
changeset
|
939 |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
940 static void |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
941 doveadm_connection_ring_sync_timeout(struct doveadm_connection *conn) |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
942 { |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
943 doveadm_connection_ring_sync_list_move(conn); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
944 o_stream_nsend_str(conn->output, "Ring sync timed out\n"); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
945 |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
946 doveadm_connection_set_io(conn); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
947 io_set_pending(conn->io); |
22537
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
948 |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
949 i_free_and_null(conn->cmd_pending_args); |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
950 } |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
951 |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
952 static void |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
953 doveadm_connection_set_ring_sync_callback(struct doveadm_connection *conn, |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
954 doveadm_connection_ring_sync_callback_t *callback) |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
955 { |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
956 i_assert(conn->ring_sync_callback == NULL); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
957 i_assert(conn->to_ring_sync_abort == NULL); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
958 |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
959 conn->ring_sync_callback = callback; |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
960 io_remove(&conn->io); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
961 DLLIST_REMOVE(&doveadm_connections, conn); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
962 DLLIST_PREPEND(&doveadm_ring_sync_pending_connections, conn); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
963 conn->to_ring_sync_abort = |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
964 timeout_add(DOVEADM_CONNECTION_RING_SYNC_TIMEOUT_MSECS, |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
965 doveadm_connection_ring_sync_timeout, conn); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
966 } |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
967 |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
968 static void doveadm_connection_ret_ok(struct doveadm_connection *conn) |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
969 { |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
970 o_stream_nsend(conn->output, "OK\n", 3); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
971 } |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
972 |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
973 static enum doveadm_director_cmd_ret |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
974 doveadm_connection_cmd_run(struct doveadm_connection *conn, |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
975 const char *const *args, unsigned int i) |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
976 { |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
977 enum doveadm_director_cmd_ret ret; |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
978 |
22537
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
979 if ((doveadm_director_commands[i].flags & |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
980 DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC) != 0 && |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
981 !conn->dir->ring_synced) { |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
982 /* wait for ring to be synced before running the command */ |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
983 conn->cmd_pending_args = p_strarray_dup(default_pool, args); |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
984 conn->cmd_pending_idx = i; |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
985 doveadm_connection_set_ring_sync_callback(conn, |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
986 doveadm_connection_cmd_run_synced); |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
987 return DOVEADM_DIRECTOR_CMD_RET_UNFINISHED; |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
988 } |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
989 |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
990 ret = doveadm_director_commands[i].cmd(conn, args); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
991 if (ret != DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK) |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
992 return ret; |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
993 /* Delay sending OK until ring is synced. This way doveadm will know |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
994 whether the call actually succeeded or not. */ |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
995 if (conn->dir->ring_synced) { |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
996 /* director is alone */ |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
997 i_assert(conn->dir->right == NULL && conn->dir->left == NULL); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
998 o_stream_nsend(conn->output, "OK\n", 3); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
999 return DOVEADM_DIRECTOR_CMD_RET_OK; |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1000 } |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1001 doveadm_connection_set_ring_sync_callback(conn, doveadm_connection_ret_ok); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1002 return DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK; |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1003 } |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1004 |
22537
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
1005 static void doveadm_connection_cmd_run_synced(struct doveadm_connection *conn) |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
1006 { |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
1007 const char **args = conn->cmd_pending_args; |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
1008 |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
1009 conn->cmd_pending_args = NULL; |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
1010 (void)doveadm_connection_cmd_run(conn, args, conn->cmd_pending_idx); |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
1011 i_free(args); |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
1012 } |
4e3e963c32f0
director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22536
diff
changeset
|
1013 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
1014 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
|
1015 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
|
1016 { |
20970
d653bcdff8a2
director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20969
diff
changeset
|
1017 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
|
1018 |
20970
d653bcdff8a2
director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20969
diff
changeset
|
1019 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
|
1020 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
|
1021 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
|
1022 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
|
1023 } |
20970
d653bcdff8a2
director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20969
diff
changeset
|
1024 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
|
1025 args++; |
20967
1be6845a989b
director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20963
diff
changeset
|
1026 |
22534
30549d635210
director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22510
diff
changeset
|
1027 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
|
1028 if (strcmp(doveadm_director_commands[i].name, cmd) == 0) |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1029 return doveadm_connection_cmd_run(conn, args, i); |
20967
1be6845a989b
director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20963
diff
changeset
|
1030 } |
22534
30549d635210
director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22510
diff
changeset
|
1031 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
|
1032 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
|
1033 } |
1be6845a989b
director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20963
diff
changeset
|
1034 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1035 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
|
1036 { |
20967
1be6845a989b
director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20963
diff
changeset
|
1037 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
|
1038 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
|
1039 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1040 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
|
1041 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
|
1042 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
|
1043 doveadm_connection_deinit(&conn); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1044 return; |
11894
06a7435b6f53
director: If doveadm connection disconnects before handshake, don't loop forever.
Timo Sirainen <tss@iki.fi>
parents:
11823
diff
changeset
|
1045 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1046 |
11458
4274d1549fa0
Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents:
11373
diff
changeset
|
1047 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
|
1048 DOVEADM_PROTOCOL_VERSION_MAJOR)) { |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1049 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
|
1050 "(mixed old and new binaries?)"); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1051 doveadm_connection_deinit(&conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1052 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1053 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1054 conn->handshaked = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1055 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1056 |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
1057 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
|
1058 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
|
1059 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
|
1060 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
|
1061 } T_END; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1062 } |
22535
2805abc195e1
director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22534
diff
changeset
|
1063 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
|
1064 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
|
1065 doveadm_connection_deinit(&conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1066 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1067 |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
1068 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
|
1069 { |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
1070 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
|
1071 } |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
1072 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1073 struct doveadm_connection * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1074 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
|
1075 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1076 struct doveadm_connection *conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1077 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1078 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
|
1079 conn->fd = fd; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1080 conn->dir = dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1081 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
|
1082 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
|
1083 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
|
1084 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
|
1085 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
|
1086 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1087 DLLIST_PREPEND(&doveadm_connections, conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1088 return conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1089 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1090 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1091 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
|
1092 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1093 struct doveadm_connection *conn = *_conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1094 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1095 *_conn = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1096 |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1097 i_assert(conn->to_ring_sync_abort == NULL); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1098 |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
1099 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
|
1100 /* 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
|
1101 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
|
1102 } |
22661
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
1103 if (conn->kick_cmd != NULL) { |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
1104 /* finish the kick even if doveadm disconnected */ |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
1105 conn->kick_cmd->_conn = NULL; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
1106 } |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
1107 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1108 DLLIST_REMOVE(&doveadm_connections, conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1109 io_remove(&conn->io); |
11322 | 1110 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
|
1111 o_stream_unref(&conn->output); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1112 if (close(conn->fd) < 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1113 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
|
1114 i_free(conn); |
11373
26cfc1c3a4b1
director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents:
11355
diff
changeset
|
1115 |
26cfc1c3a4b1
director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents:
11355
diff
changeset
|
1116 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
|
1117 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1118 |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1119 static void |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1120 doveadm_connection_ring_sync_list_move(struct doveadm_connection *conn) |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1121 { |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1122 timeout_remove(&conn->to_ring_sync_abort); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1123 DLLIST_REMOVE(&doveadm_ring_sync_pending_connections, conn); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1124 DLLIST_PREPEND(&doveadm_connections, conn); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1125 } |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1126 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1127 void doveadm_connections_deinit(void) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1128 { |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
1129 while (reset_cmds != NULL) |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
1130 doveadm_reset_cmd_free(reset_cmds); |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1131 |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1132 unsigned int pending_count = 0; |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1133 while (doveadm_ring_sync_pending_connections != NULL) { |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1134 doveadm_connection_ring_sync_list_move(doveadm_ring_sync_pending_connections); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1135 pending_count++; |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1136 } |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1137 if (pending_count > 0) |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1138 i_warning("Shutting down while %u doveadm connections were waiting for ring sync", pending_count); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1139 while (doveadm_connections != NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1140 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
|
1141 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1142 doveadm_connection_deinit(&conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1143 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1144 } |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
1145 |
22661
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
1146 void doveadm_connections_kick_callback(struct director *dir ATTR_UNUSED) |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
1147 { |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
1148 while(kick_cmds != NULL) |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
1149 if (!doveadm_cmd_user_kick_run(kick_cmds)) |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
1150 break; |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
1151 } |
34765a426c56
director: Limit max kicking count
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22656
diff
changeset
|
1152 |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1153 static void doveadm_connections_continue_reset_cmds(void) |
20976
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
1154 { |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
1155 while (reset_cmds != NULL) { |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
1156 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
|
1157 break; |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
1158 } |
39d96d2dad95
director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20970
diff
changeset
|
1159 } |
22536
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1160 |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1161 void doveadm_connections_ring_synced(void) |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1162 { |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1163 while (doveadm_ring_sync_pending_connections != NULL) { |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1164 struct doveadm_connection *conn = |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1165 doveadm_ring_sync_pending_connections; |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1166 doveadm_connection_ring_sync_callback_t *callback = |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1167 conn->ring_sync_callback; |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1168 |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1169 conn->ring_sync_callback = NULL; |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1170 doveadm_connection_ring_sync_list_move(conn); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1171 doveadm_connection_set_io(conn); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1172 io_set_pending(conn->io); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1173 callback(conn); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1174 } |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1175 doveadm_connections_continue_reset_cmds(); |
5f09f6aa089b
director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22535
diff
changeset
|
1176 } |