7
7
#include "master-service.h"
8
8
#include "master-service-settings.h"
9
9
#include "notify-connection.h"
10
#include "doveadm-connection.h"
10
11
#include "replicator-brain.h"
11
12
#include "replicator-queue.h"
12
13
#include "replicator-settings.h"
14
15
#define REPLICATOR_AUTH_SERVICE_NAME "replicator"
15
16
#define REPLICATOR_DB_DUMP_INTERVAL_MSECS (1000*60*15)
16
#define REPLICATOR_DB_PATH PKG_STATEDIR"/replicator.db"
17
/* if syncing fails, try again in 5 minutes */
18
#define REPLICATOR_FAILURE_RESYNC_INTERVAL_SECS (60*5)
19
#define REPLICATOR_DB_FNAME "replicator.db"
18
21
static struct replicator_queue *queue;
19
22
static struct replicator_brain *brain;
23
static const struct master_service_settings *service_set;
20
24
static const struct replicator_settings *set;
21
25
static struct timeout *to_dump;
23
27
static void client_connected(struct master_service_connection *conn)
25
29
master_service_client_connection_accept(conn);
26
(void)notify_connection_create(conn->fd, queue);
30
if (strcmp(conn->name, "replicator-doveadm") == 0)
31
doveadm_connection_create(queue, conn->fd);
33
(void)notify_connection_create(conn->fd, queue);
29
36
static void replication_add_users(struct replicator_queue *queue)
32
39
struct auth_master_user_list_ctx *ctx;
33
40
struct auth_user_info user_info;
34
41
struct replicator_user *user;
42
const char *path, *username;
37
44
auth_conn = auth_master_init(set->auth_socket_path,
38
45
AUTH_MASTER_FLAG_NO_IDLE_TIMEOUT);
43
50
/* add all users into replication queue, so that we can start doing
44
51
full syncs for everyone whose state can't be found */
45
ctx = auth_master_user_list_init(auth_conn, NULL, &user_info);
52
ctx = auth_master_user_list_init(auth_conn, "", &user_info);
46
53
while ((username = auth_master_user_list_next(ctx)) != NULL) {
47
54
user = replicator_queue_add(queue, username,
48
55
REPLICATION_PRIORITY_NONE);
53
60
auth_master_deinit(&auth_conn);
55
62
/* add updates from replicator db, if it exists */
56
(void)replicator_queue_import(queue, REPLICATOR_DB_PATH);
63
path = t_strconcat(service_set->state_dir, "/"REPLICATOR_DB_FNAME, NULL);
64
(void)replicator_queue_import(queue, path);
59
static void replicator_dump_timeout(void *context ATTR_UNUSED)
67
static void ATTR_NULL(1)
68
replicator_dump_timeout(void *context ATTR_UNUSED)
61
(void)replicator_queue_export(queue, REPLICATOR_DB_PATH);
72
path = t_strconcat(service_set->state_dir, "/"REPLICATOR_DB_FNAME, NULL);
73
(void)replicator_queue_import(queue, path);
64
76
static void main_init(void)
80
service_set = master_service_settings_get(master_service);
68
81
sets = master_service_settings_get_others(master_service);
71
queue = replicator_queue_init(set->replication_full_sync_interval);
84
queue = replicator_queue_init(set->replication_full_sync_interval,
85
REPLICATOR_FAILURE_RESYNC_INTERVAL_SECS);
72
86
replication_add_users(queue);
73
87
to_dump = timeout_add(REPLICATOR_DB_DUMP_INTERVAL_MSECS,
74
replicator_dump_timeout, NULL);
88
replicator_dump_timeout, (void *)NULL);
75
89
brain = replicator_brain_init(queue, set);
90
doveadm_connections_init();
78
93
static void main_deinit(void)
97
doveadm_connections_deinit();
80
98
notify_connections_destroy_all();
81
99
replicator_brain_deinit(&brain);
82
100
timeout_remove(&to_dump);
83
(void)replicator_queue_export(queue, REPLICATOR_DB_PATH);
101
path = t_strconcat(service_set->state_dir, "/"REPLICATOR_DB_FNAME, NULL);
102
(void)replicator_queue_export(queue, path);
84
103
replicator_queue_deinit(&queue);
107
126
restrict_access_by_env(NULL, FALSE);
108
127
restrict_access_allow_coredumps(TRUE);
109
130
master_service_init_finish(master_service);
112
131
master_service_run(master_service, client_connected);