summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2015-02-03 13:06:58 -0500
committerNick Mathewson <nickm@torproject.org>2015-02-03 13:06:58 -0500
commitcdc49629c7d26e9806b8aa3c5a7dc80fbec9d060 (patch)
tree4a03c7d9830abee489d0f08d0d2ce618699e41da /src
parentd03e1da232ada2e0d3a3de3dbf6885caec74e4e0 (diff)
parent7f52dc4d03cc8b738b0c2a3896128ab38b030c52 (diff)
downloadtor-cdc49629c7d26e9806b8aa3c5a7dc80fbec9d060.tar.gz
tor-cdc49629c7d26e9806b8aa3c5a7dc80fbec9d060.zip
Merge branch 'bug6852'
Conflicts: src/or/status.c
Diffstat (limited to 'src')
-rw-r--r--src/or/geoip.c33
-rw-r--r--src/or/geoip.h1
-rw-r--r--src/or/status.c10
3 files changed, 43 insertions, 1 deletions
diff --git a/src/or/geoip.c b/src/or/geoip.c
index 5564b72a04..120ce479cc 100644
--- a/src/or/geoip.c
+++ b/src/or/geoip.c
@@ -1436,6 +1436,39 @@ format_bridge_stats_controller(time_t now)
return out;
}
+/** Return a newly allocated string holding our bridge usage stats by
+ * country in a format suitable for inclusion in our heartbeat
+ * message. Return NULL on failure. */
+char *
+format_client_stats_heartbeat(time_t now)
+{
+ const int n_hours = 6;
+ char *out = NULL;
+ int n_clients = 0;
+ clientmap_entry_t **ent;
+ unsigned cutoff = (unsigned)( (now-n_hours*3600)/60 );
+
+ if (!start_of_bridge_stats_interval)
+ return NULL; /* Not initialized. */
+
+ /* count unique IPs */
+ HT_FOREACH(ent, clientmap, &client_history) {
+ /* only count directly connecting clients */
+ if ((*ent)->action != GEOIP_CLIENT_CONNECT)
+ continue;
+ if ((*ent)->last_seen_in_minutes < cutoff)
+ continue;
+ n_clients++;
+ }
+
+ tor_asprintf(&out, "Heartbeat: "
+ "In the last %d hours, I have seen %d unique clients.",
+ n_hours,
+ n_clients);
+
+ return out;
+}
+
/** Write bridge statistics to $DATADIR/stats/bridge-stats and return
* when we should next try to write statistics. */
time_t
diff --git a/src/or/geoip.h b/src/or/geoip.h
index 683ec073b2..8a3486c7ac 100644
--- a/src/or/geoip.h
+++ b/src/or/geoip.h
@@ -64,6 +64,7 @@ time_t geoip_bridge_stats_write(time_t now);
void geoip_bridge_stats_term(void);
const char *geoip_get_bridge_stats_extrainfo(time_t);
char *geoip_get_bridge_stats_controller(time_t);
+char *format_client_stats_heartbeat(time_t now);
#endif
diff --git a/src/or/status.c b/src/or/status.c
index 0717070a05..98db688e5b 100644
--- a/src/or/status.c
+++ b/src/or/status.c
@@ -23,6 +23,7 @@
#include "statefile.h"
static void log_accounting(const time_t now, const or_options_t *options);
+#include "geoip.h"
/** Return the total number of circuits. */
STATIC int
@@ -92,7 +93,6 @@ log_heartbeat(time_t now)
const int hibernating = we_are_hibernating();
const or_options_t *options = get_options();
- (void)now;
if (public_server_mode(options) && !hibernating) {
/* Let's check if we are in the current cached consensus. */
@@ -132,6 +132,14 @@ log_heartbeat(time_t now)
circuit_log_ancient_one_hop_circuits(1800);
+ if (options->BridgeRelay) {
+ char *msg = NULL;
+ msg = format_client_stats_heartbeat(now);
+ if (msg)
+ log_notice(LD_HEARTBEAT, "%s", msg);
+ tor_free(msg);
+ }
+
tor_free(uptime);
tor_free(bw_sent);
tor_free(bw_rcvd);