annotate src/director/doveadm-connection.c @ 15187:02451e967a06

Renamed network.[ch] to net.[ch]. The function prefixes already started with net_ instead of network_. And icecap wants to use network.h for other purpose. :)
author Timo Sirainen <tss@iki.fi>
date Wed, 03 Oct 2012 18:17:26 +0300
parents d0d7b810646b
children 90710c6c3beb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14133
ba770cba5598 Updated copyright notices to include year 2012.
Timo Sirainen <tss@iki.fi>
parents: 13320
diff changeset
1 /* Copyright (c) 2010-2012 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
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 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
96 {
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
97 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
98 struct director_host *const *hostp;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 string_t *str = t_str_new(1024);
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
100 const char *type;
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
101 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
102 time_t last_failed;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
104 array_foreach(&dir->dir_hosts, hostp) {
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
105 const struct director_host *host = *hostp;
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
106
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
107 left = dir->left != NULL &&
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
108 director_connection_get_host(dir->left) == host;
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
109 right = dir->right != NULL &&
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
110 director_connection_get_host(dir->right) == host;
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
111
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
112 if (host->removed)
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
113 type = "removed";
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
114 else if (dir->self_host == host)
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
115 type = "self";
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
116 else if (left)
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
117 type = right ? "l+r" : "left";
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
118 else if (right)
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
119 type = "right";
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
120 else
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
121 type = "";
14432
366b9e5fc85c director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
122
366b9e5fc85c director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
123 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
124 host->last_protocol_failure);
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
125 str_printfa(str, "%s\t%u\t%s\t%lu\n",
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
126 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
127 (unsigned long)last_failed);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 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
130 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
131 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 static bool
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
134 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
135 {
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
136 const char *const *args;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
137 struct director_host *host;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
138 struct ip_addr ip;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
139 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
140
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
141 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
142 if (args[0] == NULL ||
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
143 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
144 (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
145 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
146 return FALSE;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
147 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
148
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
149 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
150 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
151 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
152 }
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
153 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
154 return TRUE;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
155 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
156
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
157 static bool
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
158 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
159 {
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
160 const char *const *args;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
161 struct director_host *host;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
162 struct ip_addr ip;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
163 unsigned int port = 0;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
164
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
165 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
166 if (args[0] == NULL ||
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
167 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
168 (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
169 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
170 return FALSE;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
171 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
172
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
173 host = port != 0 ?
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
174 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
175 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
176 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
177 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
178 else {
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
179 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
180 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
181 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
182 return TRUE;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
183 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
184
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
185 static bool
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 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
187 {
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
188 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
189 const char *const *args;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 struct mail_host *host;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 struct ip_addr ip;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 unsigned int vhost_count = -1U;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193
14471
fc8031c5e691 Use t_strsplit_tab() wherever possible
Timo Sirainen <tss@iki.fi>
parents: 14432
diff changeset
194 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
195 if (args[0] == NULL ||
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 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
197 (args[1] != NULL && str_to_uint(args[1], &vhost_count) < 0)) {
11585
f0fb8151c6b4 director: A lot of fixes.
Timo Sirainen <tss@iki.fi>
parents: 11458
diff changeset
198 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
199 return FALSE;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 if (vhost_count > MAX_VALID_VHOST_COUNT && vhost_count != -1U) {
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
202 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
203 return TRUE;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 }
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
205 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
206 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
207 host = mail_host_add_ip(dir->mail_hosts, &ip);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 if (vhost_count != -1U)
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
209 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
210 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
211
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
212 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
213 return TRUE;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 static bool
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 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
218 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 struct mail_host *host;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 struct ip_addr ip;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 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
223 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
224 return FALSE;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 }
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
226 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
227 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
228 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
229 else {
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
230 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
231 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
232 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
233 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 return TRUE;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
237 static void
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
238 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
239 {
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
240 struct mail_host *const *hostp;
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
241
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
242 array_foreach(mail_hosts_get(conn->dir->mail_hosts), hostp) {
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
243 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
244 NULL, *hostp);
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
245 }
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
246 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
247 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
248
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
249 static bool
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
250 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
251 {
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
252 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
253 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
254
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
255 if (*line == '\0') {
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
256 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
257 return TRUE;
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
258 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
259
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
260 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
261 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
262 return FALSE;
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
263 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
264 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
265 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
266 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
267 else {
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
268 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
269 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
270 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
271 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
272 return TRUE;
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
273 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
274
11351
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
275 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
276 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
277 {
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
278 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
279 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
280 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
281 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
282
11585
f0fb8151c6b4 director: A lot of fixes.
Timo Sirainen <tss@iki.fi>
parents: 11458
diff changeset
283 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
284 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
285
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
286 /* 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
287 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
288 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
289 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
290 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
291 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
292 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
293 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
294 }
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
295
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
296 /* 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
297 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
298 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
299 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
300 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
301 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
302
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
303 /* 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
304 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
305 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
306 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
307 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
308 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
309 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
310 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
311 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
312 }
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
313
11823
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
314 static bool
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
315 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
316 {
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
317 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
318 struct user *user;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
319 struct ip_addr ip;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
320
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
321 if (*line != '\0') {
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
322 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
323 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
324 return FALSE;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
325 }
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
326 } else {
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
327 ip.family = 0;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
328 }
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
329
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
330 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
331 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
332 if (ip.family == 0 ||
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
333 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
334 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
335 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
336
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
337 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
338 "%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
339 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
340 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
341 } T_END;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
342 }
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
343 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
344 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
345 return TRUE;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
346 }
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
347
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
348 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
349 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
350 {
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
351 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
352 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
353 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
354 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
355 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
356
14471
fc8031c5e691 Use t_strsplit_tab() wherever possible
Timo Sirainen <tss@iki.fi>
parents: 14432
diff changeset
357 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
358 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
359 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
360 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
361 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
362 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
363 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
364 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
365 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
366 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
367 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
368
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
369 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
370 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
371 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
372 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
373 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
374 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
375 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
376
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
377 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
378 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
379 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
380 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
381 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
382
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 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
384 {
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
385 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
386 bool ret = TRUE;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 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
389 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
390 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
391 doveadm_connection_deinit(&conn);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 return;
11894
06a7435b6f53 director: If doveadm connection disconnects before handshake, don't loop forever.
Timo Sirainen <tss@iki.fi>
parents: 11823
diff changeset
393 }
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394
11458
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11373
diff changeset
395 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
396 DOVEADM_PROTOCOL_VERSION_MAJOR)) {
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 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
398 "(mixed old and new binaries?)");
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 doveadm_connection_deinit(&conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 return;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 conn->handshaked = TRUE;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405 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
406 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
407 if (args == NULL) {
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
408 cmd = line;
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
409 args = "";
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
410 } else {
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
411 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
412 args++;
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
413 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
414
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
415 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
416 doveadm_cmd_host_list(conn);
12986
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
417 else if (strcmp(cmd, "HOST-LIST-REMOVED") == 0)
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
418 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
419 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
420 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
421 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
422 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
423 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
424 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
425 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
426 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
427 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
428 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
429 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
430 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
431 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
432 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
433 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
434 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
435 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
436 ret = doveadm_cmd_user_move(conn, args);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 else {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 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
439 ret = FALSE;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 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
443 doveadm_connection_deinit(&conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446 struct doveadm_connection *
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447 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
448 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 struct doveadm_connection *conn;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 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
452 conn->fd = fd;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453 conn->dir = dir;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 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
455 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
456 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
457 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
458 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
459
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460 DLLIST_PREPEND(&doveadm_connections, conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
461 return conn;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
463
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464 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
465 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466 struct doveadm_connection *conn = *_conn;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468 *_conn = NULL;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
469
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
470 DLLIST_REMOVE(&doveadm_connections, conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 io_remove(&conn->io);
11322
12316378922e director: Memory leak fix.
Timo Sirainen <tss@iki.fi>
parents: 11321
diff changeset
472 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
473 o_stream_unref(&conn->output);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
474 if (close(conn->fd) < 0)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
475 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
476 i_free(conn);
11373
26cfc1c3a4b1 director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents: 11355
diff changeset
477
26cfc1c3a4b1 director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents: 11355
diff changeset
478 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
479 }
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 void doveadm_connections_deinit(void)
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 while (doveadm_connections != NULL) {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
484 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
485
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
486 doveadm_connection_deinit(&conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
487 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488 }