Mercurial > dovecot > core-2.2
annotate src/director/doveadm-connection.c @ 18062:ade6dcace5cd
doveadm director ring status shows now more information
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 12 Nov 2014 01:51:29 +0200 |
parents | bd381e882485 |
children | b9df3d654710 |
rev | line source |
---|---|
17130
add8c00fb3cc
Updated copyright notices to include year 2014.
Timo Sirainen <tss@iki.fi>
parents:
15904
diff
changeset
|
1 /* Copyright (c) 2010-2014 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" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "llist.h" |
11373
26cfc1c3a4b1
director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents:
11355
diff
changeset
|
11 #include "master-service.h" |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include "user-directory.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include "mail-host.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include "director.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include "director-host.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 #include "director-request.h" |
13320
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
17 #include "director-connection.h" |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 #include "doveadm-connection.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 #include <unistd.h> |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 |
11458
4274d1549fa0
Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents:
11373
diff
changeset
|
22 #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
|
23 #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
|
24 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 #define MAX_VALID_VHOST_COUNT 1000 |
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 struct doveadm_connection { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 struct doveadm_connection *prev, *next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 int fd; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 struct io *io; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 struct istream *input; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 struct ostream *output; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 struct director *dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 unsigned int handshaked:1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 }; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 static struct doveadm_connection *doveadm_connections; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 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
|
42 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 static void doveadm_cmd_host_list(struct doveadm_connection *conn) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 struct mail_host *const *hostp; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 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
|
47 |
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
|
48 array_foreach(mail_hosts_get(conn->dir->mail_hosts), hostp) { |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 str_printfa(str, "%s\t%u\t%u\n", |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 net_ip2addr(&(*hostp)->ip), (*hostp)->vhost_count, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 (*hostp)->user_count); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 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
|
54 o_stream_nsend(conn->output, str_data(str), str_len(str)); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 |
12986
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
57 static void doveadm_cmd_host_list_removed(struct doveadm_connection *conn) |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
58 { |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
59 struct mail_host_list *orig_hosts_list; |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
60 struct mail_host *const *orig_hosts, *const *cur_hosts; |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
61 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
|
62 string_t *str = t_str_new(1024); |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
63 int ret; |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
64 |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
65 orig_hosts_list = mail_hosts_init(); |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
66 (void)mail_hosts_parse_and_add(orig_hosts_list, |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
67 conn->dir->set->director_mail_servers); |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
68 |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
69 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
|
70 &orig_hosts_count); |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
71 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
|
72 &cur_hosts_count); |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
73 |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
74 /* the hosts are sorted by IP */ |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
75 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
|
76 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
|
77 if (ret == 0) |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
78 i++, j++; |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
79 else if (ret > 0) |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
80 j++; |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
81 else { |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
82 str_printfa(str, "%s\n", |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
83 net_ip2addr(&orig_hosts[i]->ip)); |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
84 i++; |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
85 } |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
86 } |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
87 for (; i < orig_hosts_count; i++) |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
88 str_printfa(str, "%s\n", net_ip2addr(&orig_hosts[i]->ip)); |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
89 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
|
90 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
|
91 |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
92 mail_hosts_deinit(&orig_hosts_list); |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
93 } |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
94 |
18062
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
95 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
|
96 { |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
97 if (!dir->ring_handshaked) |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
98 str_append(str, "handshaking"); |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
99 else if (dir->ring_synced) |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
100 str_append(str, "synced"); |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
101 else { |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
102 str_printfa(str, "syncing - last sync %d secs ago", |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
103 (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
|
104 } |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
105 } |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
106 |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
107 static void |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
108 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
|
109 string_t *str) |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
110 { |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
111 if (!director_connection_is_handshaked(conn)) |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
112 str_append(str, "handshaking"); |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
113 else if (director_connection_is_synced(conn)) |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
114 str_append(str, "synced"); |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
115 else |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
116 str_append(str, "syncing"); |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
117 } |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
118 |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
119 static void |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
120 doveadm_director_host_append_status(struct director *dir, |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
121 const struct director_host *host, |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
122 string_t *str) |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
123 { |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
124 struct director_connection *conn = NULL; |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
125 |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
126 if (dir->left != NULL && |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
127 director_connection_get_host(dir->left) == host) |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
128 conn = dir->left; |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
129 else if (dir->right != NULL && |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
130 director_connection_get_host(dir->right) == host) |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
131 conn = dir->right; |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
132 else { |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
133 /* we might have a connection that is being connected */ |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
134 struct director_connection *const *connp; |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
135 |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
136 array_foreach(&dir->connections, connp) { |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
137 if (director_connection_get_host(*connp) == host) { |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
138 conn = *connp; |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
139 break; |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
140 } |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
141 } |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
142 } |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
143 |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
144 if (conn != NULL) |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
145 doveadm_director_connection_append_status(conn, str); |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
146 } |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
147 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 static void doveadm_cmd_director_list(struct doveadm_connection *conn) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 { |
13320
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
150 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
|
151 struct director_host *const *hostp; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 string_t *str = t_str_new(1024); |
13320
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
153 const char *type; |
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
154 bool left, right; |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
155 time_t last_failed; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 |
13320
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
157 array_foreach(&dir->dir_hosts, hostp) { |
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
158 const struct director_host *host = *hostp; |
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
159 |
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
160 left = dir->left != NULL && |
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
161 director_connection_get_host(dir->left) == host; |
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
162 right = dir->right != NULL && |
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
163 director_connection_get_host(dir->right) == host; |
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
164 |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
165 if (host->removed) |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
166 type = "removed"; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
167 else if (dir->self_host == host) |
13320
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
168 type = "self"; |
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
169 else if (left) |
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
170 type = right ? "l+r" : "left"; |
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
171 else if (right) |
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
172 type = "right"; |
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
173 else |
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
174 type = ""; |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
175 |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
176 last_failed = I_MAX(host->last_network_failure, |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
177 host->last_protocol_failure); |
18062
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
178 str_printfa(str, "%s\t%u\t%s\t%lu\t", |
13320
63680f6e21a2
director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
179 net_ip2addr(&host->ip), host->port, type, |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
180 (unsigned long)last_failed); |
18062
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
181 if (dir->self_host == host) |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
182 doveadm_director_append_status(dir, str); |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
183 else |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
184 doveadm_director_host_append_status(dir, host, str); |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17725
diff
changeset
|
185 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
|
186 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 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
|
188 o_stream_nsend(conn->output, str_data(str), str_len(str)); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 static bool |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
192 doveadm_cmd_director_add(struct doveadm_connection *conn, const char *line) |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
193 { |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
194 const char *const *args; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
195 struct director_host *host; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
196 struct ip_addr ip; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
197 unsigned int port = conn->dir->self_port; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
198 |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
199 args = t_strsplit_tab(line); |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
200 if (args[0] == NULL || |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
201 net_addr2ip(line, &ip) < 0 || |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
202 (args[1] != NULL && str_to_uint(args[1], &port) < 0)) { |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
203 i_error("doveadm sent invalid DIRECTOR-ADD parameters"); |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
204 return FALSE; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
205 } |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
206 |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
207 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
|
208 host = director_host_add(conn->dir, &ip, port); |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
209 director_notify_ring_added(host, conn->dir->self_host); |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
210 } |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14571
diff
changeset
|
211 o_stream_nsend(conn->output, "OK\n", 3); |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
212 return TRUE; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
213 } |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
214 |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
215 static bool |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
216 doveadm_cmd_director_remove(struct doveadm_connection *conn, const char *line) |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
217 { |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
218 const char *const *args; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
219 struct director_host *host; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
220 struct ip_addr ip; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
221 unsigned int port = 0; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
222 |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
223 args = t_strsplit_tab(line); |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
224 if (args[0] == NULL || |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
225 net_addr2ip(line, &ip) < 0 || |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
226 (args[1] != NULL && str_to_uint(args[1], &port) < 0)) { |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
227 i_error("doveadm sent invalid DIRECTOR-REMOVE parameters"); |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
228 return FALSE; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
229 } |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
230 |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
231 host = port != 0 ? |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
232 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
|
233 director_host_lookup_ip(conn->dir, &ip); |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
234 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
|
235 o_stream_nsend_str(conn->output, "NOTFOUND\n"); |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
236 else { |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
237 director_ring_remove(host, conn->dir->self_host); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14571
diff
changeset
|
238 o_stream_nsend(conn->output, "OK\n", 3); |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
239 } |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
240 return TRUE; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
241 } |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
242 |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
243 static bool |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 doveadm_cmd_host_set(struct doveadm_connection *conn, const char *line) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 { |
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
|
246 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
|
247 const char *const *args; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 struct mail_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 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
|
250 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
|
251 |
14471
fc8031c5e691
Use t_strsplit_tab() wherever possible
Timo Sirainen <tss@iki.fi>
parents:
14432
diff
changeset
|
252 args = t_strsplit_tab(line); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 if (args[0] == NULL || |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 net_addr2ip(args[0], &ip) < 0 || |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 (args[1] != NULL && str_to_uint(args[1], &vhost_count) < 0)) { |
11585 | 256 i_error("doveadm sent invalid HOST-SET parameters: %s", line); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 } |
15904
d3cf06639864
Replaced all -1U and (unsigned int)-1 with UINT_MAX.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
259 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
|
260 o_stream_nsend_str(conn->output, "vhost count too large\n"); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 } |
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
|
263 host = mail_host_lookup(dir->mail_hosts, &ip); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 if (host == NULL) |
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
|
265 host = mail_host_add_ip(dir->mail_hosts, &ip); |
15904
d3cf06639864
Replaced all -1U and (unsigned int)-1 with UINT_MAX.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
266 if (vhost_count != UINT_MAX) |
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
|
267 mail_host_set_vhost_count(dir->mail_hosts, host, vhost_count); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
268 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
|
269 |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14571
diff
changeset
|
270 o_stream_nsend(conn->output, "OK\n", 3); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 static bool |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
275 doveadm_cmd_host_remove(struct doveadm_connection *conn, const char *line) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 struct mail_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 struct ip_addr ip; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 if (net_addr2ip(line, &ip) < 0) { |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
281 i_error("doveadm sent invalid HOST-REMOVE parameters"); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
283 } |
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
|
284 host = mail_host_lookup(conn->dir->mail_hosts, &ip); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 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
|
286 o_stream_nsend_str(conn->output, "NOTFOUND\n"); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
287 else { |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
288 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
|
289 NULL, host); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14571
diff
changeset
|
290 o_stream_nsend(conn->output, "OK\n", 3); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
295 static void |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
296 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
|
297 { |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
298 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
|
299 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
|
300 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
301 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
|
302 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
|
303 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
|
304 NULL, *hostp); |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
305 } |
17725
bd381e882485
director: Log a warning when using "director host flush" for all hosts.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
306 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
|
307 "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
|
308 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
|
309 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
|
310 } |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
311 |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
312 static bool |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
313 doveadm_cmd_host_flush(struct doveadm_connection *conn, const char *line) |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
314 { |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
315 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
|
316 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
|
317 |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
318 if (*line == '\0') { |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
319 doveadm_cmd_host_flush_all(conn); |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
320 return TRUE; |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
321 } |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
322 |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
323 if (net_addr2ip(line, &ip) < 0) { |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
324 i_error("doveadm sent invalid HOST-FLUSH parameters"); |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
325 return FALSE; |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
326 } |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
327 host = mail_host_lookup(conn->dir->mail_hosts, &ip); |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
328 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
|
329 o_stream_nsend_str(conn->output, "NOTFOUND\n"); |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
330 else { |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
331 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
|
332 NULL, host); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14571
diff
changeset
|
333 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
|
334 } |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
335 return TRUE; |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
336 } |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
337 |
11351
c57c1ff9c5f1
doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents:
11322
diff
changeset
|
338 static bool |
c57c1ff9c5f1
doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents:
11322
diff
changeset
|
339 doveadm_cmd_user_lookup(struct doveadm_connection *conn, const char *line) |
c57c1ff9c5f1
doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents:
11322
diff
changeset
|
340 { |
c57c1ff9c5f1
doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents:
11322
diff
changeset
|
341 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
|
342 struct mail_host *host; |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
343 unsigned int username_hash; |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
344 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
|
345 |
11585 | 346 if (str_to_uint(line, &username_hash) < 0) |
14292
817ef4c9f1f3
Added director_username_hash setting to specify what part of the username is hashed.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
347 username_hash = user_directory_get_username_hash(conn->dir->users, line); |
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
|
348 |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
349 /* get user's current host */ |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
350 user = user_directory_lookup(conn->dir->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
|
351 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
|
352 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
|
353 else { |
11353
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
354 str_printfa(str, "%s\t%u", net_ip2addr(&user->host->ip), |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
355 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
|
356 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
|
357 } |
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
|
358 |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
359 /* get host if it wasn't in user directory */ |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
360 host = mail_host_get_by_hash(conn->dir->mail_hosts, username_hash); |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
361 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
|
362 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
|
363 else |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
364 str_printfa(str, "\t%s", net_ip2addr(&host->ip)); |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
365 |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
366 /* 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
|
367 host = mail_host_get_by_hash(conn->dir->orig_config_hosts, |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
368 username_hash); |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
369 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
|
370 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
|
371 else |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
372 str_printfa(str, "\t%s\n", net_ip2addr(&host->ip)); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14571
diff
changeset
|
373 o_stream_nsend(conn->output, str_data(str), str_len(str)); |
11351
c57c1ff9c5f1
doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents:
11322
diff
changeset
|
374 return TRUE; |
c57c1ff9c5f1
doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents:
11322
diff
changeset
|
375 } |
c57c1ff9c5f1
doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents:
11322
diff
changeset
|
376 |
11823
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
377 static bool |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
378 doveadm_cmd_user_list(struct doveadm_connection *conn, const char *line) |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
379 { |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
380 struct user_directory_iter *iter; |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
381 struct user *user; |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
382 struct ip_addr ip; |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
383 |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
384 if (*line != '\0') { |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
385 if (net_addr2ip(line, &ip) < 0) { |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
386 i_error("doveadm sent invalid USER-LIST parameters"); |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
387 return FALSE; |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
388 } |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
389 } else { |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
390 ip.family = 0; |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
391 } |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
392 |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
393 iter = user_directory_iter_init(conn->dir->users); |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
394 while ((user = user_directory_iter_next(iter)) != NULL) { |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
395 if (ip.family == 0 || |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
396 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
|
397 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
|
398 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
|
399 |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14571
diff
changeset
|
400 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
|
401 "%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
|
402 user->username_hash, expire_time, |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
403 net_ip2addr(&user->host->ip))); |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
404 } T_END; |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
405 } |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
406 user_directory_iter_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
|
407 o_stream_nsend(conn->output, "\n", 1); |
11823
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
408 return TRUE; |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
409 } |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
410 |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
411 static bool |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
412 doveadm_cmd_user_move(struct doveadm_connection *conn, const char *line) |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
413 { |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
414 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
|
415 const char *const *args; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
416 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
|
417 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
|
418 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
|
419 |
14471
fc8031c5e691
Use t_strsplit_tab() wherever possible
Timo Sirainen <tss@iki.fi>
parents:
14432
diff
changeset
|
420 args = t_strsplit_tab(line); |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
421 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
|
422 net_addr2ip(args[1], &ip) < 0) { |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
423 i_error("doveadm sent invalid USER-MOVE parameters: %s", line); |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
424 return FALSE; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
425 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
426 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
|
427 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
|
428 o_stream_nsend_str(conn->output, "NOTFOUND\n"); |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
429 return TRUE; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
430 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
431 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
432 if (str_to_uint(args[0], &username_hash) < 0) |
14292
817ef4c9f1f3
Added director_username_hash setting to specify what part of the username is hashed.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
433 username_hash = user_directory_get_username_hash(conn->dir->users, line); |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
434 user = user_directory_lookup(conn->dir->users, 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
|
435 if (user != NULL && user->kill_state != USER_KILL_STATE_NONE) { |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14571
diff
changeset
|
436 o_stream_nsend_str(conn->output, "TRYAGAIN\n"); |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
437 return TRUE; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
438 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
439 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
440 director_move_user(conn->dir, conn->dir->self_host, NULL, |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
441 username_hash, host); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14571
diff
changeset
|
442 o_stream_nsend(conn->output, "OK\n", 3); |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
443 return TRUE; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
444 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
445 |
17418
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
446 static bool |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
447 doveadm_cmd_user_kick(struct doveadm_connection *conn, const char *line) |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
448 { |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
449 const char *const *args; |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
450 |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
451 args = t_strsplit_tab(line); |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
452 if (args[0] == NULL) { |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
453 i_error("doveadm sent invalid USER-KICK parameters: %s", line); |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
454 return FALSE; |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
455 } |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
456 |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
457 director_kick_user(conn->dir, conn->dir->self_host, NULL, args[0]); |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
458 o_stream_nsend(conn->output, "OK\n", 3); |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
459 return TRUE; |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
460 } |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
461 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
462 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
|
463 { |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
464 const char *line, *cmd, *args; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
465 bool ret = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
466 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
467 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
|
468 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
|
469 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
|
470 doveadm_connection_deinit(&conn); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
471 return; |
11894
06a7435b6f53
director: If doveadm connection disconnects before handshake, don't loop forever.
Timo Sirainen <tss@iki.fi>
parents:
11823
diff
changeset
|
472 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
473 |
11458
4274d1549fa0
Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents:
11373
diff
changeset
|
474 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
|
475 DOVEADM_PROTOCOL_VERSION_MAJOR)) { |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
476 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
|
477 "(mixed old and new binaries?)"); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
478 doveadm_connection_deinit(&conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
479 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
480 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
481 conn->handshaked = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
482 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
483 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
484 while ((line = i_stream_read_next_line(conn->input)) != NULL && ret) { |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
485 args = strchr(line, '\t'); |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
486 if (args == NULL) { |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
487 cmd = line; |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
488 args = ""; |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
489 } else { |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
490 cmd = t_strdup_until(line, args); |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
491 args++; |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
492 } |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
493 |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
494 if (strcmp(cmd, "HOST-LIST") == 0) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
495 doveadm_cmd_host_list(conn); |
12986
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
496 else if (strcmp(cmd, "HOST-LIST-REMOVED") == 0) |
c838d40bd38e
doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
497 doveadm_cmd_host_list_removed(conn); |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
498 else if (strcmp(cmd, "DIRECTOR-LIST") == 0) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
499 doveadm_cmd_director_list(conn); |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
500 else if (strcmp(cmd, "DIRECTOR-ADD") == 0) |
14682
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
501 ret = doveadm_cmd_director_add(conn, args); |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
502 else if (strcmp(cmd, "DIRECTOR-REMOVE") == 0) |
14682
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
503 ret = doveadm_cmd_director_remove(conn, args); |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
504 else if (strcmp(cmd, "HOST-SET") == 0) |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
505 ret = doveadm_cmd_host_set(conn, args); |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
506 else if (strcmp(cmd, "HOST-REMOVE") == 0) |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
507 ret = doveadm_cmd_host_remove(conn, args); |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
508 else if (strcmp(cmd, "HOST-FLUSH") == 0) |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
509 ret = doveadm_cmd_host_flush(conn, args); |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
510 else if (strcmp(cmd, "USER-LOOKUP") == 0) |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
511 ret = doveadm_cmd_user_lookup(conn, args); |
11823
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
512 else if (strcmp(cmd, "USER-LIST") == 0) |
4138737f41e6
doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents:
11629
diff
changeset
|
513 ret = doveadm_cmd_user_list(conn, 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
|
514 else if (strcmp(cmd, "USER-MOVE") == 0) |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12986
diff
changeset
|
515 ret = doveadm_cmd_user_move(conn, args); |
17418
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
516 else if (strcmp(cmd, "USER-KICK") == 0) |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
517 ret = doveadm_cmd_user_kick(conn, args); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
518 else { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
519 i_error("doveadm sent unknown command: %s", line); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
520 ret = FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
521 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
522 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
523 if (conn->input->eof || conn->input->stream_errno != 0 || !ret) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
524 doveadm_connection_deinit(&conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
525 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
526 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
527 struct doveadm_connection * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
528 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
|
529 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
530 struct doveadm_connection *conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
531 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
532 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
|
533 conn->fd = fd; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
534 conn->dir = dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
535 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
|
536 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
|
537 o_stream_set_no_error_handling(conn->output, TRUE); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
538 conn->io = io_add(conn->fd, IO_READ, doveadm_connection_input, 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
|
539 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
|
540 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
541 DLLIST_PREPEND(&doveadm_connections, conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
542 return conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
543 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
544 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
545 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
|
546 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
547 struct doveadm_connection *conn = *_conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
548 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
549 *_conn = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
550 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
551 DLLIST_REMOVE(&doveadm_connections, conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
552 io_remove(&conn->io); |
11322 | 553 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
|
554 o_stream_unref(&conn->output); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
555 if (close(conn->fd) < 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
556 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
|
557 i_free(conn); |
11373
26cfc1c3a4b1
director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents:
11355
diff
changeset
|
558 |
26cfc1c3a4b1
director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents:
11355
diff
changeset
|
559 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
|
560 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
561 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
562 void doveadm_connections_deinit(void) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
563 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
564 while (doveadm_connections != NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
565 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
|
566 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
567 doveadm_connection_deinit(&conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
568 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
569 } |