#define KILLED_BY_ADMIN_REASON "Kicked by admin"
#define KILLED_BY_DIRECTOR_REASON "Kicked via director"
#define KILLED_BY_SHUTDOWN_REASON "Process shutting down"
+#define LOGIN_PROXY_SIDE_SELF "proxy"
/* Wait this long before retrying on reconnect */
#define PROXY_CONNECT_RETRY_MSECS 1000
/* Don't even try to reconnect if proxying will timeout in less than this. */
static void ATTR_NULL(2)
login_proxy_free_full(struct login_proxy **_proxy, const char *log_msg,
+ const char *disconnect_side,
+ const char *disconnect_reason,
enum login_proxy_free_flags flags);
static time_t proxy_last_io(struct login_proxy *proxy)
{
struct login_proxy *proxy = *_proxy;
string_t *log_msg = t_str_new(128);
+ const char *disconnect_side = server ? "server" : "client";
- str_printfa(log_msg, "Disconnected by %s", server ? "server" : "client");
+ str_printfa(log_msg, "Disconnected by %s", disconnect_side);
if (errstr[0] != '\0')
str_printfa(log_msg, ": %s", errstr);
str_append(log_msg, ", server output blocked");
str_append_c(log_msg, ')');
- login_proxy_free_full(_proxy, str_c(log_msg),
+ login_proxy_free_full(_proxy, str_c(log_msg), errstr, disconnect_side,
server ? LOGIN_PROXY_FREE_FLAG_DELAYED : 0);
}
static void ATTR_NULL(2)
login_proxy_free_full(struct login_proxy **_proxy, const char *log_msg,
+ const char *disconnect_reason,
+ const char *disconnect_side,
enum login_proxy_free_flags flags)
{
struct login_proxy *proxy = *_proxy;
return;
proxy->destroying = TRUE;
- /* we'll disconnect server side in any case. */
- login_proxy_disconnect(proxy);
-
struct event_passthrough *e = event_create_passthrough(proxy->event)->
+ add_str("disconnect_reason", disconnect_reason)->
+ add_str("disconnect_side", disconnect_side)->
set_name("proxy_session_finished");
+ if (proxy->detached) {
+ i_assert(proxy->connected);
+ e->add_int("idle_secs", ioloop_time - proxy_last_io(proxy));
+ e->add_int("bytes_in", proxy->server_output->offset);
+ e->add_int("bytes_out", proxy->client_output->offset);
+ }
+
+ /* we'll disconnect server side in any case. */
+ login_proxy_disconnect(proxy);
+
if (proxy->detached) {
/* detached proxy */
i_assert(log_msg != NULL || proxy->client->destroyed);
i_assert(!proxy->detached || proxy->client->destroyed);
/* Note: The NULL error is never even attempted to be used here. */
- login_proxy_free_full(_proxy, NULL, 0);
+ login_proxy_free_full(_proxy, NULL, "", LOGIN_PROXY_SIDE_SELF, 0);
}
bool login_proxy_failed(struct login_proxy *proxy, struct event *event,
static void proxy_kill_idle(struct login_proxy *proxy)
{
login_proxy_free_full(&proxy,
- LOGIN_PROXY_KILL_PREFIX KILLED_BY_SHUTDOWN_REASON, 0);
+ LOGIN_PROXY_KILL_PREFIX KILLED_BY_SHUTDOWN_REASON,
+ KILLED_BY_SHUTDOWN_REASON,
+ LOGIN_PROXY_SIDE_SELF, 0);
}
void login_proxy_kill_idle(void)
if (want_kick(proxy, args, key_idx)) {
login_proxy_free_full(&proxy,
LOGIN_PROXY_KILL_PREFIX KILLED_BY_ADMIN_REASON,
+ KILLED_BY_ADMIN_REASON,
+ LOGIN_PROXY_SIDE_SELF,
LOGIN_PROXY_FREE_FLAG_DELAYED);
count++;
}
!net_ip_compare(&proxy->ip, &except_ip)) {
login_proxy_free_full(&proxy,
LOGIN_PROXY_KILL_PREFIX KILLED_BY_DIRECTOR_REASON,
+ KILLED_BY_DIRECTOR_REASON,
+ LOGIN_PROXY_SIDE_SELF,
LOGIN_PROXY_FREE_FLAG_DELAYED);
count++;
}
while (login_proxies != NULL) {
proxy = login_proxies;
login_proxy_free_full(&proxy,
- LOGIN_PROXY_KILL_PREFIX KILLED_BY_SHUTDOWN_REASON, 0);
+ LOGIN_PROXY_KILL_PREFIX KILLED_BY_SHUTDOWN_REASON,
+ KILLED_BY_SHUTDOWN_REASON,
+ LOGIN_PROXY_SIDE_SELF, 0);
}
i_assert(detached_login_proxies_count == 0);