[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [metrics-web/master] Discontinue TorStatus-like pages.
commit cfd767ed67d3bbc71d18e1bd3117d4a0faf97fac
Author: Karsten Loesing <karsten.loesing@xxxxxxx>
Date: Mon Feb 27 09:34:17 2012 +0100
Discontinue TorStatus-like pages.
These pages put more load on the database than they should. Good thing we
finally have a good TorStatus website.
---
.../torproject/ernie/web/NetworkStatusServlet.java | 145 -------
src/org/torproject/ernie/web/RelayServlet.java | 393 +-------------------
web/WEB-INF/banner.jsp | 4 -
web/WEB-INF/networkstatus.jsp | 22 +-
web/WEB-INF/relay.jsp | 23 ++
5 files changed, 29 insertions(+), 558 deletions(-)
diff --git a/src/org/torproject/ernie/web/NetworkStatusServlet.java b/src/org/torproject/ernie/web/NetworkStatusServlet.java
index c206a19..63d7895 100644
--- a/src/org/torproject/ernie/web/NetworkStatusServlet.java
+++ b/src/org/torproject/ernie/web/NetworkStatusServlet.java
@@ -1,162 +1,17 @@
package org.torproject.ernie.web;
import java.io.*;
-import java.sql.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
-import javax.naming.*;
import javax.servlet.*;
import javax.servlet.http.*;
-import javax.sql.*;
import org.apache.commons.lang.time.*;
public class NetworkStatusServlet extends HttpServlet {
- private DataSource ds;
-
- private Logger logger;
-
- /** Known parameter values for the sort parameter. */
- private Set<String> validSortParameterValues;
-
- /** Known parameter values for the order parameter. */
- private Set<String> validOrderParameterValues;
-
- public void init() {
-
- /* Initialize logger. */
- this.logger = Logger.getLogger(NetworkStatusServlet.class.toString());
-
- /* Look up data source. */
- try {
- Context cxt = new InitialContext();
- this.ds = (DataSource) cxt.lookup("java:comp/env/jdbc/tordir");
- this.logger.info("Successfully looked up data source.");
- } catch (NamingException e) {
- this.logger.log(Level.WARNING, "Could not look up data source", e);
- }
-
- /* Initialize known parameter values. */
- this.validSortParameterValues = new HashSet<String>(Arrays.asList((
- "nickname,bandwidth,orport,dirport,isbadexit,uptime").
- split(",")));
- this.validOrderParameterValues = new HashSet<String>(
- Arrays.asList(("desc,asc").split(",")));
-
- }
-
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
- /* Try to parse parameters and override them with defaults if we
- * cannot parse them. */
- String sortParameter = request.getParameter("sort");
- if (sortParameter != null) {
- sortParameter = sortParameter.toLowerCase();
- }
- if (sortParameter == null || sortParameter.length() < 1 ||
- !validSortParameterValues.contains(sortParameter)) {
- sortParameter = "nickname";
- }
- String orderParameter = request.getParameter("order");
- if (orderParameter != null) {
- orderParameter = orderParameter.toLowerCase();
- }
- if (orderParameter == null || orderParameter.length() < 1 ||
- !validOrderParameterValues.contains(orderParameter)) {
- orderParameter = "asc";
- }
-
- /* Initialize list containing the results. */
- List<Map<String, Object>> status =
- new ArrayList<Map<String, Object>>();
-
- /* Connect to the database and retrieve data set. */
- try {
- long requestedConnection = System.currentTimeMillis();
- Connection conn = this.ds.getConnection();
- Statement statement = conn.createStatement();
-
- String orderBy = ((sortParameter.equals("uptime") ||
- sortParameter.equals("platform"))
- ? "descriptor." : "statusentry.") + sortParameter;
- String query = "SELECT statusentry.validafter, "
- + "statusentry.nickname, statusentry.fingerprint, "
- + "statusentry.descriptor, statusentry.published, "
- + "statusentry.address, statusentry.orport, "
- + "statusentry.dirport, statusentry.isauthority, "
- + "statusentry.isbadexit, statusentry.isbaddirectory, "
- + "statusentry.isexit, statusentry.isfast, "
- + "statusentry.isguard, statusentry.ishsdir, "
- + "statusentry.isnamed, statusentry.isstable, "
- + "statusentry.isrunning, statusentry.isunnamed, "
- + "statusentry.isvalid, statusentry.isv2dir, "
- + "statusentry.isv3dir, statusentry.version, "
- + "statusentry.bandwidth, statusentry.ports, "
- + "statusentry.rawdesc, descriptor.uptime, "
- + "descriptor.platform FROM statusentry JOIN descriptor "
- + "ON descriptor.descriptor = statusentry.descriptor "
- + "WHERE statusentry.validafter = "
- + "(SELECT MAX(validafter) FROM consensus) "
- + "ORDER BY " + orderBy + " " + orderParameter.toUpperCase();
-
- ResultSet rs = statement.executeQuery(query);
-
- while (rs.next()) {
- Map<String, Object> row = new HashMap<String, Object>();
- row.put("validafter", rs.getTimestamp(1));
- row.put("nickname", rs.getString(2));
- row.put("fingerprint", rs.getString(3));
- row.put("descriptor", rs.getString(4));
- row.put("published", rs.getTimestamp(5));
- row.put("address", rs.getString(6));
- row.put("orport", rs.getInt(7));
- row.put("dirport", rs.getInt(8));
- row.put("isauthority", rs.getBoolean(9));
- row.put("isbadexit", rs.getBoolean(10));
- row.put("isbaddirectory", rs.getBoolean(11));
- row.put("isexit", rs.getBoolean(12));
- row.put("isfast", rs.getBoolean(13));
- row.put("isguard", rs.getBoolean(14));
- row.put("ishsdir", rs.getBoolean(15));
- row.put("isnamed", rs.getBoolean(16));
- row.put("isstable", rs.getBoolean(17));
- row.put("isrunning", rs.getBoolean(18));
- row.put("isunnamed", rs.getBoolean(19));
- row.put("isvalid", rs.getBoolean(20));
- row.put("isv2dir", rs.getBoolean(21));
- row.put("isv3dir", rs.getBoolean(22));
- row.put("version", rs.getString(23));
- row.put("bandwidth", rs.getBigDecimal(24));
- row.put("ports", rs.getString(25));
- row.put("rawdesc", rs.getBytes(26));
- row.put("uptime", DurationFormatUtils.formatDuration(
- rs.getBigDecimal(27).longValue() * 1000L, "d'd' HH:mm:ss"));
- row.put("platform", rs.getString(28));
- row.put("validafterts", rs.getTimestamp(1).getTime());
-
- status.add(row);
- }
- rs.close();
- statement.close();
- conn.close();
- this.logger.info("Returned a database connection to the pool after "
- + (System.currentTimeMillis() - requestedConnection)
- + " millis.");
- request.setAttribute("status", status);
- request.setAttribute("sort", sortParameter);
- request.setAttribute("order", (orderParameter.equals("desc"))
- ? "asc" : "desc");
-
- } catch (SQLException e) {
- response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- this.logger.log(Level.WARNING, "Database error", e);
- return;
- }
-
/* Forward the request to the JSP. */
request.getRequestDispatcher("WEB-INF/networkstatus.jsp").forward(
request, response);
diff --git a/src/org/torproject/ernie/web/RelayServlet.java b/src/org/torproject/ernie/web/RelayServlet.java
index 64f343d..79afac3 100644
--- a/src/org/torproject/ernie/web/RelayServlet.java
+++ b/src/org/torproject/ernie/web/RelayServlet.java
@@ -1,403 +1,18 @@
package org.torproject.ernie.web;
import java.io.*;
-import java.math.*;
-import java.sql.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
-import java.util.regex.*;
-import javax.naming.*;
import javax.servlet.*;
import javax.servlet.http.*;
-import javax.sql.*;
-
-import org.apache.commons.codec.*;
-import org.apache.commons.codec.binary.*;
-
-import org.apache.commons.lang.*;
public class RelayServlet extends HttpServlet {
- private SimpleDateFormat dayFormat =
- new SimpleDateFormat("yyyy-MM-dd");
-
- private DataSource ds;
-
- private Logger logger;
-
- public void init() {
-
- /* Initialize logger. */
- this.logger = Logger.getLogger(RelayServlet.class.toString());
-
- /* Initialize date format parser. */
- this.dayFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
-
- /* Look up data source. */
- try {
- Context cxt = new InitialContext();
- this.ds = (DataSource) cxt.lookup("java:comp/env/jdbc/tordir");
- this.logger.info("Successfully looked up data source.");
- } catch (NamingException e) {
- this.logger.log(Level.WARNING, "Could not look up data source", e);
- }
- }
-
- private void writeHeader(PrintWriter out) throws IOException {
- out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 "
- + "Transitional//EN\"\n"
- + "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"
- + "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
- + " <head>\n"
- + " <meta content=\"text/html; charset=ISO-8859-1\"\n"
- + " http-equiv=\"content-type\" />\n"
- + " <title>Relay</title>\n"
- + " <meta http-equiv=Content-Type content=\"text/html; "
- + "charset=iso-8859-1\">\n"
- + " <link href=\"/css/stylesheet-ltr.css\" type=text/css "
- + "rel=stylesheet>\n"
- + " <link href=\"/images/favicon.ico\" "
- + "type=image/x-icon rel=\"shortcut icon\">\n"
- + " </head>\n"
- + " <body>\n"
- + " <div class=\"center\">\n"
- + " <table class=\"banner\" border=\"0\" cellpadding=\"0\" "
- + "cellspacing=\"0\" summary=\"\">\n"
- + " <tr>\n"
- + " <td class=\"banner-left\"><a "
- + "href=\"/index.html\"><img src=\"/images/top-left.png\" "
- + "alt=\"Click to go to home page\" width=\"193\" "
- + "height=\"79\"></a></td>\n"
- + " <td class=\"banner-middle\">\n"
- + " <a href=\"/\">Home</a>\n"
- + " <a href=\"graphs.html\">Graphs</a>\n"
- + " <a href=\"research.html\">Research</a>\n"
- + " <a href=\"status.html\">Status</a>\n"
- + " <br/>\n"
- + " <font size=\"2\">\n"
- + " <a href=\"exonerator.html\">ExoneraTor</a>\n"
- + " <a class=\"current\">Relay Search</a>\n"
- + " <a href=\"consensus-health.html\">Consensus "
- + "Health</a>\n"
- + " </font>\n"
- + " </td>\n"
- + " <td class=\"banner-right\"></td>\n"
- + " </tr>\n"
- + " </table>\n"
- + " <div class=\"main-column\" style=\"margin:5; "
- + "Padding:0;\">\n"
- + " <h2>Relay</h2>\n");
- }
-
- private void writeFooter(PrintWriter out) throws IOException {
- out.println(" <br/>\n"
- + " </div>\n"
- + " </div>\n"
- + " <div class=\"bottom\" id=\"bottom\">\n"
- + " <p>This material is supported in part by the National "
- + "Science Foundation under Grant No. CNS-0959138. Any "
- + "opinions, finding, and conclusions or recommendations "
- + "expressed in this material are those of the author(s) and "
- + "do not necessarily reflect the views of the National "
- + "Science Foundation.</p>\n"
- + " <p>\"Tor\" and the \"Onion Logo\" are <a "
- + "href=\"https://www.torproject.org/docs/trademark-faq.html.en\">"
- + "registered trademarks</a> of The Tor Project, Inc.</p>\n"
- + " <p>Data on this site is freely available under a <a "
- + "href=\"http://creativecommons.org/publicdomain/zero/1.0/\">"
- + "CC0 no copyright declaration</a>: To the extent possible "
- + "under law, the Tor Project has waived all copyright and "
- + "related or neighboring rights in the data. Graphs are "
- + "licensed under a <a "
- + "href=\"http://creativecommons.org/licenses/by/3.0/us/\">"
- + "Creative Commons Attribution 3.0 United States "
- + "License</a>.</p>\n"
- + " </div>\n"
- + " </body>\n"
- + "</html>");
- out.close();
- }
-
public void doGet(HttpServletRequest request,
- HttpServletResponse response) throws IOException,
- ServletException {
-
- /* Measure how long it takes to process this request. */
- long started = System.currentTimeMillis();
-
- /* Get print writer and start writing response. */
- PrintWriter out = response.getWriter();
- writeHeader(out);
-
- /* Check fingerprint parameter. */
- String fingerprintParameter = request.getParameter("fingerprint");
- boolean validParameter = true;
- if (fingerprintParameter == null ||
- fingerprintParameter.length() < 8 ||
- fingerprintParameter.length() > 40) {
- validParameter = false;
- } else {
- Pattern fingerprintPattern = Pattern.compile("^[0-9a-f]{8,40}$");
- if (!fingerprintPattern.matcher(fingerprintParameter.toLowerCase()).
- matches()) {
- validParameter = false;
- }
- }
- if (!validParameter) {
- out.write(" <br/><p>Sorry, \""
- + StringEscapeUtils.escapeHtml(fingerprintParameter)
- + "\" is not a valid relay fingerprint. Please provide at "
- + "least the first 8 hex characters of a relay "
- + "fingerprint.</p>\n");
- writeFooter(out);
- return;
- }
-
- /* If we were only given a partial fingerprint, look up all
- * fingerprints starting with that part to see if it's unique in the
- * last 30 days. */
- String fingerprint = fingerprintParameter.toLowerCase();
- if (fingerprint.length() < 40) {
- SortedSet<String> allFingerprints = new TreeSet<String>();
- try {
- long requestedConnection = System.currentTimeMillis();
- Connection conn = this.ds.getConnection();
- Statement statement = conn.createStatement();
- String query = "SELECT DISTINCT fingerprint FROM statusentry "
- + "WHERE validafter >= '"
- + this.dayFormat.format(started
- - 30L * 24L * 60L * 60L * 1000L)
- + " 00:00:00' AND fingerprint LIKE '" + fingerprint + "%'";
- ResultSet rs = statement.executeQuery(query);
- while (rs.next()) {
- allFingerprints.add(rs.getString(1));
- }
- rs.close();
- statement.close();
- conn.close();
- this.logger.info("Returned a database connection to the pool "
- + "after " + (System.currentTimeMillis()
- - requestedConnection) + " millis.");
- } catch (SQLException e) {
- out.println("<p><font color=\"red\"><b>Warning: </b></font>We "
- + "experienced an unknown database problem while looking up "
- + "the relay with fingerprint starting with "
- + fingerprintParameter + ". Unfortunately, this is very "
- + "likely a <a href=\"https://trac.torproject.org/projects/"
- + "tor/ticket/4406\">known problem</a>. If you don't think "
- + "these problems are related, please "
- + "<a href=\"mailto:tor-assistants@xxxxxxxxxxxxxx\">let us "
- + "know</a>!</p>\n");
- writeFooter(out);
- return;
- }
- if (allFingerprints.size() == 0) {
- out.write("<p>No relay found with fingerprint starting with "
- + fingerprintParameter + " in the last 30 days.</p>");
- writeFooter(out);
- return;
- } else if (allFingerprints.size() > 1) {
- out.println("<p>The fingerprint part " + fingerprintParameter
- + " is not unique for relays running in the last 30 days. "
- + "Please choose one of the following fingerprints:</p><ul>");
- for (String f : allFingerprints) {
- out.println("<li><a href=\"relay.html?fingerprint=" + f + "\">"
- + f + "</a></li>");
- }
- out.write("</ul><br/>");
- writeFooter(out);
- return;
- } else {
- fingerprint = allFingerprints.first();
- }
- }
-
- /* Print out in which consensuses this relay was last contained. */
- boolean foundRelay = false;
- String lastDescriptor = null;
- try {
- long requestedConnection = System.currentTimeMillis();
- Connection conn = this.ds.getConnection();
- Statement statement = conn.createStatement();
- String query = "SELECT validafter, rawdesc FROM statusentry WHERE "
- + "validafter >= '"
- + this.dayFormat.format(started - 30L * 24L * 60L * 60L * 1000L)
- + " 00:00:00' AND fingerprint = '" + fingerprint
- + "' ORDER BY validafter DESC LIMIT 3";
- ResultSet rs = statement.executeQuery(query);
- boolean printedDescription = false;
- while (rs.next()) {
- foundRelay = true;
- if (!printedDescription) {
- out.println("<p>The relay with fingerprint "
- + (fingerprintParameter.length() < 40 ? "starting " : "")
- + "with " + fingerprintParameter + " was last "
- + "referenced in the following relay lists:</p>");
- printedDescription = true;
- }
- String validAfter = rs.getTimestamp(1).toString().
- substring(0, 19);
- out.println(" <br/><tt>valid-after "
- + "<a href=\"consensus?valid-after="
- + validAfter.replaceAll(":", "-").replaceAll(" ", "-")
- + "\" target=\"_blank\">" + validAfter + "</a></tt><br/>");
- byte[] rawStatusEntry = rs.getBytes(2);
- try {
- String statusEntryLines = new String(rawStatusEntry,
- "US-ASCII");
- String[] lines = statusEntryLines.split("\n");
- for (String line : lines) {
- if (line.startsWith("r ")) {
- String[] parts = line.split(" ");
- String descriptor = String.format("%040x",
- new BigInteger(1, Base64.decodeBase64(parts[3]
- + "==")));
- if (lastDescriptor == null) {
- lastDescriptor = descriptor;
- }
- out.println(" <tt>r " + parts[1] + " " + parts[2] + " "
- + "<a href=\"descriptor.html?desc-id=" + descriptor
- + "\" target=\"_blank\">" + parts[3] + "</a> "
- + parts[4] + " " + parts[5] + " " + parts[6] + " "
- + parts[7] + " " + parts[8] + "</tt><br/>");
- } else {
- out.println(" <tt>" + line + "</tt><br/>");
- }
- }
- } catch (UnsupportedEncodingException e) {
- /* This shouldn't happen, because we know that ASCII is
- * supported. */
- }
- }
- rs.close();
- statement.close();
- conn.close();
- this.logger.info("Returned a database connection to the pool after "
- + (System.currentTimeMillis() - requestedConnection)
- + " millis.");
- } catch (SQLException e) {
- out.println("<p><font color=\"red\"><b>Warning: </b></font>We "
- + "experienced an unknown database problem while looking up "
- + "the relay with fingerprint "
- + (fingerprintParameter.length() < 40 ? "starting with " : "")
- + fingerprintParameter + ". Unfortunately, this is very likely "
- + "a <a href=\"https://trac.torproject.org/projects/tor/ticket"
- + "/4406\">known problem</a>. If you don't think these "
- + "problems are related, please "
- + "<a href=\"mailto:tor-assistants@xxxxxxxxxxxxxx\">let us "
- + "know</a>!</p>\n");
- writeFooter(out);
- return;
- }
-
- /* If we didn't find this relay, stop here. */
- if (!foundRelay) {
- out.write("<p>No relay found with fingerprint "
- + (fingerprintParameter.length() < 40 ? "starting with " : "")
- + fingerprintParameter + " in the last 30 days.</p>");
- writeFooter(out);
- return;
- }
-
- /* Look up last server and extra-info descriptor in the database. */
- String query = null, descriptor = null, nickname = null,
- published = null, extrainfo = null;
- byte[] rawDescriptor = null, rawExtrainfo = null;
- if (lastDescriptor != null) {
- try {
- long requestedConnection = System.currentTimeMillis();
- Connection conn = this.ds.getConnection();
- Statement statement = conn.createStatement();
- query = "SELECT descriptor, nickname, published, extrainfo, "
- + "rawdesc FROM descriptor WHERE descriptor = '"
- + lastDescriptor + "'";
- ResultSet rs = statement.executeQuery(query);
- if (rs.next()) {
- descriptor = rs.getString(1);
- nickname = rs.getString(2);
- published = rs.getTimestamp(3).toString().substring(0, 19);
- extrainfo = rs.getString(4);
- rawDescriptor = rs.getBytes(5);
- query = "SELECT rawdesc FROM extrainfo WHERE extrainfo = '"
- + extrainfo + "'";
- rs = statement.executeQuery(query);
- if (rs.next()) {
- rawExtrainfo = rs.getBytes(1);
- }
- }
- rs.close();
- statement.close();
- conn.close();
- this.logger.info("Returned a database connection to the pool "
- + "after " + (System.currentTimeMillis()
- - requestedConnection) + " millis.");
- } catch (SQLException e) {
- out.write("<br/><p><font color=\"red\"><b>Warning: </b></font>"
- + "Internal server error when looking up descriptor. The "
- + "query was '" + query + "'. Unfortunately, this is very "
- + "likely a <a href=\"https://trac.torproject.org/projects/"
- + "tor/ticket/4406\">known problem</a>. If you don't think "
- + "these problems are related, please "
- + "<a href=\"mailto:tor-assistants@xxxxxxxxxxxxxx\">let us "
- + "know</a>!</p>\n");
- writeFooter(out);
- return;
- }
- }
-
- /* If no descriptor was found, stop here. */
- if (descriptor == null) {
- out.write("<p>No descriptor found with identifier " + descriptor
- + " which was referenced in the last relay list.</p>");
- writeFooter(out);
- return;
- }
-
- /* Print out both server and extra-info descriptor. */
- out.write("<br/><p>The last referenced server descriptor published "
- + "by this relay is:</p>");
- String descriptorString = new String(rawDescriptor, "US-ASCII");
- String escapedDescriptorString = StringEscapeUtils.escapeHtml(
- descriptorString);
- BufferedReader br = new BufferedReader(new StringReader(
- escapedDescriptorString));
- String line = null;
- while ((line = br.readLine()) != null) {
- out.println(" <tt>" + line + "</tt><br/>");
- }
- br.close();
- if (rawExtrainfo != null) {
- out.println("<br/><p>Together with this server descriptor, the "
- + "relay published the following extra-info descriptor:</p>");
- br = new BufferedReader(new StringReader(new String(rawExtrainfo,
- "US-ASCII")));
- line = null;
- while ((line = br.readLine()) != null) {
- out.println(" <tt>" + line + "</tt><br/>");
- }
- }
-
- /* Provide links to raw descriptors, too. */
- out.println("<br/><p>Note that the descriptor" + (rawExtrainfo != null
- ? "s have" : " has") + " been converted to ASCII and reformatted "
- + "for display purposes. You may also download the raw "
- + "<a href=\"serverdesc?desc-id=" + descriptor
- + "\" target=\"_blank\">server " + "descriptor</a>"
- + (extrainfo != null ? " and <a href=\"extrainfodesc?desc-id="
- + extrainfo + "\" target=\"_blank\">extra-info descriptor</a>"
- : "") + " as " + (extrainfo != null ? "they were" : "it was")
- + " published to the directory authorities.</p>");
-
- /* Display total lookup time on the results page. */
- long searchTime = System.currentTimeMillis() - started;
- out.write(" <br/><p>Looking up this relay took us "
- + String.format("%d.%03d", searchTime / 1000, searchTime % 1000)
- + " seconds.</p>\n");
+ HttpServletResponse response) throws IOException, ServletException {
- /* Finish writing response. */
- writeFooter(out);
+ /* Forward the request to the JSP. */
+ request.getRequestDispatcher("WEB-INF/relay.jsp").forward(
+ request, response);
}
}
diff --git a/web/WEB-INF/banner.jsp b/web/WEB-INF/banner.jsp
index da3b705..a081423 100644
--- a/web/WEB-INF/banner.jsp
+++ b/web/WEB-INF/banner.jsp
@@ -42,10 +42,6 @@
currentPage.endsWith("consensus-health.jsp")) {
%><br>
<font size="2">
- <a <%if (currentPage.endsWith("networkstatus.jsp") ||
- currentPage.endsWith("routerdetail.jsp")){
- %>class="current"<%} else {%>href="/networkstatus.html"<%}
- %>>Network Status</a>
<a <%if (currentPage.endsWith("exonerator.jsp")){
%>class="current"<%} else {%>href="/exonerator.html"<%}
%>>ExoneraTor</a>
diff --git a/web/WEB-INF/networkstatus.jsp b/web/WEB-INF/networkstatus.jsp
index 4f47e2a..8f7b379 100644
--- a/web/WEB-INF/networkstatus.jsp
+++ b/web/WEB-INF/networkstatus.jsp
@@ -12,26 +12,8 @@
<%@ include file="banner.jsp"%>
<div class="main-column">
<h2>Tor Metrics Portal: Network Status</h2>
- <table>
- <tr>
- <th><a href="/networkstatus.html?sort=nickname&order=${sort=='nickname'?order:'desc'}">nickname</a></th>
- <th><a href="/networkstatus.html?sort=bandwidth&order=${sort=='bandwidth'?order:'desc'}">bandwidth</a></th>
- <th><a href="/networkstatus.html?sort=orport&order=${sort=='orport'?order:'desc'}">orport</a></th>
- <th><a href="/networkstatus.html?sort=dirport&order=${sort=='dirport'?order:'desc'}">dirport</a></th>
- <th><a href="/networkstatus.html?sort=isbadexit&order=${sort=='isbadexit'?order:'desc'}">isbadexit</a></th>
- <th><a href="/networkstatus.html?sort=uptime&order=${sort=='uptime'?order:'desc'}">uptime</a></th>
- </tr>
- <c:forEach var="row" items="${status}">
- <tr>
- <td><a href="/routerdetail.html?fingerprint=${row['fingerprint']}">${row['nickname']}</a></td>
- <td>${row['bandwidth']}</td>
- <td>${row['orport']}</td>
- <td>${row['dirport']}</td>
- <td>${row['isbadexit']}</td>
- <td>${row['uptime']}</td>
- </tr>
- </c:forEach>
- </table>
+ <br>
+ <p>Sorry, this page has been discontinued.</p>
</div>
</div>
<div class="bottom" id="bottom">
diff --git a/web/WEB-INF/relay.jsp b/web/WEB-INF/relay.jsp
new file mode 100644
index 0000000..952133a
--- /dev/null
+++ b/web/WEB-INF/relay.jsp
@@ -0,0 +1,23 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>Tor Metrics Portal: Relay</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">
+ <h2>Tor Metrics Portal: Relay</h2>
+ <br>
+ <p>Sorry, this page has been discontinued.</p>
+ </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