mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-27 22:03:31 +01:00
Make getinfo ns/purpose/bridge actually work
Also, dump our bridge router status entries to disk every 30 minutes. svn:r12871
This commit is contained in:
parent
a697573ce9
commit
f405f9b614
18
ChangeLog
18
ChangeLog
@ -36,13 +36,17 @@ Changes in version 0.2.0.13-alpha - 2007-12-??
|
|||||||
AlternateBridgeAuthority, and AlternateHSAuthority) that let the
|
AlternateBridgeAuthority, and AlternateHSAuthority) that let the
|
||||||
user selectively replace the default directory authorities, rather
|
user selectively replace the default directory authorities, rather
|
||||||
than the all-or-nothing replacement that DirServer offers.
|
than the all-or-nothing replacement that DirServer offers.
|
||||||
- Tor can now be configured to read a GeoIP file from disk in one of two
|
- Tor can now be configured to read a GeoIP file from disk in one
|
||||||
formats. This can be used by controllers to map IPs to countries.
|
of two formats. This can be used by controllers to map IP addresses
|
||||||
Eventually, it may support exit-by-country.
|
to countries. Eventually, it may support exit-by-country.
|
||||||
- When possible, bridges remember which countries users are coming
|
- When possible, bridge relays remember which countries users
|
||||||
from, and report aggregate information in their extra-info
|
are coming from, and report aggregate information in their
|
||||||
documents, so that the bridge authorities can learn where Tor is
|
extra-info documents, so that the bridge authorities can learn
|
||||||
blocked.
|
where Tor is blocked.
|
||||||
|
- Bridge directory authorities now do reachability testing on the
|
||||||
|
bridges they know. They provide router status summaries to the
|
||||||
|
controller on "getinfo ns/purpose/bridge", and also dump summaries
|
||||||
|
to a file periodically.
|
||||||
|
|
||||||
o Minor bugfixes:
|
o Minor bugfixes:
|
||||||
- The fix in 0.2.0.12-alpha cleared the "hsdir" flag in v3 network
|
- The fix in 0.2.0.12-alpha cleared the "hsdir" flag in v3 network
|
||||||
|
@ -721,7 +721,7 @@ anything itself; to save bandwidth, leave this option turned off.
|
|||||||
.LP
|
.LP
|
||||||
.TP
|
.TP
|
||||||
\fBFallbackNetworkstatusFile\fP \fIFILENAME\fP
|
\fBFallbackNetworkstatusFile\fP \fIFILENAME\fP
|
||||||
If Tor doesn't have a cached networkstatus file, it starts out uses
|
If Tor doesn't have a cached networkstatus file, it starts out using
|
||||||
this one instead. Even if this file is out of date, Tor can still use
|
this one instead. Even if this file is out of date, Tor can still use
|
||||||
it to learn about directory mirrors, so it doesn't need to put load on
|
it to learn about directory mirrors, so it doesn't need to put load on
|
||||||
the authorities. (Default: None).
|
the authorities. (Default: None).
|
||||||
|
@ -83,6 +83,7 @@ static config_abbrev_t _option_abbrevs[] = {
|
|||||||
{ "ResolvConf", "ServerDNSResolvConfFile", 0, 1},
|
{ "ResolvConf", "ServerDNSResolvConfFile", 0, 1},
|
||||||
{ "SearchDomains", "ServerDNSSearchDomains", 0, 1},
|
{ "SearchDomains", "ServerDNSSearchDomains", 0, 1},
|
||||||
{ "PreferTunnelledDirConns", "PreferTunneledDirConns", 0, 0},
|
{ "PreferTunnelledDirConns", "PreferTunneledDirConns", 0, 0},
|
||||||
|
{ "BridgeAuthoritativeDirectory", "BridgeAuthoritativeDir", 0, 0},
|
||||||
{ NULL, NULL, 0, 0},
|
{ NULL, NULL, 0, 0},
|
||||||
};
|
};
|
||||||
/* A list of state-file abbreviations, for compatibility. */
|
/* A list of state-file abbreviations, for compatibility. */
|
||||||
|
@ -1745,6 +1745,8 @@ static const getinfo_item_t getinfo_items[] = {
|
|||||||
"Brief summary of router status by ID (v2 directory format)."),
|
"Brief summary of router status by ID (v2 directory format)."),
|
||||||
PREFIX("ns/name/", networkstatus,
|
PREFIX("ns/name/", networkstatus,
|
||||||
"Brief summary of router status by nickname (v2 directory format)."),
|
"Brief summary of router status by nickname (v2 directory format)."),
|
||||||
|
PREFIX("ns/purpose/", networkstatus,
|
||||||
|
"Brief summary of router status by purpose (v2 directory format)."),
|
||||||
|
|
||||||
PREFIX("unregistered-servers-", dirserv_unregistered, NULL),
|
PREFIX("unregistered-servers-", dirserv_unregistered, NULL),
|
||||||
ITEM("network-status", dir,
|
ITEM("network-status", dir,
|
||||||
|
@ -119,8 +119,6 @@ int has_completed_circuit=0;
|
|||||||
/** How long do we let OR connections handshake before we decide that
|
/** How long do we let OR connections handshake before we decide that
|
||||||
* they are obsolete? */
|
* they are obsolete? */
|
||||||
#define TLS_HANDSHAKE_TIMEOUT (60)
|
#define TLS_HANDSHAKE_TIMEOUT (60)
|
||||||
/** How often do we write hidden service usage statistics to disk? */
|
|
||||||
#define WRITE_HSUSAGE_INTERVAL (900)
|
|
||||||
|
|
||||||
/********* END VARIABLES ************/
|
/********* END VARIABLES ************/
|
||||||
|
|
||||||
@ -830,7 +828,10 @@ run_scheduled_events(time_t now)
|
|||||||
static time_t time_to_try_getting_descriptors = 0;
|
static time_t time_to_try_getting_descriptors = 0;
|
||||||
static time_t time_to_reset_descriptor_failures = 0;
|
static time_t time_to_reset_descriptor_failures = 0;
|
||||||
static time_t time_to_add_entropy = 0;
|
static time_t time_to_add_entropy = 0;
|
||||||
|
#define WRITE_HSUSAGE_INTERVAL (30*60)
|
||||||
static time_t time_to_write_hs_statistics = 0;
|
static time_t time_to_write_hs_statistics = 0;
|
||||||
|
#define BRIDGE_STATUSFILE_INTERVAL (30*60)
|
||||||
|
static time_t time_to_write_bridge_status_file = 0;
|
||||||
static time_t time_to_downrate_stability = 0;
|
static time_t time_to_downrate_stability = 0;
|
||||||
#define SAVE_STABILITY_INTERVAL (30*60)
|
#define SAVE_STABILITY_INTERVAL (30*60)
|
||||||
static time_t time_to_save_stability = 0;
|
static time_t time_to_save_stability = 0;
|
||||||
@ -1111,6 +1112,12 @@ run_scheduled_events(time_t now)
|
|||||||
hs_usage_write_statistics_to_file(now);
|
hs_usage_write_statistics_to_file(now);
|
||||||
time_to_write_hs_statistics = now+WRITE_HSUSAGE_INTERVAL;
|
time_to_write_hs_statistics = now+WRITE_HSUSAGE_INTERVAL;
|
||||||
}
|
}
|
||||||
|
/** 10b. write bridge networkstatus file to disk */
|
||||||
|
if (options->BridgeAuthoritativeDir &&
|
||||||
|
time_to_write_bridge_status_file < now) {
|
||||||
|
hs_usage_write_statistics_to_file(now);
|
||||||
|
time_to_write_bridge_status_file = now+BRIDGE_STATUSFILE_INTERVAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Libevent timer: used to invoke second_elapsed_callback() once per
|
/** Libevent timer: used to invoke second_elapsed_callback() once per
|
||||||
|
@ -1685,9 +1685,8 @@ networkstatus_getinfo_helper_single(routerstatus_t *rs)
|
|||||||
* shouldn't use this for general-purpose routers, since those
|
* shouldn't use this for general-purpose routers, since those
|
||||||
* should be listed from the consensus, not from the routers list). */
|
* should be listed from the consensus, not from the routers list). */
|
||||||
char *
|
char *
|
||||||
networkstatus_getinfo_by_purpose(const char *purpose_string)
|
networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now)
|
||||||
{
|
{
|
||||||
time_t now = time(NULL);
|
|
||||||
time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH;
|
time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH;
|
||||||
char *answer;
|
char *answer;
|
||||||
routerlist_t *rl = router_get_routerlist();
|
routerlist_t *rl = router_get_routerlist();
|
||||||
@ -1720,6 +1719,21 @@ networkstatus_getinfo_by_purpose(const char *purpose_string)
|
|||||||
return answer;
|
return answer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Write out router status entries for all our bridge descriptors. */
|
||||||
|
void
|
||||||
|
networkstatus_dump_bridge_status_to_file(time_t now)
|
||||||
|
{
|
||||||
|
char *status = networkstatus_getinfo_by_purpose("bridge", now);
|
||||||
|
or_options_t *options = get_options();
|
||||||
|
size_t len = strlen(options->DataDirectory) + 32;
|
||||||
|
char *fname = tor_malloc(len);
|
||||||
|
tor_snprintf(fname, len, "%s"PATH_SEPARATOR"networkstatus-bridges",
|
||||||
|
options->DataDirectory);
|
||||||
|
write_str_to_file(fname,status,0);
|
||||||
|
tor_free(fname);
|
||||||
|
tor_free(status);
|
||||||
|
}
|
||||||
|
|
||||||
/** If <b>question</b> is a string beginning with "ns/" in a format the
|
/** If <b>question</b> is a string beginning with "ns/" in a format the
|
||||||
* control interface expects for a GETINFO question, set *<b>answer</b> to a
|
* control interface expects for a GETINFO question, set *<b>answer</b> to a
|
||||||
* newly-allocated string containing networkstatus lines for the appropriate
|
* newly-allocated string containing networkstatus lines for the appropriate
|
||||||
@ -1756,7 +1770,7 @@ getinfo_helper_networkstatus(control_connection_t *conn,
|
|||||||
} else if (!strcmpstart(question, "ns/name/")) {
|
} else if (!strcmpstart(question, "ns/name/")) {
|
||||||
status = router_get_consensus_status_by_nickname(question+8, 0);
|
status = router_get_consensus_status_by_nickname(question+8, 0);
|
||||||
} else if (!strcmpstart(question, "ns/purpose/")) {
|
} else if (!strcmpstart(question, "ns/purpose/")) {
|
||||||
*answer = networkstatus_getinfo_by_purpose(question+11);
|
*answer = networkstatus_getinfo_by_purpose(question+11, time(NULL));
|
||||||
return *answer ? 0 : -1;
|
return *answer ? 0 : -1;
|
||||||
} else {
|
} else {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -3361,7 +3361,7 @@ void signed_descs_update_status_from_consensus_networkstatus(
|
|||||||
smartlist_t *descs);
|
smartlist_t *descs);
|
||||||
|
|
||||||
char *networkstatus_getinfo_helper_single(routerstatus_t *rs);
|
char *networkstatus_getinfo_helper_single(routerstatus_t *rs);
|
||||||
char *networkstatus_getinfo_by_purpose(const char *purpose_string);
|
char *networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now);
|
||||||
int getinfo_helper_networkstatus(control_connection_t *conn,
|
int getinfo_helper_networkstatus(control_connection_t *conn,
|
||||||
const char *question, char **answer);
|
const char *question, char **answer);
|
||||||
void networkstatus_free_all(void);
|
void networkstatus_free_all(void);
|
||||||
|
@ -2153,21 +2153,21 @@ hs_usage_format_statistics(void)
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Writes current statistics to file. */
|
/** Write current statistics about hidden service usage to file. */
|
||||||
void
|
void
|
||||||
hs_usage_write_statistics_to_file(time_t now)
|
hs_usage_write_statistics_to_file(time_t now)
|
||||||
{
|
{
|
||||||
char *buf;
|
char *buf;
|
||||||
size_t len;
|
size_t len;
|
||||||
char *fname;
|
char *fname;
|
||||||
or_options_t *options;
|
or_options_t *options = get_options();
|
||||||
/* check if we are up-to-date */
|
/* check if we are up-to-date */
|
||||||
hs_usage_check_if_current_period_is_up_to_date(now);
|
hs_usage_check_if_current_period_is_up_to_date(now);
|
||||||
buf = hs_usage_format_statistics();
|
buf = hs_usage_format_statistics();
|
||||||
options = get_options();
|
|
||||||
len = strlen(options->DataDirectory) + 16;
|
len = strlen(options->DataDirectory) + 16;
|
||||||
fname = tor_malloc(len);
|
fname = tor_malloc(len);
|
||||||
tor_snprintf(fname,len, "%s"PATH_SEPARATOR"hsusage", options->DataDirectory);
|
tor_snprintf(fname, len, "%s"PATH_SEPARATOR"hsusage",
|
||||||
|
options->DataDirectory);
|
||||||
write_str_to_file(fname,buf,0);
|
write_str_to_file(fname,buf,0);
|
||||||
tor_free(buf);
|
tor_free(buf);
|
||||||
tor_free(fname);
|
tor_free(fname);
|
||||||
|
Loading…
Reference in New Issue
Block a user