[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [metrics-web/master] Move all graphs and tables to their own subpage.
commit bfced2c6ea12fdc10c1d5fed031edec87f56e97f
Author: Karsten Loesing <karsten.loesing@xxxxxxx>
Date: Thu Nov 20 11:44:58 2014 +0100
Move all graphs and tables to their own subpage.
---
website/etc/web.xml | 38 ++-
.../metrics/web/graphs/GraphsSubpagesServlet.java | 83 ++++--
.../web/graphs/LegacyGraphsSubpagesServlet.java | 54 ++++
website/web/WEB-INF/advbwdist-perc.jsp | 77 +++++
website/web/WEB-INF/advbwdist-relay.jsp | 69 +++++
website/web/WEB-INF/bandwidth-flags.jsp | 53 ++++
website/web/WEB-INF/bandwidth.jsp | 221 ++------------
website/web/WEB-INF/bubbles.jsp | 20 +-
website/web/WEB-INF/bwhist-flags.jsp | 50 ++++
website/web/WEB-INF/cloudbridges.jsp | 52 ++++
website/web/WEB-INF/connbidirect.jsp | 58 ++++
website/web/WEB-INF/dirbytes.jsp | 53 ++++
website/web/WEB-INF/network.jsp | 165 +----------
website/web/WEB-INF/networksize.jsp | 50 ++++
website/web/WEB-INF/oxford-anonymous-internet.jsp | 38 +++
website/web/WEB-INF/performance.jsp | 135 +--------
website/web/WEB-INF/platforms.jsp | 51 ++++
website/web/WEB-INF/relayflags.jsp | 59 ++++
website/web/WEB-INF/torperf-failures.jsp | 63 ++++
website/web/WEB-INF/torperf.jsp | 64 ++++
website/web/WEB-INF/users.jsp | 311 +-------------------
website/web/WEB-INF/userstats-bridge-country.jsp | 56 ++++
website/web/WEB-INF/userstats-bridge-table.jsp | 57 ++++
website/web/WEB-INF/userstats-bridge-transport.jsp | 60 ++++
website/web/WEB-INF/userstats-bridge-version.jsp | 54 ++++
.../web/WEB-INF/userstats-censorship-events.jsp | 60 ++++
website/web/WEB-INF/userstats-relay-country.jsp | 64 ++++
website/web/WEB-INF/userstats-relay-table.jsp | 57 ++++
website/web/WEB-INF/versions.jsp | 55 ++++
29 files changed, 1417 insertions(+), 810 deletions(-)
diff --git a/website/etc/web.xml b/website/etc/web.xml
index ee439f3..cc5d076 100644
--- a/website/etc/web.xml
+++ b/website/etc/web.xml
@@ -36,18 +36,40 @@
</servlet>
<servlet-mapping>
<servlet-name>GraphsSubpages</servlet-name>
- <url-pattern>/network.html</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>GraphsSubpages</servlet-name>
+ <url-pattern>/networksize.html</url-pattern>
+ <url-pattern>/relayflags.html</url-pattern>
+ <url-pattern>/versions.html</url-pattern>
+ <url-pattern>/platforms.html</url-pattern>
+ <url-pattern>/cloudbridges.html</url-pattern>
<url-pattern>/bandwidth.html</url-pattern>
+ <url-pattern>/bwhist-flags.html</url-pattern>
+ <url-pattern>/bandwidth-flags.html</url-pattern>
+ <url-pattern>/dirbytes.html</url-pattern>
+ <url-pattern>/advbwdist-perc.html</url-pattern>
+ <url-pattern>/advbwdist-relay.html</url-pattern>
+ <url-pattern>/userstats-relay-country.html</url-pattern>
+ <url-pattern>/userstats-relay-table.html</url-pattern>
+ <url-pattern>/userstats-censorship-events.html</url-pattern>
+ <url-pattern>/userstats-bridge-country.html</url-pattern>
+ <url-pattern>/userstats-bridge-table.html</url-pattern>
+ <url-pattern>/userstats-bridge-transport.html</url-pattern>
+ <url-pattern>/userstats-bridge-version.html</url-pattern>
+ <url-pattern>/oxford-anonymous-internet.html</url-pattern>
+ <url-pattern>/torperf.html</url-pattern>
+ <url-pattern>/torperf-failures.html</url-pattern>
+ <url-pattern>/connbidirect.html</url-pattern>
</servlet-mapping>
+
+ <servlet>
+ <servlet-name>LegacyGraphsSubpages</servlet-name>
+ <servlet-class>
+ org.torproject.metrics.web.graphs.LegacyGraphsSubpagesServlet
+ </servlet-class>
+ </servlet>
<servlet-mapping>
- <servlet-name>GraphsSubpages</servlet-name>
+ <servlet-name>LegacyGraphsSubpages</servlet-name>
+ <url-pattern>/network.html</url-pattern>
<url-pattern>/users.html</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>GraphsSubpages</servlet-name>
<url-pattern>/performance.html</url-pattern>
</servlet-mapping>
diff --git a/website/src/org/torproject/metrics/web/graphs/GraphsSubpagesServlet.java b/website/src/org/torproject/metrics/web/graphs/GraphsSubpagesServlet.java
index 6bbc5ca..1d8a1e5 100644
--- a/website/src/org/torproject/metrics/web/graphs/GraphsSubpagesServlet.java
+++ b/website/src/org/torproject/metrics/web/graphs/GraphsSubpagesServlet.java
@@ -4,13 +4,10 @@ package org.torproject.metrics.web.graphs;
import java.io.IOException;
import java.text.SimpleDateFormat;
-import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import java.util.TimeZone;
import javax.servlet.ServletException;
@@ -27,7 +24,7 @@ public class GraphsSubpagesServlet extends HttpServlet {
private Map<String, String> availableGraphsSubpages;
/* Available tables on graphs subpages. */
- private Map<String, Set<String>> availableGraphsSubpageTables;
+ private Map<String, String> availableGraphsSubpageTables;
/* Country codes and names for per-country graphs. */
private List<String[]> knownCountries;
@@ -37,20 +34,59 @@ public class GraphsSubpagesServlet extends HttpServlet {
public GraphsSubpagesServlet() {
this.availableGraphsSubpages = new HashMap<String, String>();
- this.availableGraphsSubpages.put("network.html",
- "WEB-INF/network.jsp");
+ this.availableGraphsSubpages.put("networksize.html",
+ "WEB-INF/networksize.jsp");
+ this.availableGraphsSubpages.put("relayflags.html",
+ "WEB-INF/relayflags.jsp");
+ this.availableGraphsSubpages.put("versions.html",
+ "WEB-INF/versions.jsp");
+ this.availableGraphsSubpages.put("platforms.html",
+ "WEB-INF/platforms.jsp");
+ this.availableGraphsSubpages.put("cloudbridges.html",
+ "WEB-INF/cloudbridges.jsp");
this.availableGraphsSubpages.put("bandwidth.html",
"WEB-INF/bandwidth.jsp");
- this.availableGraphsSubpages.put("users.html", "WEB-INF/users.jsp");
- this.availableGraphsSubpages.put("performance.html",
- "WEB-INF/performance.jsp");
-
- this.availableGraphsSubpageTables =
- new HashMap<String, Set<String>>();
- this.availableGraphsSubpageTables.put("users.html",
- new HashSet<String>(Arrays.asList((
- "direct-users,censorship-events,bridge-users,userstats-relay,"
- + "userstats-censorship-events,userstats-bridge").split(","))));
+ this.availableGraphsSubpages.put("bwhist-flags.html",
+ "WEB-INF/bwhist-flags.jsp");
+ this.availableGraphsSubpages.put("bandwidth-flags.html",
+ "WEB-INF/bandwidth-flags.jsp");
+ this.availableGraphsSubpages.put("dirbytes.html",
+ "WEB-INF/dirbytes.jsp");
+ this.availableGraphsSubpages.put("advbwdist-perc.html",
+ "WEB-INF/advbwdist-perc.jsp");
+ this.availableGraphsSubpages.put("advbwdist-relay.html",
+ "WEB-INF/advbwdist-relay.jsp");
+ this.availableGraphsSubpages.put("userstats-relay-country.html",
+ "WEB-INF/userstats-relay-country.jsp");
+ this.availableGraphsSubpages.put("userstats-relay-table.html",
+ "WEB-INF/userstats-relay-table.jsp");
+ this.availableGraphsSubpages.put("userstats-censorship-events.html",
+ "WEB-INF/userstats-censorship-events.jsp");
+ this.availableGraphsSubpages.put("userstats-bridge-country.html",
+ "WEB-INF/userstats-bridge-country.jsp");
+ this.availableGraphsSubpages.put("userstats-bridge-table.html",
+ "WEB-INF/userstats-bridge-table.jsp");
+ this.availableGraphsSubpages.put("userstats-bridge-transport.html",
+ "WEB-INF/userstats-bridge-transport.jsp");
+ this.availableGraphsSubpages.put("userstats-bridge-version.html",
+ "WEB-INF/userstats-bridge-version.jsp");
+ this.availableGraphsSubpages.put("oxford-anonymous-internet.html",
+ "WEB-INF/oxford-anonymous-internet.jsp");
+ this.availableGraphsSubpages.put("torperf.html",
+ "WEB-INF/torperf.jsp");
+ this.availableGraphsSubpages.put("torperf-failures.html",
+ "WEB-INF/torperf-failures.jsp");
+ this.availableGraphsSubpages.put("connbidirect.html",
+ "WEB-INF/connbidirect.jsp");
+
+ this.availableGraphsSubpageTables = new HashMap<String, String>();
+ this.availableGraphsSubpageTables.put("userstats-relay-table.html",
+ "userstats-relay");
+ this.availableGraphsSubpageTables.put(
+ "userstats-censorship-events.html",
+ "userstats-censorship-events");
+ this.availableGraphsSubpageTables.put("userstats-bridge-table.html",
+ "userstats-bridge");
this.knownCountries = Countries.getInstance().getCountryList();
}
@@ -131,14 +167,13 @@ public class GraphsSubpagesServlet extends HttpServlet {
* regardless of whether a table update was requested, and add the
* table data as request attribute. */
if (this.availableGraphsSubpageTables.containsKey(requestedPage)) {
- for (String tableName :
- this.availableGraphsSubpageTables.get(requestedPage)) {
- List<Map<String, String>> tableData = rObjectGenerator.
- generateTable(tableName, requestedTable,
- request.getParameterMap(), true);
- request.setAttribute(tableName.replaceAll("-", "_")
- + "_tabledata", tableData);
- }
+ String tableName = this.availableGraphsSubpageTables.get(
+ requestedPage);
+ List<Map<String, String>> tableData = rObjectGenerator.
+ generateTable(tableName, requestedTable,
+ request.getParameterMap(), true);
+ request.setAttribute(tableName.replaceAll("-", "_")
+ + "_tabledata", tableData);
}
/* Pass list of known countries in case we want to display them. */
diff --git a/website/src/org/torproject/metrics/web/graphs/LegacyGraphsSubpagesServlet.java b/website/src/org/torproject/metrics/web/graphs/LegacyGraphsSubpagesServlet.java
new file mode 100644
index 0000000..1fd1333
--- /dev/null
+++ b/website/src/org/torproject/metrics/web/graphs/LegacyGraphsSubpagesServlet.java
@@ -0,0 +1,54 @@
+/* Copyright 2014 The Tor Project
+ * See LICENSE for licensing information */
+package org.torproject.metrics.web.graphs;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@SuppressWarnings("serial")
+public class LegacyGraphsSubpagesServlet extends HttpServlet {
+
+ /* Available graphs subpages with corresponding JSP to which requests
+ * are forwarded. */
+ private Map<String, String> availableGraphsSubpages;
+
+ public LegacyGraphsSubpagesServlet() {
+ this.availableGraphsSubpages = new HashMap<String, String>();
+ this.availableGraphsSubpages.put("network.html",
+ "WEB-INF/network.jsp");
+ this.availableGraphsSubpages.put("users.html", "WEB-INF/users.jsp");
+ this.availableGraphsSubpages.put("performance.html",
+ "WEB-INF/performance.jsp");
+ }
+
+ public void doGet(HttpServletRequest request,
+ HttpServletResponse response) throws IOException, ServletException {
+
+ /* Find out which graph subpage was requested and look up which JSP
+ * handles this subpage. */
+ String requestedPage = request.getRequestURI();
+ if (requestedPage == null) {
+ response.sendError(HttpServletResponse.SC_BAD_REQUEST);
+ return;
+ }
+ if (requestedPage.contains("/")) {
+ requestedPage = requestedPage.substring(requestedPage.
+ lastIndexOf("/") + 1);
+ }
+ if (!availableGraphsSubpages.containsKey(requestedPage)) {
+ response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ return;
+ }
+ String jsp = availableGraphsSubpages.get(requestedPage);
+
+ /* Forward the request to the JSP that does all the hard work. */
+ request.getRequestDispatcher(jsp).forward(request, response);
+ }
+}
+
diff --git a/website/web/WEB-INF/advbwdist-perc.jsp b/website/web/WEB-INF/advbwdist-perc.jsp
new file mode 100644
index 0000000..aa015bd
--- /dev/null
+++ b/website/web/WEB-INF/advbwdist-perc.jsp
@@ -0,0 +1,77 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Advertised bandwidth distribution</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Advertised bandwidth distribution</h3>
+<br>
+<p>The following graph shows the distribution of advertised bandwidth in
+the network. In contrast to the graphs above, the following graph contains
+no sums of advertised bandwidths, but bandwidths of single relays.</p>
+<img src="advbwdist-perc.png${advbwdist_perc_url}"
+ width="576" height="360"
+ alt="Advertised bandwidth distribution graph">
+<form action="advbwdist-perc.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="advbwdist-perc">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(advbwdist_perc_start) == 0}">${default_start_date}</c:when><c:otherwise>${advbwdist_perc_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(advbwdist_perc_end) == 0}">${default_end_date}</c:when><c:otherwise>${advbwdist_perc_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ <label>Percentiles: </label>
+ <input type="checkbox" name="p" value="100"<c:if test="${fn:length(advbwdist_perc_p) == 0 or fn:contains(fn:join(advbwdist_perc_p, ','), '100')}"> checked</c:if>> 100 (maximum)
+ <input type="checkbox" name="p" value="99"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '99')}"> checked</c:if>> 99
+ <input type="checkbox" name="p" value="98"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '98')}"> checked</c:if>> 98
+ <input type="checkbox" name="p" value="97"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '97')}"> checked</c:if>> 97
+ <input type="checkbox" name="p" value="95"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '95')}"> checked</c:if>> 95
+ <input type="checkbox" name="p" value="91"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '91')}"> checked</c:if>> 91
+ <input type="checkbox" name="p" value="90"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '90')}"> checked</c:if>> 90
+ <input type="checkbox" name="p" value="80"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '80')}"> checked</c:if>> 80
+ <input type="checkbox" name="p" value="75"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '75')}"> checked</c:if>> 75 (3rd quartile)
+ <input type="checkbox" name="p" value="70"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '70')}"> checked</c:if>> 70
+ <input type="checkbox" name="p" value="60"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '60')}"> checked</c:if>> 60
+ <input type="checkbox" name="p" value="50"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '50')}"> checked</c:if>> 50 (median)
+ <input type="checkbox" name="p" value="40"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '40')}"> checked</c:if>> 40
+ <input type="checkbox" name="p" value="30"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '30')}"> checked</c:if>> 30
+ <input type="checkbox" name="p" value="25"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '25')}"> checked</c:if>> 25 (first quartile)
+ <input type="checkbox" name="p" value="20"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '20')}"> checked</c:if>> 20
+ <input type="checkbox" name="p" value="10"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '10,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',10,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',10') or (advbwdist_perc_p[0] == '10' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 10
+ <input type="checkbox" name="p" value="9"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '9,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',9,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',9') or (advbwdist_perc_p[0] == '9' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 9
+ <input type="checkbox" name="p" value="5"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '5,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',5,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',5') or (advbwdist_perc_p[0] == '5' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 5
+ <input type="checkbox" name="p" value="3"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '3,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',3,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',3') or (advbwdist_perc_p[0] == '3' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 3
+ <input type="checkbox" name="p" value="2"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '2,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',2,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',2') or (advbwdist_perc_p[0] == '2' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 2
+ <input type="checkbox" name="p" value="1"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '1,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',1,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',1') or (advbwdist_perc_p[0] == '1' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 1
+ <input type="checkbox" name="p" value="0"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '0,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',0,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',0') or (advbwdist_perc_p[0] == '0' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 0 (minimum)
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="advbwdist-perc.pdf${advbwdist_perc_url}">PDF</a> or
+<a href="advbwdist-perc.svg${advbwdist_perc_url}">SVG</a>.</p>
+<p><a href="stats/advbwdist.csv">CSV</a> file containing all data.</p>
+<br>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/advbwdist-relay.jsp b/website/web/WEB-INF/advbwdist-relay.jsp
new file mode 100644
index 0000000..afd45a5
--- /dev/null
+++ b/website/web/WEB-INF/advbwdist-relay.jsp
@@ -0,0 +1,69 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Advertised bandwidth of n-th fastest relays</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Advertised bandwidth of n-th fastest relays</h3>
+<br>
+<p>The following graph shows the advertised bandwidth of the n-th fastest
+relays in the network.</p>
+<img src="advbwdist-relay.png${advbwdist_relay_url}"
+ width="576" height="360"
+ alt="Advertised bandwidth of n-th fastest relays graph">
+<form action="advbwdist-relay.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="advbwdist-relay">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(advbwdist_relay_start) == 0}">${default_start_date}</c:when><c:otherwise>${advbwdist_relay_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(advbwdist_relay_end) == 0}">${default_end_date}</c:when><c:otherwise>${advbwdist_relay_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ <label>n-th fastest relays: </label>
+ <input type="checkbox" name="n" value="1"<c:if test="${fn:length(advbwdist_relay_n) == 0 or fn:contains(fn:join(advbwdist_relay_n, ','), '1,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '1')}"> checked</c:if>> 1
+ <input type="checkbox" name="n" value="2"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '2,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '2'))}"> checked</c:if>> 2
+ <input type="checkbox" name="n" value="3"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '3,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '3'))}"> checked</c:if>> 3
+ <input type="checkbox" name="n" value="5"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '5,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '5'))}"> checked</c:if>> 5
+ <input type="checkbox" name="n" value="10"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '10,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '10'))}"> checked</c:if>> 10
+ <input type="checkbox" name="n" value="20"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '20,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '20'))}"> checked</c:if>> 20
+ <input type="checkbox" name="n" value="30"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '30,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '30'))}"> checked</c:if>> 30
+ <input type="checkbox" name="n" value="50"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '50,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '50'))}"> checked</c:if>> 50
+ <input type="checkbox" name="n" value="100"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '100,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '100'))}"> checked</c:if>> 100
+ <input type="checkbox" name="n" value="200"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '200,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '200'))}"> checked</c:if>> 200
+ <input type="checkbox" name="n" value="300"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '300,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '300'))}"> checked</c:if>> 300
+ <input type="checkbox" name="n" value="500"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '500,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '500'))}"> checked</c:if>> 500
+ <input type="checkbox" name="n" value="1000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '1000')}"> checked</c:if>> 1000
+ <input type="checkbox" name="n" value="2000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '2000')}"> checked</c:if>> 2000
+ <input type="checkbox" name="n" value="3000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '3000')}"> checked</c:if>> 3000
+ <input type="checkbox" name="n" value="5000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '5000')}"> checked</c:if>> 5000
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="advbwdist-relay.pdf${advbwdist_relay_url}">PDF</a> or
+<a href="advbwdist-relay.svg${advbwdist_relay_url}">SVG</a>.</p>
+<p><a href="stats/advbwdist.csv">CSV</a> file containing all data.</p>
+<br>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/bandwidth-flags.jsp b/website/web/WEB-INF/bandwidth-flags.jsp
new file mode 100644
index 0000000..a8de13e
--- /dev/null
+++ b/website/web/WEB-INF/bandwidth-flags.jsp
@@ -0,0 +1,53 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Advertised bandwidth and bandwidth history by relay flags</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Advertised bandwidth and bandwidth history by relay flags</h3>
+<br>
+<p>The following graph shows the advertised bandwidth and bandwidth
+history of all relays with the Exit and/or Guard flags assigned by the
+directory authorities.
+Note that these sets possibly overlap with relays having both Exit and
+Guard flag.</p>
+<img src="bandwidth-flags.png${bandwidth_flags_url}"
+ width="576" height="360" alt="Advertised bandwidth and bandwidth history by relay flags graph">
+<form action="bandwidth-flags.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="bandwidth-flags">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(bandwidth_flags_start) == 0}">${default_start_date}</c:when><c:otherwise>${bandwidth_flags_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(bandwidth_flags_end) == 0}">${default_end_date}</c:when><c:otherwise>${bandwidth_flags_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="bandwidth-flags.pdf${bandwidth_flags_url}">PDF</a> or
+<a href="bandwidth-flags.svg${bandwidth_flags_url}">SVG</a>.</p>
+<p><a href="stats/bandwidth.csv">CSV</a> file containing all data.</p>
+<br>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/bandwidth.jsp b/website/web/WEB-INF/bandwidth.jsp
index 2882236..cc3aa6b 100644
--- a/website/web/WEB-INF/bandwidth.jsp
+++ b/website/web/WEB-INF/bandwidth.jsp
@@ -4,7 +4,7 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
- <title>Tor Metrics: Bandwidth</title>
+ <title>Tor Metrics: Total relay bandwidth in the network</title>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
<link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
@@ -13,12 +13,27 @@
<div class="center">
<%@ include file="banner.jsp"%>
<div class="main-column">
+
<h2>Tor Metrics: Bandwidth</h2>
<br>
+<p>The graphs on this page (except one) have moved to their own subpages.
+This is part of an effort to make navigation on this website more intuitive.
+In the future, this notice will go away, and all graphs/tables can be searched more easily from the start page.
+Sorry for any inconvenience caused by this.</p>
+
+<ul>
+<li>Graph: Total relay bandwidth in the network (see below)</li>
+<li><a href="bwhist-flags.html">Graph: Relay bandwidth by Exit and/or Guard flags</a></li>
+<li><a href="bandwidth-flags.html">Graph: Advertised bandwidth and bandwidth history by relay flags</a></li>
+<li><a href="dirbytes.html">Graph: Number of bytes spent on answering directory requests</a></li>
+<li><a href="advbwdist-perc.html">Graph: Advertised bandwidth distribution</a></li>
+<li><a href="advbwdist-relay.html">Graph: Advertised bandwidth of n-th fastest relays</a></li>
+</ul>
+<br>
+<hr>
+<br>
-<a name="bandwidth"></a>
-<h3><a href="#bandwidth" class="anchor">Total relay bandwidth in the
-network</a></h3>
+<h3>Tor Metrics: Total relay bandwidth in the network</h3>
<br>
<p>Relays report how much bandwidth they are willing to contribute and how
many bytes they have read and written in the past 24 hours. The following
@@ -26,7 +41,7 @@ graph shows total advertised bandwidth and bandwidth history of all relays
in the network.</p>
<img src="bandwidth.png${bandwidth_url}"
width="576" height="360" alt="Relay bandwidth graph">
-<form action="bandwidth.html#bandwidth">
+<form action="bandwidth.html">
<div class="formrow">
<input type="hidden" name="graph" value="bandwidth">
<p>
@@ -47,202 +62,6 @@ in the network.</p>
<p><a href="stats/bandwidth.csv">CSV</a> file containing all data.</p>
<br>
-<a name="bwhist-flags"></a>
-<h3><a href="#bwhist-flags" class="anchor">Relay bandwidth by Exit and/or
-Guard flags</a></h3>
-<br>
-<p>The following graph shows the relay bandwidth of all relays with the
-Exit and/or Guard flags assigned by the directory authorities.</p>
-<img src="bwhist-flags.png${bwhist_flags_url}"
- width="576" height="360" alt="Relay bandwidth by flags graph">
-<form action="bandwidth.html#bwhist-flags">
- <div class="formrow">
- <input type="hidden" name="graph" value="bwhist-flags">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(bwhist_flags_start) == 0}">${default_start_date}</c:when><c:otherwise>${bwhist_flags_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(bwhist_flags_end) == 0}">${default_end_date}</c:when><c:otherwise>${bwhist_flags_end[0]}</c:otherwise></c:choose>">
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="bwhist-flags.pdf${bwhist_flags_url}">PDF</a> or
-<a href="bwhist-flags.svg${bwhist_flags_url}">SVG</a>.</p>
-<p><a href="stats/bandwidth.csv">CSV</a> file containing all data.</p>
-<br>
-
-<a name="bandwidth-flags"></a>
-<h3><a href="#bandwidth-flags" class="anchor">Advertised bandwidth and
-bandwidth history by relay flags</a></h3>
-<br>
-<p>The following graph shows the advertised bandwidth and bandwidth
-history of all relays with the Exit and/or Guard flags assigned by the
-directory authorities.
-Note that these sets possibly overlap with relays having both Exit and
-Guard flag.</p>
-<img src="bandwidth-flags.png${bandwidth_flags_url}"
- width="576" height="360" alt="Advertised bandwidth and bandwidth history by relay flags graph">
-<form action="bandwidth.html#bandwidth-flags">
- <div class="formrow">
- <input type="hidden" name="graph" value="bandwidth-flags">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(bandwidth_flags_start) == 0}">${default_start_date}</c:when><c:otherwise>${bandwidth_flags_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(bandwidth_flags_end) == 0}">${default_end_date}</c:when><c:otherwise>${bandwidth_flags_end[0]}</c:otherwise></c:choose>">
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="bandwidth-flags.pdf${bandwidth_flags_url}">PDF</a> or
-<a href="bandwidth-flags.svg${bandwidth_flags_url}">SVG</a>.</p>
-<p><a href="stats/bandwidth.csv">CSV</a> file containing all data.</p>
-<br>
-
-<a name="dirbytes"></a>
-<h3><a href="#dirbytes" class="anchor">Number of bytes spent on answering
-directory requests</a></h3>
-<br>
-<p>Relays running on 0.2.2.15-alpha or higher report the number of bytes
-they spend on answering directory requests. The following graph shows
-total written and read bytes as well as written and read dir bytes. The
-dir bytes are extrapolated from those relays who report them to reflect
-the number of written and read dir bytes by all relays.</p>
-<img src="dirbytes.png${dirbytes_url}"
- width="576" height="360" alt="Dir bytes graph">
-<form action="bandwidth.html#dirbytes">
- <div class="formrow">
- <input type="hidden" name="graph" value="dirbytes">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(dirbytes_start) == 0}">${default_start_date}</c:when><c:otherwise>${dirbytes_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(dirbytes_end) == 0}">${default_end_date}</c:when><c:otherwise>${dirbytes_end[0]}</c:otherwise></c:choose>">
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="dirbytes.pdf${dirbytes_url}">PDF</a> or
-<a href="dirbytes.svg${dirbytes_url}">SVG</a>.</p>
-<p><a href="stats/bandwidth.csv">CSV</a> file containing all data.</p>
-<br>
-
-<a name="advbwdist-perc"></a>
-<h3><a href="#advbwdist-perc" class="anchor">Advertised bandwidth
-distribution</a></h3>
-<br>
-<p>The following graph shows the distribution of advertised bandwidth in
-the network. In contrast to the graphs above, the following graph contains
-no sums of advertised bandwidths, but bandwidths of single relays.</p>
-<img src="advbwdist-perc.png${advbwdist_perc_url}"
- width="576" height="360"
- alt="Advertised bandwidth distribution graph">
-<form action="bandwidth.html#advbwdist-perc">
- <div class="formrow">
- <input type="hidden" name="graph" value="advbwdist-perc">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(advbwdist_perc_start) == 0}">${default_start_date}</c:when><c:otherwise>${advbwdist_perc_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(advbwdist_perc_end) == 0}">${default_end_date}</c:when><c:otherwise>${advbwdist_perc_end[0]}</c:otherwise></c:choose>">
- </p><p>
- <label>Percentiles: </label>
- <input type="checkbox" name="p" value="100"<c:if test="${fn:length(advbwdist_perc_p) == 0 or fn:contains(fn:join(advbwdist_perc_p, ','), '100')}"> checked</c:if>> 100 (maximum)
- <input type="checkbox" name="p" value="99"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '99')}"> checked</c:if>> 99
- <input type="checkbox" name="p" value="98"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '98')}"> checked</c:if>> 98
- <input type="checkbox" name="p" value="97"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '97')}"> checked</c:if>> 97
- <input type="checkbox" name="p" value="95"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '95')}"> checked</c:if>> 95
- <input type="checkbox" name="p" value="91"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '91')}"> checked</c:if>> 91
- <input type="checkbox" name="p" value="90"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '90')}"> checked</c:if>> 90
- <input type="checkbox" name="p" value="80"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '80')}"> checked</c:if>> 80
- <input type="checkbox" name="p" value="75"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '75')}"> checked</c:if>> 75 (3rd quartile)
- <input type="checkbox" name="p" value="70"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '70')}"> checked</c:if>> 70
- <input type="checkbox" name="p" value="60"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '60')}"> checked</c:if>> 60
- <input type="checkbox" name="p" value="50"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '50')}"> checked</c:if>> 50 (median)
- <input type="checkbox" name="p" value="40"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '40')}"> checked</c:if>> 40
- <input type="checkbox" name="p" value="30"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '30')}"> checked</c:if>> 30
- <input type="checkbox" name="p" value="25"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '25')}"> checked</c:if>> 25 (first quartile)
- <input type="checkbox" name="p" value="20"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '20')}"> checked</c:if>> 20
- <input type="checkbox" name="p" value="10"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '10,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',10,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',10') or (advbwdist_perc_p[0] == '10' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 10
- <input type="checkbox" name="p" value="9"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '9,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',9,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',9') or (advbwdist_perc_p[0] == '9' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 9
- <input type="checkbox" name="p" value="5"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '5,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',5,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',5') or (advbwdist_perc_p[0] == '5' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 5
- <input type="checkbox" name="p" value="3"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '3,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',3,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',3') or (advbwdist_perc_p[0] == '3' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 3
- <input type="checkbox" name="p" value="2"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '2,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',2,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',2') or (advbwdist_perc_p[0] == '2' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 2
- <input type="checkbox" name="p" value="1"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '1,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',1,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',1') or (advbwdist_perc_p[0] == '1' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 1
- <input type="checkbox" name="p" value="0"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '0,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',0,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',0') or (advbwdist_perc_p[0] == '0' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 0 (minimum)
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="advbwdist-perc.pdf${advbwdist_perc_url}">PDF</a> or
-<a href="advbwdist-perc.svg${advbwdist_perc_url}">SVG</a>.</p>
-<p><a href="stats/advbwdist.csv">CSV</a> file containing all data.</p>
-<br>
-
-<a name="advbwdist-relay"></a>
-<h3><a href="#advbwdist-relay" class="anchor">Advertised bandwidth of
-n-th fastest relays</a></h3>
-<br>
-<p>The following graph shows the advertised bandwidth of the n-th fastest
-relays in the network.</p>
-<img src="advbwdist-relay.png${advbwdist_relay_url}"
- width="576" height="360"
- alt="Advertised bandwidth of n-th fastest relays graph">
-<form action="bandwidth.html#advbwdist-relay">
- <div class="formrow">
- <input type="hidden" name="graph" value="advbwdist-relay">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(advbwdist_relay_start) == 0}">${default_start_date}</c:when><c:otherwise>${advbwdist_relay_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(advbwdist_relay_end) == 0}">${default_end_date}</c:when><c:otherwise>${advbwdist_relay_end[0]}</c:otherwise></c:choose>">
- </p><p>
- <label>n-th fastest relays: </label>
- <input type="checkbox" name="n" value="1"<c:if test="${fn:length(advbwdist_relay_n) == 0 or fn:contains(fn:join(advbwdist_relay_n, ','), '1,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '1')}"> checked</c:if>> 1
- <input type="checkbox" name="n" value="2"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '2,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '2'))}"> checked</c:if>> 2
- <input type="checkbox" name="n" value="3"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '3,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '3'))}"> checked</c:if>> 3
- <input type="checkbox" name="n" value="5"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '5,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '5'))}"> checked</c:if>> 5
- <input type="checkbox" name="n" value="10"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '10,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '10'))}"> checked</c:if>> 10
- <input type="checkbox" name="n" value="20"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '20,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '20'))}"> checked</c:if>> 20
- <input type="checkbox" name="n" value="30"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '30,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '30'))}"> checked</c:if>> 30
- <input type="checkbox" name="n" value="50"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '50,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '50'))}"> checked</c:if>> 50
- <input type="checkbox" name="n" value="100"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '100,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '100'))}"> checked</c:if>> 100
- <input type="checkbox" name="n" value="200"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '200,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '200'))}"> checked</c:if>> 200
- <input type="checkbox" name="n" value="300"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '300,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '300'))}"> checked</c:if>> 300
- <input type="checkbox" name="n" value="500"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '500,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '500'))}"> checked</c:if>> 500
- <input type="checkbox" name="n" value="1000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '1000')}"> checked</c:if>> 1000
- <input type="checkbox" name="n" value="2000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '2000')}"> checked</c:if>> 2000
- <input type="checkbox" name="n" value="3000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '3000')}"> checked</c:if>> 3000
- <input type="checkbox" name="n" value="5000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '5000')}"> checked</c:if>> 5000
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="advbwdist-relay.pdf${advbwdist_relay_url}">PDF</a> or
-<a href="advbwdist-relay.svg${advbwdist_relay_url}">SVG</a>.</p>
-<p><a href="stats/advbwdist.csv">CSV</a> file containing all data.</p>
-<br>
</div>
</div>
<div class="bottom" id="bottom">
diff --git a/website/web/WEB-INF/bubbles.jsp b/website/web/WEB-INF/bubbles.jsp
index 6afa1fe..5c011c1 100644
--- a/website/web/WEB-INF/bubbles.jsp
+++ b/website/web/WEB-INF/bubbles.jsp
@@ -2,7 +2,7 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
- <title>Tor Metrics: Diversity</title>
+ <title>Tor Metrics: Network bubble graphs</title>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
<link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
@@ -13,10 +13,22 @@
<div class="center">
<%@ include file="banner.jsp"%>
<div class="main-column">
+
<h2>Tor Metrics: Diversity</h2>
<br>
-<a name="bubbles"></a>
-<h3><a href="#bubbles" class="anchor">Network bubble graphs</a></h3>
+<p>The graph on this page will soon move to its own subpages.
+This is part of an effort to make navigation on this website more intuitive.
+In the future, this notice will go away, and all graphs/tables can be searched more easily from the start page.
+Sorry for any inconvenience caused by this.</p>
+
+<ul>
+<li>Graph: Network bubble graphs (see below)</li>
+</ul>
+<br>
+<hr>
+<br>
+
+<h3>Tor Metrics: Network bubble graphs</h3>
<br>
<p>
All relays:
@@ -36,6 +48,7 @@
</p>
<script>make_bubble_graph();</script>
<noscript>Sorry, you need to turn on JavaScript.</script>
+
</div>
</div>
<div class="bottom" id="bottom">
@@ -43,3 +56,4 @@
</div>
</body>
</html>
+
diff --git a/website/web/WEB-INF/bwhist-flags.jsp b/website/web/WEB-INF/bwhist-flags.jsp
new file mode 100644
index 0000000..3e1396a
--- /dev/null
+++ b/website/web/WEB-INF/bwhist-flags.jsp
@@ -0,0 +1,50 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Relay bandwidth by Exit and/or Guard flags</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Relay bandwidth by Exit and/or Guard flags</h3>
+<br>
+<p>The following graph shows the relay bandwidth of all relays with the
+Exit and/or Guard flags assigned by the directory authorities.</p>
+<img src="bwhist-flags.png${bwhist_flags_url}"
+ width="576" height="360" alt="Relay bandwidth by flags graph">
+<form action="bwhist-flags.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="bwhist-flags">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(bwhist_flags_start) == 0}">${default_start_date}</c:when><c:otherwise>${bwhist_flags_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(bwhist_flags_end) == 0}">${default_end_date}</c:when><c:otherwise>${bwhist_flags_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="bwhist-flags.pdf${bwhist_flags_url}">PDF</a> or
+<a href="bwhist-flags.svg${bwhist_flags_url}">SVG</a>.</p>
+<p><a href="stats/bandwidth.csv">CSV</a> file containing all data.</p>
+<br>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/cloudbridges.jsp b/website/web/WEB-INF/cloudbridges.jsp
new file mode 100644
index 0000000..2907bfe
--- /dev/null
+++ b/website/web/WEB-INF/cloudbridges.jsp
@@ -0,0 +1,52 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Tor Cloud bridges</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<a name="cloudbridges"></a>
+<h3>Tor Metrics: Tor Cloud bridges</h3>
+<br>
+<p>The following graph shows the average daily number of
+<a href="http://cloud.torproject.org/">Tor Cloud</a> bridges in the
+network.</p>
+<img src="cloudbridges.png${cloudbridges_url}"
+ width="576" height="360" alt="Tor Cloud bridges graph">
+<form action="cloudbridges.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="cloudbridges">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(cloudbridges_start) == 0}">${default_start_date}</c:when><c:otherwise>${cloudbridges_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(cloudbridges_end) == 0}">${default_end_date}</c:when><c:otherwise>${cloudbridges_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="cloudbridges.pdf${cloudbridges_url}">PDF</a> or
+<a href="cloudbridges.svg${cloudbridges_url}">SVG</a>.</p>
+<p><a href="stats/servers.csv">CSV</a> file containing all data.</p>
+<br>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/connbidirect.jsp b/website/web/WEB-INF/connbidirect.jsp
new file mode 100644
index 0000000..46d91fd
--- /dev/null
+++ b/website/web/WEB-INF/connbidirect.jsp
@@ -0,0 +1,58 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Fraction of connections used uni-/bidirectionally</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Fraction of connections used uni-/bidirectionally</h3>
+<br>
+<p>The following graph shows the fraction of connections that is used
+uni- or bi-directionally. Every 10 seconds, relays determine for every
+connection whether they read and wrote less than a threshold of 20 KiB.
+Connections below this threshold are excluded from these statistics. For
+the remaining connections, relays report whether they read/wrote at least
+10 times as many bytes as they wrote/read. If so, they classify a
+connection as "Mostly reading" or "Mostly writing," respectively. All
+other connections are classified as "Both reading and writing." After
+classifying connections, read and write counters are reset for the next
+10-second interval. Statistics are aggregated over 24 hours.</p>
+<img src="connbidirect.png${connbidirect_url}"
+ width="576" height="360"
+ alt="Fraction of direct connections used uni-/bidirectionally">
+<form action="connbidirect.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="connbidirect">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(connbidirect_start) == 0}">${default_start_date}</c:when><c:otherwise>${connbidirect_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(connbidirect_end) == 0}">${default_end_date}</c:when><c:otherwise>${connbidirect_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="connbidirect.pdf${connbidirect_url}">PDF</a> or
+<a href="connbidirect.svg${connbidirect_url}">SVG</a>.</p>
+<p><a href="stats/connbidirect.csv">CSV</a> file containing all data.</p>
+<br>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/dirbytes.jsp b/website/web/WEB-INF/dirbytes.jsp
new file mode 100644
index 0000000..10ea40e
--- /dev/null
+++ b/website/web/WEB-INF/dirbytes.jsp
@@ -0,0 +1,53 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Number of bytes spent on answering directory requests</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Number of bytes spent on answering directory requests</h3>
+<br>
+<p>Relays running on 0.2.2.15-alpha or higher report the number of bytes
+they spend on answering directory requests. The following graph shows
+total written and read bytes as well as written and read dir bytes. The
+dir bytes are extrapolated from those relays who report them to reflect
+the number of written and read dir bytes by all relays.</p>
+<img src="dirbytes.png${dirbytes_url}"
+ width="576" height="360" alt="Dir bytes graph">
+<form action="dirbytes.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="dirbytes">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(dirbytes_start) == 0}">${default_start_date}</c:when><c:otherwise>${dirbytes_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(dirbytes_end) == 0}">${default_end_date}</c:when><c:otherwise>${dirbytes_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="dirbytes.pdf${dirbytes_url}">PDF</a> or
+<a href="dirbytes.svg${dirbytes_url}">SVG</a>.</p>
+<p><a href="stats/bandwidth.csv">CSV</a> file containing all data.</p>
+<br>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/network.jsp b/website/web/WEB-INF/network.jsp
index 830f3cc..ec18beb 100644
--- a/website/web/WEB-INF/network.jsp
+++ b/website/web/WEB-INF/network.jsp
@@ -15,163 +15,20 @@
<div class="main-column">
<h2>Tor Metrics: Servers</h2>
<br>
-<a name="networksize"></a>
-<h3><a href="#networksize" class="anchor">Relays and bridges in the
-network</a></h3>
-<br>
-<p>The following graph shows the average daily number of relays and
-bridges in the network.</p>
-<img src="networksize.png${networksize_url}"
- width="576" height="360" alt="Network size graph">
-<form action="network.html#networksize">
- <div class="formrow">
- <input type="hidden" name="graph" value="networksize">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(networksize_start) == 0}">${default_start_date}</c:when><c:otherwise>${networksize_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(networksize_end) == 0}">${default_end_date}</c:when><c:otherwise>${networksize_end[0]}</c:otherwise></c:choose>">
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="networksize.pdf${networksize_url}">PDF</a> or
-<a href="networksize.svg${networksize_url}">SVG</a>.</p>
-<p><a href="stats/servers.csv">CSV</a> file containing all data.</p>
-<br>
-
-<a name="relayflags"></a>
-<h3><a href="#relayflags" class="anchor">Relays with Exit, Fast, Guard,
-Stable, and HSDir flags</a></h3>
-<br>
-<p>The directory authorities assign certain flags to relays that clients
-use for their path selection decisions. The following graph shows the
-average number of relays with these flags assigned.</p>
-<img src="relayflags.png${relayflags_url}"
- width="576" height="360" alt="Relay flags graph">
-<form action="network.html#relayflags">
- <div class="formrow">
- <input type="hidden" name="graph" value="relayflags">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(relayflags_start) == 0}">${default_start_date}</c:when><c:otherwise>${relayflags_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(relayflags_end) == 0}">${default_end_date}</c:when><c:otherwise>${relayflags_end[0]}</c:otherwise></c:choose>">
- </p><p>
- <label>Relay flags: </label>
- <input type="checkbox" name="flag" value="Running"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Running')}"> checked</c:if>> Running
- <input type="checkbox" name="flag" value="Exit"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Exit')}"> checked</c:if>> Exit
- <input type="checkbox" name="flag" value="Fast"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Fast')}"> checked</c:if>> Fast
- <input type="checkbox" name="flag" value="Guard"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Guard')}"> checked</c:if>> Guard
- <input type="checkbox" name="flag" value="Stable"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Stable')}"> checked</c:if>> Stable
- <input type="checkbox" name="flag" value="HSDir"<c:if test="${fn:length(relayflags_flag) > 0 and fn:contains(fn:join(relayflags_flag, ','), 'HSDir')}"> checked</c:if>> HSDir
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="relayflags.pdf${relayflags_url}">PDF</a> or
-<a href="relayflags.svg${relayflags_url}">SVG</a>.</p>
-<p><a href="stats/servers.csv">CSV</a> file containing all data.</p>
-<br>
-<a name="versions"></a>
-<h3><a href="#versions" class="anchor">Relays by version</a></h3>
-<br>
-<p>Relays report the Tor version that they are running to the directory
-authorities. See the
-<a href="https://www.torproject.org/download/download.html.en">download
-page</a> and
-<a href="https://gitweb.torproject.org/tor.git/blob/HEAD:/ChangeLog">ChangeLog file</a>
-to find out which Tor versions are stable and unstable.
-The following graph shows the number of relays by version.</p>
-<img src="versions.png${versions_url}"
- width="576" height="360" alt="Relay versions graph">
-<form action="network.html#versions">
- <div class="formrow">
- <input type="hidden" name="graph" value="versions">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(versions_start) == 0}">${default_start_date}</c:when><c:otherwise>${versions_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(versions_end) == 0}">${default_end_date}</c:when><c:otherwise>${versions_end[0]}</c:otherwise></c:choose>">
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="versions.pdf${versions_url}">PDF</a> or
-<a href="versions.svg${versions_url}">SVG</a>.</p>
-<p><a href="stats/servers.csv">CSV</a> file containing all data.</p>
-<br>
+<p>The graphs on this page have moved to their own subpages.
+This is part of an effort to make navigation on this website more intuitive.
+In the future, this page will go away, and all graphs/tables can be searched more easily from the start page.
+Sorry for any inconvenience caused by this.</p>
-<a name="platforms"></a>
-<h3><a href="#platforms" class="anchor">Relays by platform</a></h3>
-<br>
-<p>Relays report the operating system they are running to the directory
-authorities. The following graph shows the number of relays by
-platform.</p>
-<img src="platforms.png${platforms_url}"
- width="576" height="360" alt="Relay platforms graph">
-<form action="network.html#platforms">
- <div class="formrow">
- <input type="hidden" name="graph" value="platforms">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(platforms_start) == 0}">${default_start_date}</c:when><c:otherwise>${platforms_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(platforms_end) == 0}">${default_end_date}</c:when><c:otherwise>${platforms_end[0]}</c:otherwise></c:choose>">
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="platforms.pdf${platforms_url}">PDF</a> or
-<a href="platforms.svg${platforms_url}">SVG</a>.</p>
-<p><a href="stats/servers.csv">CSV</a> file containing all data.</p>
-<br>
+<ul>
+<li><a href="networksize.html">Graph: Relays and bridges in the network</a></li>
+<li><a href="relayflags.html">Graph: Relays with Exit, Fast, Guard, Stable, and HSDir flags</a></li>
+<li><a href="versions.html">Graph: Relays by version</a></li>
+<li><a href="platforms.html">Graph: Relays by platform</a></li>
+<li><a href="cloudbridges.html">Graph: Tor Cloud bridges</a></li>
+</ul>
-<a name="cloudbridges"></a>
-<h3><a href="#cloudbridges" class="anchor">Tor Cloud bridges</a></h3>
-<br>
-<p>The following graph shows the average daily number of
-<a href="http://cloud.torproject.org/">Tor Cloud</a> bridges in the
-network.</p>
-<img src="cloudbridges.png${cloudbridges_url}"
- width="576" height="360" alt="Tor Cloud bridges graph">
-<form action="network.html#cloudbridges">
- <div class="formrow">
- <input type="hidden" name="graph" value="cloudbridges">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(cloudbridges_start) == 0}">${default_start_date}</c:when><c:otherwise>${cloudbridges_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(cloudbridges_end) == 0}">${default_end_date}</c:when><c:otherwise>${cloudbridges_end[0]}</c:otherwise></c:choose>">
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="cloudbridges.pdf${cloudbridges_url}">PDF</a> or
-<a href="cloudbridges.svg${cloudbridges_url}">SVG</a>.</p>
-<p><a href="stats/servers.csv">CSV</a> file containing all data.</p>
-<br>
</div>
</div>
<div class="bottom" id="bottom">
diff --git a/website/web/WEB-INF/networksize.jsp b/website/web/WEB-INF/networksize.jsp
new file mode 100644
index 0000000..fbdcc3a
--- /dev/null
+++ b/website/web/WEB-INF/networksize.jsp
@@ -0,0 +1,50 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Relays and bridges in the network</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Relays and bridges in the network</h3>
+<br>
+<p>The following graph shows the average daily number of relays and
+bridges in the network.</p>
+<img src="networksize.png${networksize_url}"
+ width="576" height="360" alt="Network size graph">
+<form action="networksize.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="networksize">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(networksize_start) == 0}">${default_start_date}</c:when><c:otherwise>${networksize_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(networksize_end) == 0}">${default_end_date}</c:when><c:otherwise>${networksize_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="networksize.pdf${networksize_url}">PDF</a> or
+<a href="networksize.svg${networksize_url}">SVG</a>.</p>
+<p><a href="stats/servers.csv">CSV</a> file containing all data.</p>
+<br>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/oxford-anonymous-internet.jsp b/website/web/WEB-INF/oxford-anonymous-internet.jsp
new file mode 100644
index 0000000..4eb361c
--- /dev/null
+++ b/website/web/WEB-INF/oxford-anonymous-internet.jsp
@@ -0,0 +1,38 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Tor users as percentage of larger Internet population</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Tor users as percentage of larger Internet population</h3>
+<br>
+<p>The Oxford Internet Institute made a cartogram visualization of Tor
+users as compared to the overall Internet population per country.
+They used the average number of Tor users from August 2012 to August 2013
+and put it in relation to total Internet users per country.
+Be sure to read up the
+<a href="http://geography.oii.ox.ac.uk/?page=tor">details and their
+conclusions</a>.</p>
+
+<a href="http://geography.oii.ox.ac.uk/?page=tor">
+<img src="images/oxford-anonymous-internet.png"
+ alt="The anonymous Internet">
+</a>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/performance.jsp b/website/web/WEB-INF/performance.jsp
index 4a87a55..cc958b9 100644
--- a/website/web/WEB-INF/performance.jsp
+++ b/website/web/WEB-INF/performance.jsp
@@ -12,134 +12,19 @@
<div class="center">
<%@ include file="banner.jsp"%>
<div class="main-column">
+
<h2>Tor Metrics: Performance</h2>
<br>
-<a name="torperf"></a>
-<h3><a href="#torperf" class="anchor">Time to download files over
-Tor</a></h3>
-<br>
-<p>The following graphs show the performance of the Tor network as
-experienced by its users. The graphs contain the average (median) time to
-request files of three different sizes over Tor as well as first and third
-quartile of request times. Medians and quartiles are calculated multiple
-times per day for completed days only, resulting in a delay of 1 to 1.5
-days before changes to network performance become visible in the
-graph.</p>
-<img src="torperf.png${torperf_url}"
- width="576" height="360" alt="Torperf graph">
-<form action="performance.html#torperf">
- <div class="formrow">
- <input type="hidden" name="graph" value="torperf">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(torperf_start) == 0}">${default_start_date}</c:when><c:otherwise>${torperf_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(torperf_end) == 0}">${default_end_date}</c:when><c:otherwise>${torperf_end[0]}</c:otherwise></c:choose>">
- </p><p>
- Source:
- <input type="radio" name="source" value="all"<c:if test="${fn:length(torperf_source) == 0 or torperf_source[0] eq 'all'}"> checked</c:if>> all
- <input type="radio" name="source" value="torperf"<c:if test="${torperf_source[0] eq 'torperf'}"> checked</c:if>> torperf
- <input type="radio" name="source" value="moria"<c:if test="${torperf_source[0] eq 'moria'}"> checked</c:if>> moria
- <input type="radio" name="source" value="siv"<c:if test="${torperf_source[0] eq 'siv'}"> checked</c:if>> siv
- </p><p>
- <label>File size: </label>
- <input type="radio" name="filesize" value="50kb"<c:if test="${fn:length(torperf_filesize) == 0 or torperf_filesize[0] eq '50kb'}"> checked</c:if>> 50 KiB
- <input type="radio" name="filesize" value="1mb"<c:if test="${torperf_filesize[0] eq '1mb'}"> checked</c:if>> 1 MiB
- <input type="radio" name="filesize" value="5mb"<c:if test="${torperf_filesize[0] eq '5mb'}"> checked</c:if>> 5 MiB
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="torperf.pdf${torperf_url}">PDF</a> or
-<a href="torperf.svg${torperf_url}">SVG</a>.</p>
-<p><a href="stats/torperf.csv">CSV</a> file containing all data.</p>
+<p>The graphs on this page have moved to their own subpages.
+This is part of an effort to make navigation on this website more intuitive.
+In the future, this page will go away, and all graphs/tables can be searched more easily from the start page.
+Sorry for any inconvenience caused by this.</p>
-<br>
-<a name="torperf-failures"></a>
-<h3><a href="#torperf-failures" class="anchor">Timeouts and failures of
-downloading files over Tor</a></h3>
-<br>
-<p>The following graphs show the fraction of timeouts and failures of
-downloading files over Tor as experienced by users.
-A timeout occurs when a 50 KiB (1 MiB, 5 MiB) download does not complete
-within 4:55 minutes (29:55 minutes, 59:55 minutes).
-A failure occurs when the download completes, but the response is smaller
-than 50 KiB (1 MiB, 5 MiB).</p>
-<img src="torperf-failures.png${torperf_failures_url}"
- width="576" height="360" alt="Torperf failures graph">
-<form action="performance.html#torperf-failures">
- <div class="formrow">
- <input type="hidden" name="graph" value="torperf-failures">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(torperf_failures_start) == 0}">${default_start_date}</c:when><c:otherwise>${torperf_failures_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(torperf_failures_end) == 0}">${default_end_date}</c:when><c:otherwise>${torperf_failures_end[0]}</c:otherwise></c:choose>">
- </p><p>
- Source:
- <input type="radio" name="source" value="all"<c:if test="${fn:length(torperf_failures_source) == 0 or torperf_failures_source[0] eq 'all'}"> checked</c:if>> all
- <input type="radio" name="source" value="torperf"<c:if test="${torperf_failures_source[0] eq 'torperf'}"> checked</c:if>> torperf
- <input type="radio" name="source" value="moria"<c:if test="${torperf_failures_source[0] eq 'moria'}"> checked</c:if>> moria
- <input type="radio" name="source" value="siv"<c:if test="${torperf_failures_source[0] eq 'siv'}"> checked</c:if>> siv
- </p><p>
- <label>File size: </label>
- <input type="radio" name="filesize" value="50kb"<c:if test="${fn:length(torperf_failures_filesize) == 0 or torperf_failures_filesize[0] eq '50kb'}"> checked</c:if>> 50 KiB
- <input type="radio" name="filesize" value="1mb"<c:if test="${torperf_failures_filesize[0] eq '1mb'}"> checked</c:if>> 1 MiB
- <input type="radio" name="filesize" value="5mb"<c:if test="${torperf_failures_filesize[0] eq '5mb'}"> checked</c:if>> 5 MiB
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="torperf-failures.pdf${torperf_failures_url}">PDF</a> or
-<a href="torperf-failures.svg${torperf_failures_url}">SVG</a>.</p>
-<p><a href="stats/torperf.csv">CSV</a> file containing all data.</p>
-
-<br>
-<a name="connbidirect"></a>
-<h3><a href="#connbidirect" class="anchor">Fraction of connections used
-uni-/bidirectionally</a></h3>
-<br>
-<p>The following graph shows the fraction of connections that is used
-uni- or bi-directionally. Every 10 seconds, relays determine for every
-connection whether they read and wrote less than a threshold of 20 KiB.
-Connections below this threshold are excluded from these statistics. For
-the remaining connections, relays report whether they read/wrote at least
-10 times as many bytes as they wrote/read. If so, they classify a
-connection as "Mostly reading" or "Mostly writing," respectively. All
-other connections are classified as "Both reading and writing." After
-classifying connections, read and write counters are reset for the next
-10-second interval. Statistics are aggregated over 24 hours.</p>
-<img src="connbidirect.png${connbidirect_url}"
- width="576" height="360"
- alt="Fraction of direct connections used uni-/bidirectionally">
-<form action="performance.html#connbidirect">
- <div class="formrow">
- <input type="hidden" name="graph" value="connbidirect">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(connbidirect_start) == 0}">${default_start_date}</c:when><c:otherwise>${connbidirect_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(connbidirect_end) == 0}">${default_end_date}</c:when><c:otherwise>${connbidirect_end[0]}</c:otherwise></c:choose>">
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="connbidirect.pdf${connbidirect_url}">PDF</a> or
-<a href="connbidirect.svg${connbidirect_url}">SVG</a>.</p>
-<p><a href="stats/connbidirect.csv">CSV</a> file containing all data.</p>
-<br>
+<ul>
+<li><a href="torperf.html">Graph: Time to download files over Tor</a></li>
+<li><a href="torperf-failures.html">Graph: Timeouts and failures of downloading files over Tor</a></li>
+<li><a href="connbidirect.html">Graph: Fraction of connections used uni-/bidirectionally</a></li>
+</ul>
</div>
</div>
diff --git a/website/web/WEB-INF/platforms.jsp b/website/web/WEB-INF/platforms.jsp
new file mode 100644
index 0000000..bac911f
--- /dev/null
+++ b/website/web/WEB-INF/platforms.jsp
@@ -0,0 +1,51 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Relays by platform</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Relays by platform</a></h3>
+<br>
+<p>Relays report the operating system they are running to the directory
+authorities. The following graph shows the number of relays by
+platform.</p>
+<img src="platforms.png${platforms_url}"
+ width="576" height="360" alt="Relay platforms graph">
+<form action="platforms.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="platforms">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(platforms_start) == 0}">${default_start_date}</c:when><c:otherwise>${platforms_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(platforms_end) == 0}">${default_end_date}</c:when><c:otherwise>${platforms_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="platforms.pdf${platforms_url}">PDF</a> or
+<a href="platforms.svg${platforms_url}">SVG</a>.</p>
+<p><a href="stats/servers.csv">CSV</a> file containing all data.</p>
+<br>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/relayflags.jsp b/website/web/WEB-INF/relayflags.jsp
new file mode 100644
index 0000000..2149b7c
--- /dev/null
+++ b/website/web/WEB-INF/relayflags.jsp
@@ -0,0 +1,59 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Relays with Exit, Fast, Guard, Stable, and HSDir flags</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Relays with Exit, Fast, Guard, Stable, and HSDir flags</h3>
+<br>
+<p>The directory authorities assign certain flags to relays that clients
+use for their path selection decisions. The following graph shows the
+average number of relays with these flags assigned.</p>
+<img src="relayflags.png${relayflags_url}"
+ width="576" height="360" alt="Relay flags graph">
+<form action="relayflags.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="relayflags">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(relayflags_start) == 0}">${default_start_date}</c:when><c:otherwise>${relayflags_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(relayflags_end) == 0}">${default_end_date}</c:when><c:otherwise>${relayflags_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ <label>Relay flags: </label>
+ <input type="checkbox" name="flag" value="Running"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Running')}"> checked</c:if>> Running
+ <input type="checkbox" name="flag" value="Exit"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Exit')}"> checked</c:if>> Exit
+ <input type="checkbox" name="flag" value="Fast"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Fast')}"> checked</c:if>> Fast
+ <input type="checkbox" name="flag" value="Guard"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Guard')}"> checked</c:if>> Guard
+ <input type="checkbox" name="flag" value="Stable"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Stable')}"> checked</c:if>> Stable
+ <input type="checkbox" name="flag" value="HSDir"<c:if test="${fn:length(relayflags_flag) > 0 and fn:contains(fn:join(relayflags_flag, ','), 'HSDir')}"> checked</c:if>> HSDir
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="relayflags.pdf${relayflags_url}">PDF</a> or
+<a href="relayflags.svg${relayflags_url}">SVG</a>.</p>
+<p><a href="stats/servers.csv">CSV</a> file containing all data.</p>
+<br>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/torperf-failures.jsp b/website/web/WEB-INF/torperf-failures.jsp
new file mode 100644
index 0000000..7c90f17
--- /dev/null
+++ b/website/web/WEB-INF/torperf-failures.jsp
@@ -0,0 +1,63 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Timeouts and failures of downloading files over Tor</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Timeouts and failures of downloading files over Tor</h3>
+<br>
+<p>The following graphs show the fraction of timeouts and failures of
+downloading files over Tor as experienced by users.
+A timeout occurs when a 50 KiB (1 MiB, 5 MiB) download does not complete
+within 4:55 minutes (29:55 minutes, 59:55 minutes).
+A failure occurs when the download completes, but the response is smaller
+than 50 KiB (1 MiB, 5 MiB).</p>
+<img src="torperf-failures.png${torperf_failures_url}"
+ width="576" height="360" alt="Torperf failures graph">
+<form action="torperf-failures.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="torperf-failures">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(torperf_failures_start) == 0}">${default_start_date}</c:when><c:otherwise>${torperf_failures_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(torperf_failures_end) == 0}">${default_end_date}</c:when><c:otherwise>${torperf_failures_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ Source:
+ <input type="radio" name="source" value="all"<c:if test="${fn:length(torperf_failures_source) == 0 or torperf_failures_source[0] eq 'all'}"> checked</c:if>> all
+ <input type="radio" name="source" value="torperf"<c:if test="${torperf_failures_source[0] eq 'torperf'}"> checked</c:if>> torperf
+ <input type="radio" name="source" value="moria"<c:if test="${torperf_failures_source[0] eq 'moria'}"> checked</c:if>> moria
+ <input type="radio" name="source" value="siv"<c:if test="${torperf_failures_source[0] eq 'siv'}"> checked</c:if>> siv
+ </p><p>
+ <label>File size: </label>
+ <input type="radio" name="filesize" value="50kb"<c:if test="${fn:length(torperf_failures_filesize) == 0 or torperf_failures_filesize[0] eq '50kb'}"> checked</c:if>> 50 KiB
+ <input type="radio" name="filesize" value="1mb"<c:if test="${torperf_failures_filesize[0] eq '1mb'}"> checked</c:if>> 1 MiB
+ <input type="radio" name="filesize" value="5mb"<c:if test="${torperf_failures_filesize[0] eq '5mb'}"> checked</c:if>> 5 MiB
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="torperf-failures.pdf${torperf_failures_url}">PDF</a> or
+<a href="torperf-failures.svg${torperf_failures_url}">SVG</a>.</p>
+<p><a href="stats/torperf.csv">CSV</a> file containing all data.</p>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/torperf.jsp b/website/web/WEB-INF/torperf.jsp
new file mode 100644
index 0000000..f9c717b
--- /dev/null
+++ b/website/web/WEB-INF/torperf.jsp
@@ -0,0 +1,64 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Time to download files over Tor</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Time to download files over Tor</h3>
+<br>
+<p>The following graphs show the performance of the Tor network as
+experienced by its users. The graphs contain the average (median) time to
+request files of three different sizes over Tor as well as first and third
+quartile of request times. Medians and quartiles are calculated multiple
+times per day for completed days only, resulting in a delay of 1 to 1.5
+days before changes to network performance become visible in the
+graph.</p>
+<img src="torperf.png${torperf_url}"
+ width="576" height="360" alt="Torperf graph">
+<form action="torperf.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="torperf">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(torperf_start) == 0}">${default_start_date}</c:when><c:otherwise>${torperf_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(torperf_end) == 0}">${default_end_date}</c:when><c:otherwise>${torperf_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ Source:
+ <input type="radio" name="source" value="all"<c:if test="${fn:length(torperf_source) == 0 or torperf_source[0] eq 'all'}"> checked</c:if>> all
+ <input type="radio" name="source" value="torperf"<c:if test="${torperf_source[0] eq 'torperf'}"> checked</c:if>> torperf
+ <input type="radio" name="source" value="moria"<c:if test="${torperf_source[0] eq 'moria'}"> checked</c:if>> moria
+ <input type="radio" name="source" value="siv"<c:if test="${torperf_source[0] eq 'siv'}"> checked</c:if>> siv
+ </p><p>
+ <label>File size: </label>
+ <input type="radio" name="filesize" value="50kb"<c:if test="${fn:length(torperf_filesize) == 0 or torperf_filesize[0] eq '50kb'}"> checked</c:if>> 50 KiB
+ <input type="radio" name="filesize" value="1mb"<c:if test="${torperf_filesize[0] eq '1mb'}"> checked</c:if>> 1 MiB
+ <input type="radio" name="filesize" value="5mb"<c:if test="${torperf_filesize[0] eq '5mb'}"> checked</c:if>> 5 MiB
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="torperf.pdf${torperf_url}">PDF</a> or
+<a href="torperf.svg${torperf_url}">SVG</a>.</p>
+<p><a href="stats/torperf.csv">CSV</a> file containing all data.</p>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/users.jsp b/website/web/WEB-INF/users.jsp
index b722564..79ffd9d 100644
--- a/website/web/WEB-INF/users.jsp
+++ b/website/web/WEB-INF/users.jsp
@@ -13,304 +13,25 @@
<div class="center">
<%@ include file="banner.jsp"%>
<div class="main-column">
-<h2>Tor Metrics: Users</h2>
-<br>
-
-<a name="userstats-relay-country"></a>
-<h3><a href="#userstats-relay-country" class="anchor">
-Direct users by country:
-</a></h3>
-
-<img src="userstats-relay-country.png${userstats_relay_country_url}"
- width="576" height="360" alt="Direct users by country graph">
-<form action="users.html#userstats-relay-country">
- <div class="formrow">
- <input type="hidden" name="graph" value="userstats-relay-country">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(userstats_relay_country_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_relay_country_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(userstats_relay_country_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_relay_country_end[0]}</c:otherwise></c:choose>">
- </p><p>
- Source: <select name="country">
- <option value="all"<c:if test="${userstats_relay_country_country[0] eq 'all'}"> selected</c:if>>All users</option>
- <c:forEach var="country" items="${countries}" >
- <option value="${country[0]}"<c:if test="${userstats_relay_country_country[0] eq country[0]}"> selected</c:if>>${country[1]}</option>
- </c:forEach>
- </select>
- </p><p>
- Show possible censorship events if available (<a
- href="http://research.torproject.org/techreports/detector-2011-09-09.pdf">BETA</a>)
- <select name="events">
- <option value="off">Off</option>
- <option value="on"<c:if test="${userstats_relay_country_events[0] eq 'on'}"> selected</c:if>>On: both points and expected range</option>
- <option value="points"<c:if test="${userstats_relay_country_events[0] eq 'points'}"> selected</c:if>>On: points only, no expected range</option>
- </select>
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="userstats-relay-country.pdf${userstats_relay_country_url}">PDF</a> or
-<a href="userstats-relay-country.svg${userstats_relay_country_url}">SVG</a>.
-<a href="stats/clients.csv">CSV</a> file containing user estimates.
-<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions
-and answers about users statistics</a></p>
-
-<hr>
-<a name="userstats-relay-table"></a>
-<h3><a href="#userstats-relay-table" class="anchor">
-Top-10 countries by directly connecting users:
-</a></h3>
-<form action="users.html#userstats-relay-table">
- <div class="formrow">
- <input type="hidden" name="table" value="userstats-relay">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(userstats_relay_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_relay_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(userstats_relay_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_relay_end[0]}</c:otherwise></c:choose>">
- </p><p>
- <input class="submit" type="submit" value="Update table">
- </p>
- </div>
-</form>
-<br>
-<table>
- <tr>
- <th>Country</th>
- <th>Mean daily users</th>
- </tr>
- <c:forEach var="row" items="${userstats_relay_tabledata}">
- <tr>
- <td><a href="users.html?graph=userstats-relay-country&country=${row['cc']}#userstats-relay-country">${row['country']}</a> </td>
- <td>${row['abs']} <c:if test="${row['rel'] != 'NA'}"> (<fmt:formatNumber type="number" minFractionDigits="2" value="${row['rel']}" /> %)</c:if></td>
- </tr>
- </c:forEach>
-</table>
-<p><a href="stats/clients.csv">CSV</a> file containing user estimates.
-<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions
-and answers about users statistics</a></p>
-
-<hr>
-<a name="userstats-censorship-events"></a>
-<h3><a href="#userstats-censorship-events" class="anchor">
-Top-10 countries by possible censorship events (<a
-href="http://research.torproject.org/techreports/detector-2011-09-09.pdf">BETA</a>):
-</a></h3>
-<form action="users.html#userstats-censorship-events">
- <div class="formrow">
- <input type="hidden" name="table" value="userstats-censorship-events">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(userstats_censorship_events_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_censorship_events_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(userstats_censorship_events_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_censorship_events_end[0]}</c:otherwise></c:choose>">
- </p><p>
- <input class="submit" type="submit" value="Update table">
- </p>
- </div>
-</form>
-<br>
-<table>
- <tr>
- <th>Country</th>
- <th>Downturns</th>
- <th>Upturns</th>
- </tr>
- <c:forEach var="row" items="${userstats_censorship_events_tabledata}">
- <tr>
- <td><a href="users.html?graph=userstats-relay-country&country=${row['cc']}&events=on#userstats-relay-country">${row['country']}</a> </td>
- <td>${row['downturns']}</td>
- <td>${row['upturns']}</td>
- </tr>
- </c:forEach>
-</table>
-<p><a href="stats/clients.csv">CSV</a> file containing user estimates.
-<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions
-and answers about users statistics</a></p>
-
-<hr>
-
-<a name="userstats-bridge-country"></a>
-<h3><a href="#userstats-bridge-country" class="anchor">
-Bridge users by country:
-</a></h3>
-
-<img src="userstats-bridge-country.png${userstats_bridge_country_url}"
- width="576" height="360" alt="Bridge users by country graph">
-<form action="users.html#userstats-bridge-country">
- <div class="formrow">
- <input type="hidden" name="graph" value="userstats-bridge-country">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(userstats_bridge_country_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_country_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(userstats_bridge_country_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_country_end[0]}</c:otherwise></c:choose>">
- </p><p>
- Source: <select name="country">
- <option value="all"<c:if test="${userstats_bridge_country_country[0] eq 'all'}"> selected</c:if>>All users</option>
- <c:forEach var="country" items="${countries}" >
- <option value="${country[0]}"<c:if test="${userstats_bridge_country_country[0] eq country[0]}"> selected</c:if>>${country[1]}</option>
- </c:forEach>
- </select>
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="userstats-bridge-country.pdf${userstats_bridge_country_url}">PDF</a> or
-<a href="userstats-bridge-country.svg${userstats_bridge_country_url}">SVG</a>.
-<a href="stats/clients.csv">CSV</a> file containing user estimates.
-<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions
-and answers about users statistics</a></p>
-<hr>
-<a name="userstats-bridge-table"></a>
-<h3><a href="#userstats-bridge-table" class="anchor">
-Top-10 countries by bridge users:
-</a></h3>
-<form action="users.html#userstats-bridge-table">
- <div class="formrow">
- <input type="hidden" name="table" value="userstats-bridge">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(userstats_bridge_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(userstats_bridge_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_end[0]}</c:otherwise></c:choose>">
- </p><p>
- <input class="submit" type="submit" value="Update table">
- </p>
- </div>
-</form>
+<h2>Tor Metrics: Users</h2>
<br>
-<table>
- <tr>
- <th>Country</th>
- <th>Mean daily users</th>
- </tr>
- <c:forEach var="row" items="${userstats_bridge_tabledata}">
- <tr>
- <td><a href="users.html?graph=userstats-bridge-country&country=${row['cc']}#userstats-bridge-country">${row['country']}</a> </td>
- <td>${row['abs']} <c:if test="${row['rel'] != 'NA'}"> (<fmt:formatNumber type="number" minFractionDigits="2" value="${row['rel']}" /> %)</c:if></td>
- </tr>
- </c:forEach>
-</table>
-<p><a href="stats/clients.csv">CSV</a> file containing user estimates.
-<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions
-and answers about users statistics</a></p>
-
-<hr>
-
-<a name="userstats-bridge-transport"></a>
-<h3><a href="#userstats-bridge-transport" class="anchor">
-Bridge users by transport:
-</a></h3>
-
-<img src="userstats-bridge-transport.png${userstats_bridge_transport_url}"
- width="576" height="360" alt="Bridge users by transport graph">
-<form action="users.html#userstats-bridge-transport">
- <div class="formrow">
- <input type="hidden" name="graph" value="userstats-bridge-transport">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(userstats_bridge_transport_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_transport_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(userstats_bridge_transport_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_transport_end[0]}</c:otherwise></c:choose>">
- </p><p>
- <label>Source: </label>
- <input type="checkbox" name="transport" value="<OR>"<c:if test="${fn:length(userstats_bridge_transport_transport) == 0 or fn:contains(fn:join(userstats_bridge_transport_transport, ','), '<OR>')}"> checked</c:if>> Default OR protocol
- <input type="checkbox" name="transport" value="obfs2"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'obfs2')}"> checked</c:if>> obfs2
- <input type="checkbox" name="transport" value="obfs3"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'obfs3')}"> checked</c:if>> obfs3
- <input type="checkbox" name="transport" value="websocket"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'websocket')}"> checked</c:if>> Flash proxy/websocket
- <input type="checkbox" name="transport" value="fte"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'fte')}"> checked</c:if>> FTE
- <input type="checkbox" name="transport" value="meek"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'meek')}"> checked</c:if>> meek
- <input type="checkbox" name="transport" value="scramblesuit"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'scramblesuit')}"> checked</c:if>> scramblesuit
- <input type="checkbox" name="transport" value="<??>"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), '<??>')}"> checked</c:if>> Unknown pluggable transport(s)
- <input type="checkbox" name="transport" value="!<OR>"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), '!<OR>')}"> checked</c:if>> Any pluggable transport
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="userstats-bridge-transport.pdf${userstats_bridge_transport_url}">PDF</a> or
-<a href="userstats-bridge-transport.svg${userstats_bridge_transport_url}">SVG</a>.
-<a href="stats/clients.csv">CSV</a> file containing user estimates.
-<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions
-and answers about users statistics</a></p>
-
-<hr>
-
-<a name="userstats-bridge-version"></a>
-<h3><a href="#userstats-bridge-version" class="anchor">
-Bridge users by IP version:
-</a></h3>
-
-<img src="userstats-bridge-version.png${userstats_bridge_version_url}"
- width="576" height="360" alt="Bridge users by IP version graph">
-<form action="users.html#userstats-bridge-version">
- <div class="formrow">
- <input type="hidden" name="graph" value="userstats-bridge-version">
- <p>
- <label>Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" size="10"
- value="<c:choose><c:when test="${fn:length(userstats_bridge_version_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_version_start[0]}</c:otherwise></c:choose>">
- <label>End date (yyyy-mm-dd):</label>
- <input type="text" name="end" size="10"
- value="<c:choose><c:when test="${fn:length(userstats_bridge_version_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_version_end[0]}</c:otherwise></c:choose>">
- </p><p>
- Source: <select name="version">
- <option value="v4"<c:if test="${userstats_bridge_version_version[0] eq 'v4'}"> selected</c:if>>IPv4</option>
- <option value="v6"<c:if test="${userstats_bridge_version_version[0] eq 'v6'}"> selected</c:if>>IPv6</option>
- </select>
- </p><p>
- <input class="submit" type="submit" value="Update graph">
- </p>
- </div>
-</form>
-<p>Download graph as
-<a href="userstats-bridge-version.pdf${userstats_bridge_version_url}">PDF</a> or
-<a href="userstats-bridge-version.svg${userstats_bridge_version_url}">SVG</a>.
-<a href="stats/clients.csv">CSV</a> file containing user estimates.
-<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions
-and answers about users statistics</a></p>
-
-<hr>
-
-<a name="oxford-anonymous-internet"></a>
-<h3><a href="#oxford-anonymous-internet" class="anchor">
-Tor users as percentage of larger Internet population
-</a></h3>
-
-<p>The Oxford Internet Institute made a cartogram visualization of Tor
-users as compared to the overall Internet population per country.
-They used the average number of Tor users from August 2012 to August 2013
-and put it in relation to total Internet users per country.
-Be sure to read up the
-<a href="http://geography.oii.ox.ac.uk/?page=tor">details and their
-conclusions</a>.</p>
-
-<a href="http://geography.oii.ox.ac.uk/?page=tor">
-<img src="images/oxford-anonymous-internet.png"
- alt="The anonymous Internet">
-</a>
-<hr>
+<p>The graphs and tables on this page have moved to their own subpages.
+This is part of an effort to make navigation on this website more intuitive.
+In the future, this page will go away, and all graphs/tables can be searched more easily from the start page.
+Sorry for any inconvenience caused by this.</p>
+
+<ul>
+<li><a href="userstats-relay-country.html">Graph: Direct users by country</a></li>
+<li><a href="userstats-relay-table.html">Table: Top-10 countries by directly connecting users</a></li>
+<li><a href="userstats-censorship-events.html">Table: Top-10 countries by possible censorship events</a></li>
+<li><a href="userstats-bridge-country.html">Graph: Bridge users by country</a></li>
+<li><a href="userstats-bridge-table.html">Table: Top-10 countries by bridge users</a></li>
+<li><a href="userstats-bridge-transport.html">Graph: Bridge users by transport</a></li>
+<li><a href="userstats-bridge-version.html">Graph: Bridge users by IP version</a></li>
+<li><a href="oxford-anonymous-internet.html">Link: Tor users as percentage of larger Internet population</a></li>
+</ul>
</div>
</div>
diff --git a/website/web/WEB-INF/userstats-bridge-country.jsp b/website/web/WEB-INF/userstats-bridge-country.jsp
new file mode 100644
index 0000000..ae64c3a
--- /dev/null
+++ b/website/web/WEB-INF/userstats-bridge-country.jsp
@@ -0,0 +1,56 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Bridge users by country</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Bridge users by country</h3>
+<br>
+<img src="userstats-bridge-country.png${userstats_bridge_country_url}"
+ width="576" height="360" alt="Bridge users by country graph">
+<form action="userstats-bridge-country.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="userstats-bridge-country">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(userstats_bridge_country_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_country_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(userstats_bridge_country_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_country_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ Source: <select name="country">
+ <option value="all"<c:if test="${userstats_bridge_country_country[0] eq 'all'}"> selected</c:if>>All users</option>
+ <c:forEach var="country" items="${countries}" >
+ <option value="${country[0]}"<c:if test="${userstats_bridge_country_country[0] eq country[0]}"> selected</c:if>>${country[1]}</option>
+ </c:forEach>
+ </select>
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="userstats-bridge-country.pdf${userstats_bridge_country_url}">PDF</a> or
+<a href="userstats-bridge-country.svg${userstats_bridge_country_url}">SVG</a>.
+<a href="stats/clients.csv">CSV</a> file containing user estimates.
+<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions
+and answers about users statistics</a></p>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/userstats-bridge-table.jsp b/website/web/WEB-INF/userstats-bridge-table.jsp
new file mode 100644
index 0000000..4e61728
--- /dev/null
+++ b/website/web/WEB-INF/userstats-bridge-table.jsp
@@ -0,0 +1,57 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Top-10 countries by bridge users</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Top-10 countries by bridge users</h3>
+<br>
+<form action="userstats-bridge-table.html">
+ <div class="formrow">
+ <input type="hidden" name="table" value="userstats-bridge">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(userstats_bridge_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(userstats_bridge_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ <input class="submit" type="submit" value="Update table">
+ </p>
+ </div>
+</form>
+<br>
+<table>
+ <tr>
+ <th>Country</th>
+ <th>Mean daily users</th>
+ </tr>
+ <c:forEach var="row" items="${userstats_bridge_tabledata}">
+ <tr>
+ <td><a href="users.html?graph=userstats-bridge-country&country=${row['cc']}#userstats-bridge-country">${row['country']}</a> </td>
+ <td>${row['abs']} <c:if test="${row['rel'] != 'NA'}"> (<fmt:formatNumber type="number" minFractionDigits="2" value="${row['rel']}" /> %)</c:if></td>
+ </tr>
+ </c:forEach>
+</table>
+<p><a href="stats/clients.csv">CSV</a> file containing user estimates.
+<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions
+and answers about users statistics</a></p>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/userstats-bridge-transport.jsp b/website/web/WEB-INF/userstats-bridge-transport.jsp
new file mode 100644
index 0000000..6cf1f6e
--- /dev/null
+++ b/website/web/WEB-INF/userstats-bridge-transport.jsp
@@ -0,0 +1,60 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Bridge users by transport</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Bridge users by transport</h3>
+<br>
+<img src="userstats-bridge-transport.png${userstats_bridge_transport_url}"
+ width="576" height="360" alt="Bridge users by transport graph">
+<form action="userstats-bridge-transport.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="userstats-bridge-transport">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(userstats_bridge_transport_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_transport_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(userstats_bridge_transport_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_transport_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ <label>Source: </label>
+ <input type="checkbox" name="transport" value="<OR>"<c:if test="${fn:length(userstats_bridge_transport_transport) == 0 or fn:contains(fn:join(userstats_bridge_transport_transport, ','), '<OR>')}"> checked</c:if>> Default OR protocol
+ <input type="checkbox" name="transport" value="obfs2"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'obfs2')}"> checked</c:if>> obfs2
+ <input type="checkbox" name="transport" value="obfs3"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'obfs3')}"> checked</c:if>> obfs3
+ <input type="checkbox" name="transport" value="websocket"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'websocket')}"> checked</c:if>> Flash proxy/websocket
+ <input type="checkbox" name="transport" value="fte"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'fte')}"> checked</c:if>> FTE
+ <input type="checkbox" name="transport" value="meek"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'meek')}"> checked</c:if>> meek
+ <input type="checkbox" name="transport" value="scramblesuit"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'scramblesuit')}"> checked</c:if>> scramblesuit
+ <input type="checkbox" name="transport" value="<??>"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), '<??>')}"> checked</c:if>> Unknown pluggable transport(s)
+ <input type="checkbox" name="transport" value="!<OR>"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), '!<OR>')}"> checked</c:if>> Any pluggable transport
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="userstats-bridge-transport.pdf${userstats_bridge_transport_url}">PDF</a> or
+<a href="userstats-bridge-transport.svg${userstats_bridge_transport_url}">SVG</a>.
+<a href="stats/clients.csv">CSV</a> file containing user estimates.
+<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions
+and answers about users statistics</a></p>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/userstats-bridge-version.jsp b/website/web/WEB-INF/userstats-bridge-version.jsp
new file mode 100644
index 0000000..b69454d
--- /dev/null
+++ b/website/web/WEB-INF/userstats-bridge-version.jsp
@@ -0,0 +1,54 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Bridge users by IP version</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Bridge users by IP version</h3>
+<br>
+<img src="userstats-bridge-version.png${userstats_bridge_version_url}"
+ width="576" height="360" alt="Bridge users by IP version graph">
+<form action="userstats-bridge-version.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="userstats-bridge-version">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(userstats_bridge_version_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_version_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(userstats_bridge_version_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_version_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ Source: <select name="version">
+ <option value="v4"<c:if test="${userstats_bridge_version_version[0] eq 'v4'}"> selected</c:if>>IPv4</option>
+ <option value="v6"<c:if test="${userstats_bridge_version_version[0] eq 'v6'}"> selected</c:if>>IPv6</option>
+ </select>
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="userstats-bridge-version.pdf${userstats_bridge_version_url}">PDF</a> or
+<a href="userstats-bridge-version.svg${userstats_bridge_version_url}">SVG</a>.
+<a href="stats/clients.csv">CSV</a> file containing user estimates.
+<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions
+and answers about users statistics</a></p>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/userstats-censorship-events.jsp b/website/web/WEB-INF/userstats-censorship-events.jsp
new file mode 100644
index 0000000..3c90214
--- /dev/null
+++ b/website/web/WEB-INF/userstats-censorship-events.jsp
@@ -0,0 +1,60 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Top-10 countries by possible censorship events</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Top-10 countries by possible censorship events (<a
+href="http://research.torproject.org/techreports/detector-2011-09-09.pdf">BETA</a>)</h3>
+<br>
+<form action="userstats-censorship-events.html">
+ <div class="formrow">
+ <input type="hidden" name="table" value="userstats-censorship-events">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(userstats_censorship_events_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_censorship_events_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(userstats_censorship_events_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_censorship_events_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ <input class="submit" type="submit" value="Update table">
+ </p>
+ </div>
+</form>
+<br>
+<table>
+ <tr>
+ <th>Country</th>
+ <th>Downturns</th>
+ <th>Upturns</th>
+ </tr>
+ <c:forEach var="row" items="${userstats_censorship_events_tabledata}">
+ <tr>
+ <td><a href="users.html?graph=userstats-relay-country&country=${row['cc']}&events=on#userstats-relay-country">${row['country']}</a> </td>
+ <td>${row['downturns']}</td>
+ <td>${row['upturns']}</td>
+ </tr>
+ </c:forEach>
+</table>
+<p><a href="stats/clients.csv">CSV</a> file containing user estimates.
+<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions
+and answers about users statistics</a></p>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/userstats-relay-country.jsp b/website/web/WEB-INF/userstats-relay-country.jsp
new file mode 100644
index 0000000..e010ea0
--- /dev/null
+++ b/website/web/WEB-INF/userstats-relay-country.jsp
@@ -0,0 +1,64 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Direct users by country</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Direct users by country</h3>
+<br>
+<img src="userstats-relay-country.png${userstats_relay_country_url}"
+ width="576" height="360" alt="Direct users by country graph">
+<form action="userstats-relay-country.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="userstats-relay-country">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(userstats_relay_country_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_relay_country_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(userstats_relay_country_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_relay_country_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ Source: <select name="country">
+ <option value="all"<c:if test="${userstats_relay_country_country[0] eq 'all'}"> selected</c:if>>All users</option>
+ <c:forEach var="country" items="${countries}" >
+ <option value="${country[0]}"<c:if test="${userstats_relay_country_country[0] eq country[0]}"> selected</c:if>>${country[1]}</option>
+ </c:forEach>
+ </select>
+ </p><p>
+ Show possible censorship events if available (<a
+ href="http://research.torproject.org/techreports/detector-2011-09-09.pdf">BETA</a>)
+ <select name="events">
+ <option value="off">Off</option>
+ <option value="on"<c:if test="${userstats_relay_country_events[0] eq 'on'}"> selected</c:if>>On: both points and expected range</option>
+ <option value="points"<c:if test="${userstats_relay_country_events[0] eq 'points'}"> selected</c:if>>On: points only, no expected range</option>
+ </select>
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="userstats-relay-country.pdf${userstats_relay_country_url}">PDF</a> or
+<a href="userstats-relay-country.svg${userstats_relay_country_url}">SVG</a>.
+<a href="stats/clients.csv">CSV</a> file containing user estimates.
+<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions
+and answers about users statistics</a></p>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/userstats-relay-table.jsp b/website/web/WEB-INF/userstats-relay-table.jsp
new file mode 100644
index 0000000..6e59cae
--- /dev/null
+++ b/website/web/WEB-INF/userstats-relay-table.jsp
@@ -0,0 +1,57 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Top-10 countries by directly connecting users</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Top-10 countries by directly connecting users</h3>
+<br>
+<form action="userstats-relay-table.html">
+ <div class="formrow">
+ <input type="hidden" name="table" value="userstats-relay">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(userstats_relay_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_relay_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(userstats_relay_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_relay_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ <input class="submit" type="submit" value="Update table">
+ </p>
+ </div>
+</form>
+<br>
+<table>
+ <tr>
+ <th>Country</th>
+ <th>Mean daily users</th>
+ </tr>
+ <c:forEach var="row" items="${userstats_relay_tabledata}">
+ <tr>
+ <td><a href="users.html?graph=userstats-relay-country&country=${row['cc']}#userstats-relay-country">${row['country']}</a> </td>
+ <td>${row['abs']} <c:if test="${row['rel'] != 'NA'}"> (<fmt:formatNumber type="number" minFractionDigits="2" value="${row['rel']}" /> %)</c:if></td>
+ </tr>
+ </c:forEach>
+</table>
+<p><a href="stats/clients.csv">CSV</a> file containing user estimates.
+<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions
+and answers about users statistics</a></p>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
diff --git a/website/web/WEB-INF/versions.jsp b/website/web/WEB-INF/versions.jsp
new file mode 100644
index 0000000..5e5490e
--- /dev/null
+++ b/website/web/WEB-INF/versions.jsp
@@ -0,0 +1,55 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics: Relays by version</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <%@ include file="banner.jsp"%>
+ <div class="main-column">
+
+<h3>Tor Metrics: Relays by version</h3>
+<br>
+<p>Relays report the Tor version that they are running to the directory
+authorities. See the
+<a href="https://www.torproject.org/download/download.html.en">download
+page</a> and
+<a href="https://gitweb.torproject.org/tor.git/blob/HEAD:/ChangeLog">ChangeLog file</a>
+to find out which Tor versions are stable and unstable.
+The following graph shows the number of relays by version.</p>
+<img src="versions.png${versions_url}"
+ width="576" height="360" alt="Relay versions graph">
+<form action="versions.html">
+ <div class="formrow">
+ <input type="hidden" name="graph" value="versions">
+ <p>
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
+ value="<c:choose><c:when test="${fn:length(versions_start) == 0}">${default_start_date}</c:when><c:otherwise>${versions_start[0]}</c:otherwise></c:choose>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
+ value="<c:choose><c:when test="${fn:length(versions_end) == 0}">${default_end_date}</c:when><c:otherwise>${versions_end[0]}</c:otherwise></c:choose>">
+ </p><p>
+ <input class="submit" type="submit" value="Update graph">
+ </p>
+ </div>
+</form>
+<p>Download graph as
+<a href="versions.pdf${versions_url}">PDF</a> or
+<a href="versions.svg${versions_url}">SVG</a>.</p>
+<p><a href="stats/servers.csv">CSV</a> file containing all data.</p>
+<br>
+
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <%@ include file="footer.jsp"%>
+ </div>
+</body>
+</html>
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits