JavaScript required
- Please enable JavaScript to use this service. If you are using Tor Browser on High Security mode, it is possible to enable JavaScript to run only on this page. Click the NoScript icon on your address bar and select "Temporarily allow all on this page". Relay Search only uses JavaScript resources that are hosted by the Tor Metrics team.
+ Please enable JavaScript to use this service. If you are using Tor Browser on High Security mode, it is possible to enable JavaScript to run only on this page. Click the NoScript
icon on your address bar and select "Temporarily allow all on this page". Relay Search only uses JavaScript resources that are hosted by the Tor Metrics team.
@@ -39,6 +39,6 @@
urlArgs: "v29"
};
-
+
+<% if(!aggregates) { %>
+ <% if(error == 0) { %>
+
+ <% } else if (error == 2) { %>
+
+
Backend error!
+
Relay Search is unable to get a response from its backend server. This
+ probably means that the backend server is unavailable right now. This
+ can also happen, however, if you did not format your query correctly.
+ Please have a look at the About page that explains
+ what type of search queries are supported by Relay Search.
+
+ <% } else if (error == 3) { %>
+
+
JavaScript Error!There is a problem with your
+ javascript environment, you may have noscript enabled on the remote
+ onionoo backend. Try temporarily allowing noscript to connect to the
+ backend IP address. If the problem persits consult the bugtracker.
+
+ <% } else if (error == 5) { %>
+
+
No query submitted!
+
The search query was found to be empty, which is not supported. You
+ must enter a search query in order to generate results. Please have a
+ look at the About page that explains what type of
+ search queries are supported by Relay Search.
+
+ <% } %>
+<% } else { %>
+
+
+
+
The aggregated search tool displays aggregated data about relays in the
+Tor network. It provides insight into diversity in the network and the
+probabilities of using relays in a particular country or AS as a guard, middle
+or exit relay. The results are restricted to only relays that were running at
+the last time the relays data was updated and do not include bridge data.
+
Information for relays was published: <%= relaysPublished %> UTC.
+<% } %>
+
diff --git a/src/main/resources/web/templates/rs/details/bridge.html b/src/main/resources/web/templates/rs/details/bridge.html
new file mode 100644
index 0000000..6eb7dcf
--- /dev/null
+++ b/src/main/resources/web/templates/rs/details/bridge.html
@@ -0,0 +1,204 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Information for bridges was published: <%= relay.get('bridgesPublished') %> UTC.
+
diff --git a/src/main/resources/web/templates/rs/details/error.html b/src/main/resources/web/templates/rs/details/error.html
new file mode 100644
index 0000000..2439927
--- /dev/null
+++ b/src/main/resources/web/templates/rs/details/error.html
@@ -0,0 +1,5 @@
+
diff --git a/src/main/resources/web/templates/rs/details/router.html b/src/main/resources/web/templates/rs/details/router.html
new file mode 100644
index 0000000..ef0508c
--- /dev/null
+++ b/src/main/resources/web/templates/rs/details/router.html
@@ -0,0 +1,307 @@
+
+ Details for: <%= relay.get('nickname') %>
+ <% if (relay.get('running') === false) { %>
+
+ <% } else { %>
+
+ <% } %>
+
+
+<% if (relay.get('new_relay') === true) {%>
+
This relay appears to be less than 2 weeks old.
This blog post explains the lifecycle of a new relay, and why it will not be immediately fully used to capacity.
+<% } %>
+<% if (relay.get('recommended_version') === false && relay.get('version_consistent') == true) { %>
+
This relay is running a version of Tor that is not recommended.
+It is most likely too old and may be missing important security fixes. If
+this is the case, and this is your relay, you should update it as soon as
+possible. Development versions (versions that are too new) will also trigger
+this warning message (see bug
#24256).
+<% } %>
+
+
+
Configuration
+
+ - Nickname
+ - <%= _.escape(relay.get('nickname')) %>
+
+ - OR Addresses ">
+ -
+
<% _.each(relay.get('or_addresses'),
+ function(or_address) { %><%= $.trim(or_address) %>
<% }); %>
+
+ <% if (relay.get('unreachable_or_addresses').length > 0) { %>
+ - Unreachable OR Addresses
+ -
+
<% _.each(relay.get('unreachable_or_addresses'),
+ function(or_address) { %><%= $.trim(or_address) %>
<% }); %>
+
+ <% } %>
+
+ - Contact
+ - <%= _.escape( relay.get('contact')!='undefined' ? relay.get('contact') : 'none' ) %>
+
+ - Dir Address
+ - <%= relay.get('dir_address') ? relay.get('dir_address') : 'none' %>
+
+ - Exit Addresses
+ -
+ <% if (relay.get('exit_addresses')) { %>
+ <% _.each(relay.get('exit_addresses'), function(exit_address) { %>
+ <%= exit_address %>
+ <% }); %>
+ <% } else { %>
+ none
+ <% } %>
+
+
+ -
+ Advertised Bandwidth
+
+ - <%= relay.get('bandwidth_hr') %>
+ - IPv4 Exit Policy Summary
+ -
+ <% if ('accept' in relay.get('exit_policy_summary')) { %>
+
accept<% _.each(relay.get('exit_policy_summary')['accept'],
+ function(ports) { %>
<%= $.trim(ports) %><% });} %>
+ <% if ('reject' in relay.get('exit_policy_summary')) { %>
+ reject<% _.each(relay.get('exit_policy_summary')['reject'],
+ function(ports) { %>
<%= $.trim(ports) %><% });} %>
+
+ - IPv6 Exit Policy Summary
+ -
+ <% if (relay.get('exit_policy_v6_summary') && ('accept' in relay.get('exit_policy_v6_summary'))) { %>
+
accept<% _.each(relay.get('exit_policy_v6_summary')['accept'],
+ function(ports) { %>
<%= $.trim(ports) %><% });} %>
+ <% if (relay.get('exit_policy_v6_summary') && ('reject' in relay.get('exit_policy_v6_summary'))) { %>
+ reject<% _.each(relay.get('exit_policy_v6_summary')['reject'],
+ function(ports) { %>
<%= $.trim(ports) %><% });} %>
+ <% if (relay.get('exit_policy_v6_summary') == null) { %>
+ reject
1-65535
+ <% } %>
+
+ - Exit Policy
+ -
+
<% _.each(relay.get('exit_policy'), function(line) { %>
+<%= $.trim(line) %><% }); %>
+
+
+
+
Effective Family Members
+ <% if (relay.get('effective_family') !== null) { %><% } %>
+
+ <% if (relay.get('effective_family') !== null) { %><% _.each(relay.get('effective_family'), function(member) { %><% var valid = member.match(RegExp("^[A-F0-9]{40}$")); %>
+<% if (valid) { %><% } %><%= member %><% if (valid) { %><% }}); %>
+<% } else { %>none<% } %>
+
+
Alleged Family Members
+
+ <% if (relay.get('alleged_family') !== null) { %><% _.each(relay.get('alleged_family'), function(member) { %><% var valid = member.match(RegExp("^[A-F0-9]{40}$")); %>
+<% if (valid) { %><% } %><%= member %><% if (valid) { %><% }}); %>
+<% } else { %>none<% } %>
+
+
+
+
+
+ <% if (relay.get('running') === true) { %>
+
Properties
+ <% } else { %>
+
Last Known Properties
+ <% } %>
+
+
+ - Fingerprint
+ <%= relay.get('fingerprint') %>
+
+ <% if (relay.get('running') === true) { %>
+ - Uptime
+ - <%= relay.get('uptime_hrfull') %>
+ <% } else { %>
+ - Downtime
+ - <%= relay.get('downtime') %>
+ - Last Seen
+ - <%= relay.get('last_seen') %>
+ <% } %>
+
+ - Flags
+ - <% _.each(relay.get('flags'), function(flag) { %>
+
+
+ <%= flag[0] %>
+
+ <% }); %>
+
+
+ - Additional Flags
+ -
+
-
+ <% var propertyCount = 0; %>
+ <% _.each(relay.get('additional_flags'), function(flag) { propertyCount++; %>
+
+
+ <%= flag[0] %>
+
+ <% }); %>
+ <%= propertyCount==0 ? 'none' : '' %>
+
+
+ - Host Name
+ - <% if (relay.get('host_name')) { %><%= relay.get('host_name') %><% } else { %>No PTR record found<% } %>
+
+ - Country
+ - <% if (relay.get('country')) { %> <%= relay.get('countryname') %><% } else { %>Unknown<% } %>
+
+ - AS Number
+ - <% if (relay.get('as_number') !== null) { %><%= _.escape(relay.get('as_number')) %><% } else { %>unknown<% }; %>
+
+ - AS Name
+ - <%= relay.get('as_name') ? _.escape(relay.get('as_name')) : "unknown" %>
+
+ - First Seen
+ - <%= relay.get('first_seen') %> (<%= relay.get('age') %>)
+
+ - Last Restarted
+ - <%= relay.get('last_restarted') %>
+
+
+ - Consensus Weight
+ - <%= relay.get('consensus_weight') %>
+
+ - Platform
+ - <%= _.escape(relay.get('platform')) %><% if (!relay.get('version_consistent')) { %> (version is <%= _.escape(relay.get('version')) %> in consensus)<% } %>
+
+
+
+
+
+
History
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<% if (relay.get('dir_address')) { %>
+
Advanced
+
+Latest server descriptor
+
+Latest extra-info descriptor
+
+<% } %>
+
+
+
+Information for relays was published: <%= relay.get('relaysPublished') %> UTC.
diff --git a/src/main/resources/web/templates/rs/search/do.html b/src/main/resources/web/templates/rs/search/do.html
new file mode 100644
index 0000000..71ec7be
--- /dev/null
+++ b/src/main/resources/web/templates/rs/search/do.html
@@ -0,0 +1,133 @@
+
+
+<% if(!relays) { %>
+ <% if(error == 0) { %>
+
+ <% } else if (error == 2) { %>
+
+
Backend error!
+
Relay Search is unable to get a response from its backend server. This
+ probably means that the backend server is unavailable right now. This
+ can also happen, however, if you did not format your query correctly.
+ Please have a look at the About page that explains
+ what type of search queries are supported by Relay Search.
+
+ <% } else if (error == 3) { %>
+
+
JavaScript Error!There is a problem with your
+ javascript environment, you may have noscript enabled on the remote
+ onionoo backend. Try temporarily allowing noscript to connect to the
+ backend IP address. If the problem persits consult the bugtracker.
+
+ <% } else if (error == 5) { %>
+
+
No query submitted!
+
The search query was found to be empty, which is not supported. You
+ must enter a search query in order to generate results. Please have a
+ look at the About page that explains what type of
+ search queries are supported by Relay Search.
+
+ <% } %>
+<% } else { %>
+ <% if (error == 4) { %>
+
+
Too many matches!The current version of
+ Relay Search does not support a result set greater than 2000 and only displays
+ the first 2000 hits. This is due to some performance issues in rendering
+ large results sets in JavaScript. Future versions will
+ hopefully manage to overcome this issue.
+ <% if ( ! query.includes("running:true") ) { %>
You may find it
+ useful to add
+ running:true
to your query to only return relays that are
+ currently running.
<% } %>
+
+ <% } %>
+
+
+
+
+
+ |
+ Nickname† |
+ Advertised Bandwidth |
+ Uptime |
+ Country |
+ IPv4 |
+ IPv6 |
+ Flags |
+ Add. Flags |
+ ORPort |
+ DirPort |
+ Type |
+
+
+
+
+<% _.each(relays, function(relay) { %>
+ class="danger"<% } %>>
+
+ <% if (relay.get('running') === false) { %>
+
+ <% } else { %>
+
+ <% } %>
+ |
+
+
+ <%= _.escape(relay.get('nickname')) %>
+ <% if (!relay.get('is_bridge')) { %>
+ (<%= relay.get('effective_family') == null ? 1 : relay.get('effective_family').length + 1 %>)
+ <% } %>
+
+ |
+ <%= relay.get('bandwidth_hr') %> |
+
+
+ <% if (relay.get('running') === false) { %><% } %><%= relay.get('uptime_hr') %><% if (relay.get('running') === false) { %><% } %>
+
+ |
+ <% if ( relay.get('country')) { %>
+
+
+ |
+ <% } else { %>
+ |
+ <% } %>
+ <%= relay.get('or_address') %> |
+ <%= (relay.get('or_v6_address')) ? relay.get('or_v6_address') : '-' %> |
+
+ <% _.each(relay.get('flags'), function(flag) { %><% }); %>
+ |
+
+ <% _.each(relay.get('additional_flags'), function(flag) { %><% }); %>
+ |
+ <%= relay.get('or_port') %> |
+ <%= relay.get('dir_port') %> |
+
+ <% if (relay.get('is_bridge')) { %>
+ Bridge
+ <% } else { %>
+ Relay
+ <% } %>
+ |
+
+<% }); %>
+
+
+
†The number shown in brackets is the total effective
+family size for the relay including the relay itself. A size of 1 indicates
+that the relay does not have any other effective family members. Note that
+bridge relays do not advertise family members in their descriptors and so there
+is no value shown for bridge relays.
+
Information for relays was published: <%= relaysPublished %> UTC.
+Information for bridges was published: <%= bridgesPublished %> UTC.
+<% } %>
+
+
diff --git a/src/main/resources/web/templates/rs/search/main.html b/src/main/resources/web/templates/rs/search/main.html
new file mode 100644
index 0000000..b69612c
--- /dev/null
+++ b/src/main/resources/web/templates/rs/search/main.html
@@ -0,0 +1,162 @@
+
+
+
+
The relay search tool displays data about single relays and bridges in the
+Tor network. It provides useful information on how relays are configured along
+with graphs about their past.
+
+
+
+
+
+
The aggregated search tool displays aggregated data about relays in the
+Tor network. It provides insight into diversity in the network and the
+probabilities of using relays in a particular country or AS as a guard, middle
+or exit relay. The results are restricted to only currently running relays and
+do not include bridge data.
+
+
+
+
+
+
+
The advanced search tool allows you to build advanced queries to search
+for data about single relays and bridges in the Tor network or aggregated data about currently running relays. For single relays, it provides useful
+information on how relays are configured along with graphs about their
+past. Aggregated data provides insight into diversity in the network and the
+probabilities of using relays in a particular country or AS as a guard, middle
+or exit relay filtered by the search parameters.
+
+
+
† These options are ignored when performing an aggregation as the aggregated searches are restricted to only currently running relays.
+
+
+
+
+
+
You can search for Tor relays and bridges by using keywords. In
+particular, this tool enables you to search for (partial) nicknames (e.g.,
+“moria”), IP addresses (e.g., “128.31.”), and
+fingerprints (e.g., “9695DFC3”). It is also
+possible to combine searches, e.g., “moria
+128.31.”. Finally, you can use qualifiers to search for relays in specific
+countries (e.g., “moria country:us”),
+with specific contact information (e.g., “contact:arma”), or with specific flags (e.g.,
+“flag:Authority”).
+
If you are searching for a bridge, you will need to search by the hashed
+fingerprint. This prevents leaking the fingerprint of the bridge when
+searching. You can find this in the hashed-fingerprint
file in the
+Tor data directory. On Debian systems, this is in /var/lib/tor
but
+may be in another location on your system. The location is specified as
+DataDirectory
in your torrc
.
+
+