diff options
author | Nick Mathewson <nickm@torproject.org> | 2018-07-05 16:31:38 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2018-07-05 17:15:50 -0400 |
commit | 63b4ea22af8e8314dd718f02046de5f4b91edf9d (patch) | |
tree | af52b6fba37f22c86447fd5267dd5eb557807c8b /src/or/status.c | |
parent | ce84200542f48a92e8b56a8d032401ecd153e90c (diff) | |
download | tor-63b4ea22af8e8314dd718f02046de5f4b91edf9d.tar.gz tor-63b4ea22af8e8314dd718f02046de5f4b91edf9d.zip |
Move literally everything out of src/or
This commit won't build yet -- it just puts everything in a slightly
more logical place.
The reasoning here is that "src/core" will hold the stuff that every (or
nearly every) tor instance will need in order to do onion routing.
Other features (including some necessary ones) will live in
"src/feature". The "src/app" directory will hold the stuff needed
to have Tor be an application you can actually run.
This commit DOES NOT refactor the former contents of src/or into a
logical set of acyclic libraries, or change any code at all. That
will have to come in the future.
We will continue to move things around and split them in the future,
but I hope this lays a reasonable groundwork for doing so.
Diffstat (limited to 'src/or/status.c')
-rw-r--r-- | src/or/status.c | 251 |
1 files changed, 0 insertions, 251 deletions
diff --git a/src/or/status.c b/src/or/status.c deleted file mode 100644 index 2259b3aae7..0000000000 --- a/src/or/status.c +++ /dev/null @@ -1,251 +0,0 @@ -/* Copyright (c) 2010-2018, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file status.c - * \brief Collect status information and log heartbeat messages. - * - * This module is responsible for implementing the heartbeat log messages, - * which periodically inform users and operators about basic facts to - * do with their Tor instance. The log_heartbeat() function, invoked from - * main.c, is the principle entry point. It collects data from elsewhere - * in Tor, and logs it in a human-readable format. - **/ - -#define STATUS_PRIVATE - -#include "or/or.h" -#include "or/circuituse.h" -#include "or/config.h" -#include "or/status.h" -#include "or/nodelist.h" -#include "or/relay.h" -#include "or/router.h" -#include "or/circuitlist.h" -#include "or/main.h" -#include "or/rephist.h" -#include "or/hibernate.h" -#include "or/statefile.h" -#include "or/hs_stats.h" -#include "or/hs_service.h" -#include "or/dos.h" - -#include "or/or_state_st.h" -#include "or/routerinfo_st.h" -#include "lib/tls/tortls.h" - -static void log_accounting(const time_t now, const or_options_t *options); -#include "or/geoip.h" - -/** Return the total number of circuits. */ -STATIC int -count_circuits(void) -{ - return smartlist_len(circuit_get_global_list()); -} - -/** Take seconds <b>secs</b> and return a newly allocated human-readable - * uptime string. */ -STATIC char * -secs_to_uptime(long secs) -{ - long int days = secs / 86400; - int hours = (int)((secs - (days * 86400)) / 3600); - int minutes = (int)((secs - (days * 86400) - (hours * 3600)) / 60); - char *uptime_string = NULL; - - switch (days) { - case 0: - tor_asprintf(&uptime_string, "%d:%02d hours", hours, minutes); - break; - case 1: - tor_asprintf(&uptime_string, "%ld day %d:%02d hours", - days, hours, minutes); - break; - default: - tor_asprintf(&uptime_string, "%ld days %d:%02d hours", - days, hours, minutes); - break; - } - - return uptime_string; -} - -/** Take <b>bytes</b> and returns a newly allocated human-readable usage - * string. */ -STATIC char * -bytes_to_usage(uint64_t bytes) -{ - char *bw_string = NULL; - - if (bytes < (1<<20)) { /* Less than a megabyte. */ - tor_asprintf(&bw_string, "%"PRIu64" kB", (bytes>>10)); - } else if (bytes < (1<<30)) { /* Megabytes. Let's add some precision. */ - double bw = ((double)bytes); - tor_asprintf(&bw_string, "%.2f MB", bw/(1<<20)); - } else { /* Gigabytes. */ - double bw = ((double)bytes); - tor_asprintf(&bw_string, "%.2f GB", bw/(1<<30)); - } - - return bw_string; -} - -/** Log some usage info about our onion service(s). */ -static void -log_onion_service_stats(void) -{ - unsigned int num_services = hs_service_get_num_services(); - - /* If there are no active onion services, no need to print logs */ - if (num_services == 0) { - return; - } - - log_notice(LD_HEARTBEAT, - "Our onion service%s received %u v2 and %u v3 INTRODUCE2 cells " - "and attempted to launch %d rendezvous circuits.", - num_services == 1 ? "" : "s", - hs_stats_get_n_introduce2_v2_cells(), - hs_stats_get_n_introduce2_v3_cells(), - hs_stats_get_n_rendezvous_launches()); -} - -/** Log a "heartbeat" message describing Tor's status and history so that the - * user can know that there is indeed a running Tor. Return 0 on success and - * -1 on failure. */ -int -log_heartbeat(time_t now) -{ - char *bw_sent = NULL; - char *bw_rcvd = NULL; - char *uptime = NULL; - const routerinfo_t *me; - double r = tls_get_write_overhead_ratio(); - const int hibernating = we_are_hibernating(); - - const or_options_t *options = get_options(); - - if (public_server_mode(options) && !hibernating) { - /* Let's check if we are in the current cached consensus. */ - if (!(me = router_get_my_routerinfo())) - return -1; /* Something stinks, we won't even attempt this. */ - else - if (!node_get_by_id(me->cache_info.identity_digest)) - log_fn(LOG_NOTICE, LD_HEARTBEAT, "Heartbeat: It seems like we are not " - "in the cached consensus."); - } - - uptime = secs_to_uptime(get_uptime()); - bw_rcvd = bytes_to_usage(get_bytes_read()); - bw_sent = bytes_to_usage(get_bytes_written()); - - log_fn(LOG_NOTICE, LD_HEARTBEAT, "Heartbeat: Tor's uptime is %s, with %d " - "circuits open. I've sent %s and received %s.%s", - uptime, count_circuits(), bw_sent, bw_rcvd, - hibernating?" We are currently hibernating.":""); - - if (server_mode(options) && accounting_is_enabled(options) && !hibernating) { - log_accounting(now, options); - } - - double fullness_pct = 100; - if (stats_n_data_cells_packaged && !hibernating) { - fullness_pct = - 100*(((double)stats_n_data_bytes_packaged) / - ((double)stats_n_data_cells_packaged*RELAY_PAYLOAD_SIZE)); - } - const double overhead_pct = ( r - 1.0 ) * 100.0; - -#define FULLNESS_PCT_THRESHOLD 80 -#define TLS_OVERHEAD_THRESHOLD 15 - - const int severity = (fullness_pct < FULLNESS_PCT_THRESHOLD || - overhead_pct > TLS_OVERHEAD_THRESHOLD) - ? LOG_NOTICE : LOG_INFO; - - log_fn(severity, LD_HEARTBEAT, - "Average packaged cell fullness: %2.3f%%. " - "TLS write overhead: %.f%%", fullness_pct, overhead_pct); - - if (public_server_mode(options)) { - rep_hist_log_circuit_handshake_stats(now); - rep_hist_log_link_protocol_counts(); - dos_log_heartbeat(); - } - - 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); - } - - if (options->MainloopStats) { - const uint64_t main_loop_success_count = get_main_loop_success_count(); - const uint64_t main_loop_error_count = get_main_loop_error_count(); - const uint64_t main_loop_idle_count = get_main_loop_idle_count(); - - log_fn(LOG_NOTICE, LD_HEARTBEAT, "Main event loop statistics: " - "%"PRIu64 " successful returns, " - "%"PRIu64 " erroneous returns, and " - "%"PRIu64 " idle returns.", - (main_loop_success_count), - (main_loop_error_count), - (main_loop_idle_count)); - } - - /** Now, if we are an HS service, log some stats about our usage */ - log_onion_service_stats(); - - tor_free(uptime); - tor_free(bw_sent); - tor_free(bw_rcvd); - - return 0; -} - -static void -log_accounting(const time_t now, const or_options_t *options) -{ - or_state_t *state = get_or_state(); - char *acc_rcvd = bytes_to_usage(state->AccountingBytesReadInInterval); - char *acc_sent = bytes_to_usage(state->AccountingBytesWrittenInInterval); - char *acc_used = bytes_to_usage(get_accounting_bytes()); - uint64_t acc_bytes = options->AccountingMax; - char *acc_max; - time_t interval_end = accounting_get_end_time(); - char end_buf[ISO_TIME_LEN + 1]; - char *remaining = NULL; - acc_max = bytes_to_usage(acc_bytes); - format_local_iso_time(end_buf, interval_end); - remaining = secs_to_uptime(interval_end - now); - - const char *acc_rule; - switch (options->AccountingRule) { - case ACCT_MAX: acc_rule = "max"; - break; - case ACCT_SUM: acc_rule = "sum"; - break; - case ACCT_OUT: acc_rule = "out"; - break; - case ACCT_IN: acc_rule = "in"; - break; - default: acc_rule = "max"; - break; - } - - log_notice(LD_HEARTBEAT, "Heartbeat: Accounting enabled. " - "Sent: %s, Received: %s, Used: %s / %s, Rule: %s. The " - "current accounting interval ends on %s, in %s.", - acc_sent, acc_rcvd, acc_used, acc_max, acc_rule, end_buf, remaining); - - tor_free(acc_rcvd); - tor_free(acc_sent); - tor_free(acc_used); - tor_free(acc_max); - tor_free(remaining); -} |