]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap-hibernate: send connect/disconnect events to anvil
authormanuel <manuel@mausz.at>
Tue, 16 Feb 2016 17:05:59 +0000 (18:05 +0100)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Sat, 20 Feb 2016 21:55:56 +0000 (23:55 +0200)
make doveadm who + mail_max_userip_connections work with
hibernated connections.

src/imap-hibernate/imap-client.c
src/imap-hibernate/imap-client.h

index f14080a2a585b400c41734e76d4ab3bed045c841..5c7209e17bc5dc7c9ea74649bddef080d41d6a7a 100644 (file)
@@ -397,12 +397,21 @@ static void imap_client_io_deactivate_user(struct imap_client *client ATTR_UNUSE
        i_set_failure_prefix("imap-hibernate: ");
 }
 
+static const char *imap_client_get_anvil_userip_ident(struct imap_client_state *state)
+{
+       if (state->remote_ip.family == 0)
+               return NULL;
+       return t_strconcat(net_ip2addr(&state->remote_ip), "/",
+                          str_tabescape(state->username), NULL);
+}
+
 struct imap_client *
 imap_client_create(int fd, const struct imap_client_state *state)
 {
        struct imap_client *client;
        pool_t pool = pool_alloconly_create("imap client", 256);
        void *statebuf;
+       const char *ident;
 
        i_assert(state->username != NULL);
        i_assert(state->mail_log_prefix != NULL);
@@ -434,6 +443,13 @@ imap_client_create(int fd, const struct imap_client_state *state)
                client->log_prefix = p_strdup(pool, str_c(str));
        } T_END;
 
+       ident = imap_client_get_anvil_userip_ident(&client->state);
+       if (ident != NULL) {
+               master_service_anvil_send(master_service, t_strconcat(
+                       "CONNECT\t", my_pid, "\timap/", ident, "\n", NULL));
+               client->state.anvil_sent = TRUE;
+       }
+
        p_array_init(&client->notifys, pool, 2);
        DLLIST_PREPEND(&imap_clients, client);
        return client;
@@ -468,6 +484,13 @@ void imap_client_destroy(struct imap_client **_client, const char *reason)
                i_info("%s %s", reason, client->state.stats);
        }
 
+       if (client->state.anvil_sent) {
+               master_service_anvil_send(master_service, t_strconcat(
+                       "DISCONNECT\t", my_pid, "\timap/",
+                       imap_client_get_anvil_userip_ident(&client->state),
+                       "\n", NULL));
+       }
+
        if (client->ioloop_ctx != NULL) {
                io_loop_context_remove_callbacks(client->ioloop_ctx,
                                                 imap_client_io_activate_user,
index 131b4047333f76c376b8467d420410ac75494e6c..a57c974db97a3e3d004f99eb953a1f27affd301a 100644 (file)
@@ -22,6 +22,7 @@ struct imap_client_state {
        unsigned int imap_idle_notify_interval;
        bool idle_cmd;
        bool have_notify_fd;
+       bool anvil_sent;
 };
 
 struct imap_client *