[tor-commits] [obfsproxy/master] Add heartbeat message with total connections and unique IP counters.
nickm at torproject.org
nickm at torproject.org
Mon Feb 13 16:01:04 UTC 2012
commit 3e61d45c607f2e420c28d94b2a42e082441b3bbd
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date: Sat Feb 11 13:17:04 2012 +0100
Add heartbeat message with total connections and unique IP counters.
---
Makefile.am | 2 +
src/main.c | 24 +++++++++++
src/network.c | 3 +
src/status.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/status.h | 13 ++++++
5 files changed, 161 insertions(+), 0 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 963c725..533629b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -18,6 +18,7 @@ libobfsproxy_a_SOURCES = \
src/network.c \
src/protocol.c \
src/socks.c \
+ src/status.c \
src/util.c \
src/protocols/dummy.c \
src/protocols/obfs2.c
@@ -48,6 +49,7 @@ noinst_HEADERS = \
src/protocol.h \
src/sha256.h \
src/socks.h \
+ src/status.h \
src/util.h \
src/protocols/dummy.h \
src/protocols/obfs2.h \
diff --git a/src/main.c b/src/main.c
index 1d7132d..607a153 100644
--- a/src/main.c
+++ b/src/main.c
@@ -22,6 +22,8 @@
#include "managed.h"
#include "external.h"
+#include "status.h"
+
#include <errno.h>
#include <signal.h>
#include <stdio.h>
@@ -32,6 +34,7 @@
static struct event_base *the_event_base;
static struct event *sig_int;
static struct event *sig_term;
+static struct event *heartbeat;
/* Pluggable transport proxy mode. ('External' or 'Managed') */
static int is_external_proxy=1;
@@ -193,6 +196,16 @@ handle_obfsproxy_args(const char *const *argv)
return i;
}
+/** Libevent callback: Log heartbeat message once every hour. */
+static void
+heartbeat_cb(evutil_socket_t fd, short what, void *arg)
+{
+ (void) fd;
+ (void) what;
+ (void) arg;
+ status_log_heartbeat();
+}
+
/**
Initialize basic components of obfsproxy.
*/
@@ -233,6 +246,16 @@ obfsproxy_init()
if (event_add(sig_int,NULL) || event_add(sig_term,NULL)) {
log_error("Failed to initialize signal handling.");
}
+
+ /* Initialize hourly heartbeat messages. */
+ struct timeval one_hour;
+ one_hour.tv_sec = 3600;
+ one_hour.tv_usec = 0;
+ status_init();
+ heartbeat = event_new(the_event_base, -1, EV_PERSIST, heartbeat_cb, NULL);
+ if (event_add(heartbeat, &one_hour)) {
+ log_error("Failed to initialize heartbeat logs.");
+ }
}
/**
@@ -251,6 +274,7 @@ obfsproxy_cleanup()
event_base_free(get_event_base());
cleanup_crypto();
+ status_cleanup();
close_obfsproxy_logfile();
}
diff --git a/src/network.c b/src/network.c
index a7c1fa6..0a6852e 100644
--- a/src/network.c
+++ b/src/network.c
@@ -75,6 +75,8 @@
#include "socks.h"
#include "protocol.h"
+#include "status.h"
+
#include <errno.h>
#include <event2/buffer.h>
@@ -549,6 +551,7 @@ open_outbound(conn_t *conn, bufferevent_data_cb readcb)
success:
log_info("%s (%s): Successful outbound connection to '%s'.",
safe_str(conn->peername), conn->cfg->vtable->name, safe_str(peername));
+ status_note_connection(conn->peername);
bufferevent_enable(buf, EV_READ|EV_WRITE);
newconn->peername = peername;
obfs_assert(connections);
diff --git a/src/status.c b/src/status.c
new file mode 100644
index 0000000..40cd968
--- /dev/null
+++ b/src/status.c
@@ -0,0 +1,119 @@
+/* Copyright 2012 The Tor Project
+ See LICENSE for other credits and copying information
+*/
+
+/**
+ * \file status.c
+ * \headerfile status.h
+ * \brief Keeps status information and logs heartbeat messages.
+ **/
+
+#include "util.h"
+
+#include "container.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <time.h>
+
+#include <event2/event.h>
+#include <event2/listener.h>
+
+/** Count total connections. */
+static int connections = 0;
+
+/** Count connections from unique addresses. */
+static strmap_t *addresses = NULL;
+
+/** Initialize counting connections from unique addresses. */
+static void
+connections_init(void)
+{
+ if (!addresses)
+ addresses = strmap_new();
+}
+
+/** Clear connection counters. */
+static void
+connections_clear(int reinit)
+{
+ connections = 0;
+ if (!addresses)
+ return;
+ strmap_free(addresses, NULL); /* NULL, because no need to free values. */
+ addresses = NULL;
+ if (reinit)
+ addresses = strmap_new();
+}
+
+/** Note that we saw a new connection. */
+void
+status_note_connection(const char *addrport)
+{
+ char *addr = xstrdup(addrport), *p;
+
+ if ((p = strrchr(addr, ':'))) {
+ *p = '\0';
+ } else {
+ log_debug("Error in address %s: port expected.", addrport);
+ free(addr);
+ return;
+ }
+
+ if (!addresses)
+ addresses = strmap_new();
+ strmap_set_lc(addresses, addr, (void*)(1));
+ free(addr);
+ connections++;
+}
+
+/** Time when we started. */
+static time_t started = 0;
+
+/** Time when we last reset connection and address counters. */
+static time_t last_reset_counters = 0;
+
+/** Reset status information this often. */
+#define RESET_COUNTERS 86400
+
+/** Initialize status information to print out heartbeat messages. */
+void
+status_init(void)
+{
+ time_t now = time(NULL);
+ started = now;
+ last_reset_counters = now;
+ connections_init();
+}
+
+/** Free all memory used by printing heartbeat logs. */
+void
+status_cleanup(void)
+{
+ started = 0;
+ last_reset_counters = 0;
+ connections_clear(0);
+}
+
+/** Log information about our uptime and the number of connections we saw.
+ */
+void
+status_log_heartbeat(void)
+{
+ time_t now = time(NULL);
+ long secs = now - started;
+ long days = secs / 86400;
+ int hours = (int)((secs - (days * 86400)) / 3600);
+ int last_reset_hours = (int) (now - last_reset_counters) / 3600;
+ int minutes = (int)((secs - (days * 86400) - (hours * 3600)) / 60);
+ log_info("Heartbeat: obfsproxy's uptime is %ld days, %d hours, and "
+ "%d minutes. During the last %d hours we saw %d connections "
+ "from %d unique addresses.",
+ days, hours, minutes, last_reset_hours,
+ connections, strmap_size(addresses));
+ if (now - last_reset_counters >= RESET_COUNTERS) {
+ log_info("Resetting connection counters.");
+ connections_clear(1);
+ last_reset_counters += RESET_COUNTERS;
+ }
+}
diff --git a/src/status.h b/src/status.h
new file mode 100644
index 0000000..54dfb9c
--- /dev/null
+++ b/src/status.h
@@ -0,0 +1,13 @@
+/* Copyright 2012 The Tor Project
+ See LICENSE for other credits and copying information
+*/
+
+/**
+ * \file status.h
+ * \brief Headers for status.c.
+ **/
+
+void status_init(void);
+void status_cleanup(void);
+void status_note_connection(const char *addrport);
+void status_log_heartbeat(void);
More information about the tor-commits
mailing list