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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
12316378922e director: Memory leak fix.
Timo Sirainen <tss@iki.fi>
parents: 11321
diff changeset
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 }