");
+ if (isUs) {
+ buf.append("Our info: ").append(hash).append(" |
---|
\n");
+ } else {
+ buf.append("Peer info for: ").append(hash).append("\n");
+ if (full) {
+ buf.append("[Back] |
\n");
+ } else {
+ buf.append("[Full entry] | \n");
+ }
+ }
+
+ long age = _context.clock().now() - info.getPublished();
+ if (isUs && _context.router().isHidden())
+ buf.append("Hidden, Updated: ").append(DataHelper.formatDuration(age)).append(" ago \n");
+ else if (age > 0)
+ buf.append("Published: ").append(DataHelper.formatDuration(age)).append(" ago \n");
+ else
+ buf.append("Published: in ").append(DataHelper.formatDuration(0-age)).append("??? \n");
+ buf.append("Address(es): ");
+ String country = _context.commSystem().getCountry(info.getIdentity().getHash());
+ if(country != null) {
+ buf.append(" ");
+ }
+ for (Iterator iter = info.getAddresses().iterator(); iter.hasNext(); ) {
+ RouterAddress addr = (RouterAddress)iter.next();
+ buf.append(DataHelper.stripHTML(addr.getTransportStyle())).append(": ");
+ for (Iterator optIter = addr.getOptions().keySet().iterator(); optIter.hasNext(); ) {
+ String name = (String)optIter.next();
+ String val = addr.getOptions().getProperty(name);
+ buf.append('[').append(DataHelper.stripHTML(name)).append('=').append(DataHelper.stripHTML(val)).append("] ");
+ }
+ }
+ buf.append(" | \n");
+ if (full) {
+ buf.append("Stats:
\n");
+ for (Iterator iter = info.getOptions().keySet().iterator(); iter.hasNext(); ) {
+ String key = (String)iter.next();
+ String val = info.getOption(key);
+ buf.append(DataHelper.stripHTML(key)).append(" = ").append(DataHelper.stripHTML(val)).append(" \n");
+ }
+ buf.append(" |
\n");
+ } else {
+ }
+ buf.append("\n");
+ }
+
+ /** translate a string */
+ private String _(String s) {
+ return Messages.getString(s, _context);
+ }
+}
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java
index 957cafc108..29fb47ada7 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java
@@ -319,4 +319,9 @@ class ProfileOrganizerRenderer {
long c = r.getCurrentEventCount() + r.getLastEventCount();
return "" + c;
}
+
+ /** translate a string */
+ private String _(String s) {
+ return Messages.getString(s, _context);
+ }
}
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
index 8529f13ff9..ec2b10c244 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
@@ -111,6 +111,7 @@ public class RouterConsoleRunner {
File tmpdir = new File(workDir, ROUTERCONSOLE + "-" + _listenPort);
tmpdir.mkdir();
wac.setTempDirectory(tmpdir);
+ wac.addHandler(0, new LocaleWebAppHandler(I2PAppContext.getGlobalContext()));
initialize(wac);
File dir = new File(_webAppsDir);
String fileNames[] = dir.list(WarFilenameFilter.instance());
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java b/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
index 1f450239b4..15322edf4b 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
@@ -235,4 +235,9 @@ public class StatsGenerator {
private final static DecimalFormat _pct = new DecimalFormat("#0.00%");
private final static String pct(double num) { synchronized (_pct) { return _pct.format(num); } }
+
+ /** translate a string */
+ private String _(String s) {
+ return Messages.getString(s, _context);
+ }
}
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java
new file mode 100644
index 0000000000..e7d6ee4126
--- /dev/null
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java
@@ -0,0 +1,417 @@
+package net.i2p.router.web;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Writer;
+
+import net.i2p.router.RouterContext;
+
+/**
+ * Refactored from summarynoframe.jsp to save ~100KB
+ *
+ */
+public class SummaryBarRenderer {
+ private RouterContext _context;
+ private SummaryHelper _helper;
+
+ public SummaryBarRenderer(RouterContext context, SummaryHelper helper) {
+ _context = context;
+ _helper = helper;
+ }
+
+ public void renderSummaryHTML(Writer out) throws IOException {
+ StringBuilder buf = new StringBuilder(8*1024);
+
+ buf.append("
");
+
+ File lpath = new File(_context.getBaseDir(), "docs/toolbar.html");
+ // you better have target="_top" for the links in there...
+ if (lpath.exists()) {
+ ContentHelper linkhelper = new ContentHelper();
+ linkhelper.setPage(lpath.getAbsolutePath());
+ linkhelper.setMaxLines("100");
+ buf.append(linkhelper.getContent());
+ } else {
+ buf.append("\n" +
+
+ "
\n" +
+
+ "
\n" +
+
+ "\n");
+
+ out.write(buf.toString());
+ buf.setLength(0);
+ }
+
+
+
+ buf.append("
" +
+ "
\n" +
+
+ "" +
+ "")
+ .append(_("Version"))
+ .append(": | " +
+ "")
+ .append(_helper.getVersion())
+ .append(" |
\n" +
+
+ "" +
+ "")
+ .append(_("Uptime"))
+ .append(": | " +
+ "")
+ .append(_helper.getUptime())
+ .append(" |
\n" +
+
+ "
\n");
+
+
+ if (_helper.updateAvailable() || _helper.unsignedUpdateAvailable()) {
+ // display all the time so we display the final failure message
+ buf.append("
").append(UpdateHandler.getStatus());
+ if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress"))) {
+ // nothing
+ } else if(
+ // isDone() is always false for now, see UpdateHandler
+ // ((!update.isDone()) &&
+ _helper.getAction() == null &&
+ _helper.getUpdateNonce() == null &&
+ ConfigRestartBean.getRestartTimeRemaining() > 12*60*1000) {
+ long nonce = _context.random().nextLong();
+ String prev = System.getProperty("net.i2p.router.web.UpdateHandler.nonce");
+ if (prev != null)
+ System.setProperty("net.i2p.router.web.UpdateHandler.noncePrev", prev);
+ System.setProperty("net.i2p.router.web.UpdateHandler.nonce", nonce+"");
+ String uri = _helper.getRequestURI();
+ buf.append("\n");
+ }
+ }
+
+
+
+
+ buf.append("")
+ .append(ConfigRestartBean.renderStatus(_helper.getRequestURI(), _helper.getAction(), _helper.getConsoleNonce()))
+
+ .append("
\n" +
+
+ "\n" +
+
+ "")
+ .append(_("Active"))
+ .append(": | ")
+ .append(_helper.getActivePeers())
+ .append('/')
+ .append(_helper.getActiveProfiles())
+ .append(" |
\n" +
+
+ "")
+ .append(_("Fast"))
+ .append(": | ")
+ .append(_helper.getFastPeers())
+ .append(" |
\n" +
+
+ "")
+ .append(_("High capacity"))
+ .append(": | ")
+ .append(_helper.getHighCapacityPeers())
+ .append(" |
\n" +
+
+ "")
+ .append(_("Integrated"))
+ .append(": | ")
+ .append(_helper.getWellIntegratedPeers())
+ .append(" |
\n" +
+
+ "")
+ .append(_("Known"))
+ .append(": | ")
+ .append(_helper.getAllPeers())
+ .append(" |
\n" +
+
+ "
\n");
+
+
+ out.write(buf.toString());
+ buf.setLength(0);
+
+
+ boolean anotherLine = false;
+ if (_helper.showFirewallWarning()) {
+ buf.append("");
+ anotherLine = true;
+ }
+
+ boolean reseedInProgress = Boolean.valueOf(System.getProperty("net.i2p.router.web.ReseedHandler.reseedInProgress")).booleanValue();
+ // If showing the reseed link is allowed
+ if (_helper.allowReseed()) {
+ if (reseedInProgress) {
+ // While reseed occurring, show status message instead
+ buf.append("").append(System.getProperty("net.i2p.router.web.ReseedHandler.statusMessage","")).append("
");
+ } else {
+ // While no reseed occurring, show reseed link
+ long nonce = _context.random().nextLong();
+ String prev = System.getProperty("net.i2p.router.web.ReseedHandler.nonce");
+ if (prev != null) System.setProperty("net.i2p.router.web.ReseedHandler.noncePrev", prev);
+ System.setProperty("net.i2p.router.web.ReseedHandler.nonce", nonce+"");
+ String uri = _helper.getRequestURI();
+ buf.append("\n");
+ }
+ anotherLine = true;
+ }
+ // If a new reseed ain't running, and the last reseed had errors, show error message
+ if (!reseedInProgress) {
+ String reseedErrorMessage = System.getProperty("net.i2p.router.web.ReseedHandler.errorMessage","");
+ if (reseedErrorMessage.length() > 0) {
+ buf.append("").append(reseedErrorMessage).append("
");
+ anotherLine = true;
+ }
+ }
+ if (anotherLine)
+ buf.append("
");
+
+
+ buf.append("
" +
+ "\n" +
+
+ "1s: | ")
+ .append(_helper.getInboundSecondKBps())
+ .append('/')
+ .append(_helper.getOutboundSecondKBps())
+ .append("K/s |
\n" +
+
+ "5m: | ")
+ .append(_helper.getInboundFiveMinuteKBps())
+ .append('/')
+ .append(_helper.getOutboundFiveMinuteKBps())
+ .append("K/s |
\n" +
+
+ "")
+ .append(_("Total"))
+ .append(": | ")
+ .append(_helper.getInboundLifetimeKBps())
+ .append('/')
+ .append(_helper.getOutboundLifetimeKBps())
+ .append("K/s |
\n" +
+
+ "")
+ .append(_("Used"))
+ .append(": | ")
+ .append(_helper.getInboundTransferred())
+ .append('/')
+ .append(_helper.getOutboundTransferred())
+ .append(" |
\n" +
+
+ "
" +
+ "\n" +
+
+ "")
+ .append(_("Exploratory"))
+ .append(": | ")
+ .append(_helper.getInboundTunnels())
+ .append('/')
+ .append(_helper.getOutboundTunnels())
+ .append(" |
\n" +
+
+ "")
+ .append(_("Client"))
+ .append(": | ")
+ .append(_helper.getInboundClientTunnels())
+ .append('/')
+ .append(_helper.getOutboundClientTunnels())
+ .append(" |
\n" +
+
+ "")
+ .append(_("Participating"))
+ .append(": | ")
+ .append(_helper.getParticipatingTunnels())
+ .append(" |
\n" +
+
+ "
" +
+ "\n" +
+
+ "")
+ .append(_("Job lag"))
+ .append(": | ")
+ .append(_helper.getJobLag())
+ .append(" |
\n" +
+
+ "")
+ .append(_("Message delay"))
+ .append(": | ")
+ .append(_helper.getMessageDelay())
+ .append(" |
\n" +
+
+ "")
+ .append(_("Tunnel lag"))
+ .append(": | ")
+ .append(_helper.getTunnelLag())
+ .append(" |
\n" +
+
+ "")
+ .append(_("Backlog"))
+ .append(": | ")
+ .append(_helper.getInboundBacklog())
+ .append(" |
\n" +
+
+ "
")
+ .append(_helper.getTunnelStatus())
+ .append("
\n")
+ .append(_helper.getDestinations());
+
+
+
+ out.write(buf.toString());
+ }
+
+ /** translate a string */
+ private String _(String s) {
+ return Messages.getString(s, _context);
+ }
+}
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
index 5c7779cf5d..47468e3dea 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
@@ -1,5 +1,6 @@
package net.i2p.router.web;
+import java.io.IOException;
import java.text.Collator;
import java.text.DecimalFormat;
import java.util.ArrayList;
@@ -563,4 +564,28 @@ public class SummaryHelper extends HelperBase {
public String getUnsignedUpdateVersion() {
return NewsFetcher.getInstance(_context).unsignedUpdateVersion();
}
+
+ /** output the summary bar to _out */
+ public void renderSummaryBar() throws IOException {
+ SummaryBarRenderer renderer = new SummaryBarRenderer(_context, this);
+ renderer.renderSummaryHTML(_out);
+ }
+
+ /* below here is stuff we need to get from summarynoframe.jsp to SummaryBarRenderer */
+
+ private String _action;
+ public void setAction(String s) { _action = s; }
+ public String getAction() { return _action; }
+
+ private String _consoleNonce;
+ public void setConsoleNonce(String s) { _consoleNonce = s; }
+ public String getConsoleNonce() { return _consoleNonce; }
+
+ private String _updateNonce;
+ public void setUpdateNonce(String s) { _updateNonce = s; }
+ public String getUpdateNonce() { return _updateNonce; }
+
+ private String _requestURI;
+ public void setRequestURI(String s) { _requestURI = s; }
+ public String getRequestURI() { return _requestURI; }
}
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/TunnelHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/TunnelHelper.java
index b605cbf361..db64f77c25 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/TunnelHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/TunnelHelper.java
@@ -9,13 +9,14 @@ public class TunnelHelper extends HelperBase {
public TunnelHelper() {}
public String getTunnelSummary() {
+ TunnelRenderer renderer = new TunnelRenderer(_context);
try {
if (_out != null) {
- _context.tunnelManager().renderStatusHTML(_out);
+ renderer.renderStatusHTML(_out);
return "";
} else {
ByteArrayOutputStream baos = new ByteArrayOutputStream(32*1024);
- _context.tunnelManager().renderStatusHTML(new OutputStreamWriter(baos));
+ renderer.renderStatusHTML(new OutputStreamWriter(baos));
return new String(baos.toByteArray());
}
} catch (IOException ioe) {
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java
new file mode 100644
index 0000000000..b1536c911d
--- /dev/null
+++ b/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java
@@ -0,0 +1,318 @@
+package net.i2p.router.web;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import net.i2p.data.DataHelper;
+import net.i2p.data.Destination;
+import net.i2p.data.Hash;
+import net.i2p.data.RouterInfo;
+import net.i2p.data.TunnelId;
+import net.i2p.router.Router;
+import net.i2p.router.RouterContext;
+import net.i2p.router.TunnelInfo;
+import net.i2p.router.TunnelPoolSettings;
+import net.i2p.router.tunnel.HopConfig;
+import net.i2p.router.tunnel.pool.TunnelPool;
+import net.i2p.stat.RateStat;
+import net.i2p.util.ObjectCounter;
+
+/**
+ *
+ */
+public class TunnelRenderer {
+ private RouterContext _context;
+
+ public TunnelRenderer(RouterContext ctx) {
+ _context = ctx;
+ }
+
+ public void renderStatusHTML(Writer out) throws IOException {
+ out.write("Exploratory tunnels (config):
\n");
+ renderPool(out, _context.tunnelManager().getInboundExploratoryPool(), _context.tunnelManager().getOutboundExploratoryPool());
+
+ List
destinations = null;
+ Map clientInboundPools = _context.tunnelManager().getInboundClientPools();
+ Map clientOutboundPools = _context.tunnelManager().getOutboundClientPools();
+ destinations = new ArrayList(clientInboundPools.keySet());
+ for (int i = 0; i < destinations.size(); i++) {
+ Hash client = destinations.get(i);
+ TunnelPool in = null;
+ TunnelPool outPool = null;
+ in = clientInboundPools.get(client);
+ outPool = clientOutboundPools.get(client);
+ String name = (in != null ? in.getSettings().getDestinationNickname() : null);
+ if ( (name == null) && (outPool != null) )
+ name = outPool.getSettings().getDestinationNickname();
+ if (name == null)
+ name = client.toBase64().substring(0,4);
+ out.write("Client tunnels for " + name);
+ if (_context.clientManager().isLocal(client))
+ out.write(" (config):
\n");
+ else
+ out.write(" (dead):\n");
+ renderPool(out, in, outPool);
+ }
+
+ List participating = _context.tunnelDispatcher().listParticipatingTunnels();
+ Collections.sort(participating, new TunnelComparator());
+ out.write("Participating tunnels:
\n");
+ out.write("Receive on | From | "
+ + "Send on | To | Expiration | "
+ + "Usage | Rate | Role |
\n");
+ long processed = 0;
+ RateStat rs = _context.statManager().getRate("tunnel.participatingMessageCount");
+ if (rs != null)
+ processed = (long)rs.getRate(10*60*1000).getLifetimeTotalValue();
+ int inactive = 0;
+ for (int i = 0; i < participating.size(); i++) {
+ HopConfig cfg = (HopConfig)participating.get(i);
+ if (cfg.getProcessedMessagesCount() <= 0) {
+ inactive++;
+ continue;
+ }
+ out.write("");
+ if (cfg.getReceiveTunnel() != null)
+ out.write(" " + cfg.getReceiveTunnel().getTunnelId() +" | ");
+ else
+ out.write(" n/a | ");
+ if (cfg.getReceiveFrom() != null)
+ out.write(" " + netDbLink(cfg.getReceiveFrom()) +" | ");
+ else
+ out.write(" | ");
+ if (cfg.getSendTunnel() != null)
+ out.write(" " + cfg.getSendTunnel().getTunnelId() +" | ");
+ else
+ out.write(" | ");
+ if (cfg.getSendTo() != null)
+ out.write(" " + netDbLink(cfg.getSendTo()) +" | ");
+ else
+// out.write(" | ");
+ out.write(" | ");
+ long timeLeft = cfg.getExpiration()-_context.clock().now();
+ if (timeLeft > 0)
+ out.write(" " + DataHelper.formatDuration(timeLeft) + " | ");
+ else
+ out.write(" (grace period) | ");
+ out.write(" " + cfg.getProcessedMessagesCount() + "KB | ");
+ int lifetime = (int) ((_context.clock().now() - cfg.getCreation()) / 1000);
+ if (lifetime <= 0)
+ lifetime = 1;
+ if (lifetime > 10*60)
+ lifetime = 10*60;
+ int bps = 1024 * (int) cfg.getProcessedMessagesCount() / lifetime;
+ out.write(" " + bps + "Bps | ");
+ if (cfg.getSendTo() == null)
+ out.write(" Outbound Endpoint | ");
+ else if (cfg.getReceiveFrom() == null)
+ out.write(" Inbound Gateway | ");
+ else
+ out.write(" Participant | ");
+ out.write("
\n");
+ processed += cfg.getProcessedMessagesCount();
+ }
+ out.write("
\n");
+ out.write("Inactive participating tunnels: " + inactive + "
\n");
+ out.write("Lifetime bandwidth usage: " + DataHelper.formatSize(processed*1024) + "B
\n");
+ renderPeers(out);
+ }
+
+ private static class TunnelComparator implements Comparator {
+ public int compare(Object l, Object r) {
+ return (int) (((HopConfig)r).getProcessedMessagesCount() - ((HopConfig)l).getProcessedMessagesCount());
+ }
+ }
+
+ private void renderPool(Writer out, TunnelPool in, TunnelPool outPool) throws IOException {
+ List tunnels = null;
+ if (in == null)
+ tunnels = new ArrayList();
+ else
+ tunnels = in.listTunnels();
+ if (outPool != null)
+ tunnels.addAll(outPool.listTunnels());
+
+ long processedIn = (in != null ? in.getLifetimeProcessed() : 0);
+ long processedOut = (outPool != null ? outPool.getLifetimeProcessed() : 0);
+
+ int live = 0;
+ int maxLength = 1;
+ for (int i = 0; i < tunnels.size(); i++) {
+ TunnelInfo info = tunnels.get(i);
+ if (info.getLength() > maxLength)
+ maxLength = info.getLength();
+ }
+ out.write("In/Out | Expiry | Usage | Gateway | ");
+ if (maxLength > 3) {
+ out.write("Participants | ");
+ }
+ else if (maxLength == 3) {
+ out.write("Participant | ");
+ }
+ if (maxLength > 1) {
+ out.write("Endpoint | ");
+ }
+ out.write("
\n");
+ for (int i = 0; i < tunnels.size(); i++) {
+ TunnelInfo info = tunnels.get(i);
+ long timeLeft = info.getExpiration()-_context.clock().now();
+ if (timeLeft <= 0)
+ continue; // don't display tunnels in their grace period
+ live++;
+ if (info.isInbound())
+ out.write("  | ");
+ else
+ out.write("
 | ");
+ out.write(" " + DataHelper.formatDuration(timeLeft) + " | \n");
+ out.write(" " + info.getProcessedMessagesCount() + "KB | \n");
+ for (int j = 0; j < info.getLength(); j++) {
+ Hash peer = info.getPeer(j);
+ TunnelId id = (info.isInbound() ? info.getReceiveTunnelId(j) : info.getSendTunnelId(j));
+ if (_context.routerHash().equals(peer)) {
+ out.write(" " + (id == null ? "" : "" + id) + " | ");
+ } else {
+ String cap = getCapacity(peer);
+ out.write(" " + netDbLink(peer) + (id == null ? "" : " " + id) + cap + " | ");
+ }
+ if (info.getLength() < maxLength && (info.getLength() == 1 || j == info.getLength() - 2)) {
+ for (int k = info.getLength(); k < maxLength; k++)
+ out.write(" | ");
+ }
+ }
+ out.write("
\n");
+
+ if (info.isInbound())
+ processedIn += info.getProcessedMessagesCount();
+ else
+ processedOut += info.getProcessedMessagesCount();
+ }
+ out.write("
\n");
+ if (in != null) {
+ List pending = in.listPending();
+ if (pending.size() > 0)
+ out.write("Build in progress: " + pending.size() + " inbound\n");
+ live += pending.size();
+ }
+ if (outPool != null) {
+ List pending = outPool.listPending();
+ if (pending.size() > 0)
+ out.write("Build in progress: " + pending.size() + " outbound\n");
+ live += pending.size();
+ }
+ if (live <= 0)
+ out.write("No tunnels; waiting for the grace period to end.\n");
+ out.write("Lifetime bandwidth usage: " + DataHelper.formatSize(processedIn*1024) + "B in, " +
+ DataHelper.formatSize(processedOut*1024) + "B out");
+ }
+
+ private void renderPeers(Writer out) throws IOException {
+ // count up the peers in the local pools
+ ObjectCounter lc = new ObjectCounter();
+ int tunnelCount = countTunnelsPerPeer(lc);
+
+ // count up the peers in the participating tunnels
+ ObjectCounter pc = new ObjectCounter();
+ int partCount = countParticipatingPerPeer(pc);
+
+ Set peers = new HashSet(lc.objects());
+ peers.addAll(pc.objects());
+ List peerList = new ArrayList(peers);
+ Collections.sort(peerList, new HashComparator());
+
+ out.write("Tunnel Counts By Peer:
\n");
+ out.write("Peer | Expl. + Client | % of total | Part. from + to | % of total |
\n");
+ for (Hash h : peerList) {
+ out.write(" ");
+ out.write(netDbLink(h));
+ out.write(" | " + lc.count(h));
+ out.write(" | ");
+ if (tunnelCount > 0)
+ out.write("" + (lc.count(h) * 100 / tunnelCount));
+ else
+ out.write('0');
+ out.write(" | " + pc.count(h));
+ out.write(" | ");
+ if (partCount > 0)
+ out.write("" + (pc.count(h) * 100 / partCount));
+ else
+ out.write('0');
+ out.write('\n');
+ }
+ out.write(" |
\n");
+ }
+
+ /* duplicate of that in tunnelPoolManager for now */
+ /** @return total number of non-fallback expl. + client tunnels */
+ private int countTunnelsPerPeer(ObjectCounter lc) {
+ List pools = new ArrayList();
+ _context.tunnelManager().listPools(pools);
+ int tunnelCount = 0;
+ for (TunnelPool tp : pools) {
+ for (TunnelInfo info : tp.listTunnels()) {
+ if (info.getLength() > 1) {
+ tunnelCount++;
+ for (int j = 0; j < info.getLength(); j++) {
+ Hash peer = info.getPeer(j);
+ if (!_context.routerHash().equals(peer))
+ lc.increment(peer);
+ }
+ }
+ }
+ }
+ return tunnelCount;
+ }
+
+ /** @return total number of part. tunnels */
+ private int countParticipatingPerPeer(ObjectCounter pc) {
+ List participating = _context.tunnelDispatcher().listParticipatingTunnels();
+ for (HopConfig cfg : participating) {
+ Hash from = cfg.getReceiveFrom();
+ if (from != null)
+ pc.increment(from);
+ Hash to = cfg.getSendTo();
+ if (to != null)
+ pc.increment(to);
+ }
+ return participating.size();
+ }
+
+ private static class HashComparator implements Comparator {
+ public int compare(Object l, Object r) {
+ return ((Hash)l).toBase64().compareTo(((Hash)r).toBase64());
+ }
+ }
+
+ private String getCapacity(Hash peer) {
+ RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer);
+ if (info != null) {
+ String caps = info.getCapabilities();
+ for (char c = Router.CAPABILITY_BW12; c <= Router.CAPABILITY_BW256; c++) {
+ if (caps.indexOf(c) >= 0)
+ return " " + c;
+ }
+ }
+ return "";
+ }
+
+ private String netDbLink(Hash peer) {
+ return _context.commSystem().renderPeerHTML(peer);
+ }
+
+ /** translate a string */
+ private String _(String s) {
+ return Messages.getString(s, _context);
+ }
+}
diff --git a/apps/routerconsole/jsp/configupdate.jsp b/apps/routerconsole/jsp/configupdate.jsp
index 62677bbb04..e7562de9f7 100644
--- a/apps/routerconsole/jsp/configupdate.jsp
+++ b/apps/routerconsole/jsp/configupdate.jsp
@@ -2,8 +2,9 @@
<%@page pageEncoding="UTF-8"%>
-I2P Router Console - config update
+
<%@include file="css.jsp" %>
+<%=cssHelper.title("config update")%>
<%@include file="summary.jsp" %>
@@ -36,7 +37,7 @@
"> |
Refresh frequency:
| |
- Update policy: |
+ <%=formhandler._("Update policy")%>: |
|
Update through the eepProxy? |
|
diff --git a/apps/routerconsole/jsp/css.jsp b/apps/routerconsole/jsp/css.jsp
index ed86750308..865e907235 100644
--- a/apps/routerconsole/jsp/css.jsp
+++ b/apps/routerconsole/jsp/css.jsp
@@ -25,5 +25,8 @@
" />
+<%
+ cssHelper.setLang(request.getParameter("lang"));
+%>
console.css" rel="stylesheet" type="text/css">
diff --git a/apps/routerconsole/jsp/index.jsp b/apps/routerconsole/jsp/index.jsp
index b14f8e3525..d2ce8ffc2d 100644
--- a/apps/routerconsole/jsp/index.jsp
+++ b/apps/routerconsole/jsp/index.jsp
@@ -29,5 +29,6 @@ if (System.getProperty("router.consoleNonce") == null) {
" />
+ " />
diff --git a/apps/routerconsole/jsp/summarynoframe.jsp b/apps/routerconsole/jsp/summarynoframe.jsp
index c772a8ffc6..33a029e765 100644
--- a/apps/routerconsole/jsp/summarynoframe.jsp
+++ b/apps/routerconsole/jsp/summarynoframe.jsp
@@ -7,126 +7,29 @@
%>
" />
+" />
+" />
+" />
+
+
+<%
+/*
+ * The following is required for the reseed button to work, although we probably
+ * only need the reseedNonce property.
+ */
+%>
+<%
+/*
+ * The following is required for the update buttons to work, although we probably
+ * only need the updateNonce property.
+ */
+%>
" />
-
-<% java.io.File lpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "docs/toolbar.html");
- // you better have target="_top" for the links in there...
- if (lpath.exists()) { %>
-
-
-
-
-<% } else { %>
-
-
-
-
-<% } %>
-
-, never reveal it to anyone" href="netdb.jsp?r=." target="_top">Local Identity
-
-Version: |
- |
-
-Uptime: |
-
- |
-
<%
- if (helper.updateAvailable() || helper.unsignedUpdateAvailable()) {
- // display all the time so we display the final failure message
- out.print("
" + net.i2p.router.web.UpdateHandler.getStatus());
- if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress"))) {
- } else if((!update.isDone()) &&
- request.getParameter("action") == null &&
- request.getParameter("updateNonce") == null &&
- net.i2p.router.web.ConfigRestartBean.getRestartTimeRemaining() > 12*60*1000) {
- long nonce = new java.util.Random().nextLong();
- String prev = System.getProperty("net.i2p.router.web.UpdateHandler.nonce");
- if (prev != null) System.setProperty("net.i2p.router.web.UpdateHandler.noncePrev", prev);
- System.setProperty("net.i2p.router.web.UpdateHandler.nonce", nonce+"");
- String uri = request.getRequestURI();
- out.print("\n");
- }
- }
+ // moved to java for ease of translation and to avoid 30 copies
+ helper.renderSummaryBar();
%>
-
-<%=net.i2p.router.web.ConfigRestartBean.renderStatus(request.getRequestURI(), request.getParameter("action"), request.getParameter("consoleNonce"))%>
-
-
-Active: | / |
-Fast: | |
-High capacity: | |
-Integrated: | |
-Known: | |
-
-<%
- if (helper.showFirewallWarning()) {
- %><%
- }
- boolean reseedInProgress = Boolean.valueOf(System.getProperty("net.i2p.router.web.ReseedHandler.reseedInProgress")).booleanValue();
- // If showing the reseed link is allowed
- if (helper.allowReseed()) {
- if (reseedInProgress) {
- // While reseed occurring, show status message instead
- out.print("" + System.getProperty("net.i2p.router.web.ReseedHandler.statusMessage","") + "
");
- } else {
- // While no reseed occurring, show reseed link
- long nonce = new java.util.Random().nextLong();
- String prev = System.getProperty("net.i2p.router.web.ReseedHandler.nonce");
- if (prev != null) System.setProperty("net.i2p.router.web.ReseedHandler.noncePrev", prev);
- System.setProperty("net.i2p.router.web.ReseedHandler.nonce", nonce+"");
- String uri = request.getRequestURI();
- out.print("\n");
- }
- }
- // If a new reseed ain't running, and the last reseed had errors, show error message
- if (!reseedInProgress) {
- String reseedErrorMessage = System.getProperty("net.i2p.router.web.ReseedHandler.errorMessage","");
- if (reseedErrorMessage.length() > 0) {
- out.print("" + reseedErrorMessage + "
");
- }
- }
- %>
-
-
-1s: | /K/s |
-5m: | /K/s |
-Total: | /K/s |
-Used: | / |
-
-
-Exploratory: | / |
-Client: | / |
-Participating: | |
-
-
-Job lag: | |
-Message delay: | |
-Tunnel lag: | |
-Backlog: | |
-
diff --git a/apps/routerconsole/locale/messages_de.po b/apps/routerconsole/locale/messages_de.po
new file mode 100644
index 0000000000..905828c4d0
--- /dev/null
+++ b/apps/routerconsole/locale/messages_de.po
@@ -0,0 +1,281 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the routerconsole package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo , 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P routerconsole\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-10-20 11:55+0000\n"
+"PO-Revision-Date: 2009-10-19 12:50+0000\n"
+"Last-Translator: foo \n"
+"Language-Team: foo \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: German\n"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:95
+msgid "config update"
+msgstr "config update in german test test test"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:334
+msgid "Update policy"
+msgstr "Update policy in german foobarbaz"
+
+#: src/net/i2p/router/web/CSSHelper.java:36
+#: src/net/i2p/router/web/SummaryBarRenderer.java:26
+#: src/net/i2p/router/web/SummaryBarRenderer.java:28
+msgid "I2P Router Console"
+msgstr ""
+
+#: src/net/i2p/router/web/ConfigUpdateHelper.java:90
+msgid "Notify only"
+msgstr "Notify only in german"
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:42
+msgid "I2P Services"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:48
+msgid "Manage your I2P hosts file here (I2P domain name resolution)"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:50
+msgid "Addressbook"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:54
+msgid "Built-in anonymous BitTorrent Client"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:56
+msgid "Torrents"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:60
+msgid "Anonymous webmail client"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:62
+msgid "Webmail"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:66
+msgid "Anonymous resident webserver"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:68
+msgid "Webserver"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:72
+msgid "Configure I2P Router"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:74
+msgid "I2P Internals"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:80
+#: src/net/i2p/router/web/SummaryBarRenderer.java:344
+msgid "View existing tunnels and tunnel build status"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:82
+msgid "Tunnels"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:86
+#: src/net/i2p/router/web/SummaryBarRenderer.java:221
+msgid "Show all current peer connections"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:88
+#: src/net/i2p/router/web/SummaryBarRenderer.java:223
+msgid "Peers"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:92
+msgid "Show recent peer performance profiles"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:94
+msgid "Profiles"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:98
+msgid "Show list of all known I2P routers"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:100
+msgid "NetDB"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:104
+msgid "Health Report"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:106
+msgid "Logs"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:110
+msgid "Show the router's workload, and how it's performing"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:112
+msgid "Jobs"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:116
+msgid "Graph router performance"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:118
+msgid "Graphs"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:122
+msgid "Textual router performance statistics"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:124
+msgid "Stats"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:134
+msgid "I2P Router Help"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:136
+msgid "General"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:139
+msgid "Your unique I2P router identity is"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:143
+msgid "never reveal it to anyone"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:145
+msgid "Local Identity"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:150
+msgid "Version"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:157
+msgid "How long we've been running for this session"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:160
+msgid "Uptime"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:167
+msgid ""
+"Help with configuring your firewall and router for optimal I2P performance"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:194
+msgid "Download"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:198
+#: src/net/i2p/router/web/SummaryBarRenderer.java:207
+msgid "Update"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:203
+msgid "Download Unsigned"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:229
+msgid "Active"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:237
+msgid "Fast"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:243
+msgid "High capacity"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:249
+msgid "Integrated"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:255
+msgid "Known"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:270
+msgid "Help with firewall configuration"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:272
+msgid "Check NAT/firewall"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:309
+msgid "Configure router bandwidth allocation"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:311
+msgid "Bandwidth in/out"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:328
+msgid "Total"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:336
+msgid "Used"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:346
+msgid "Tunnels in/out"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:351
+msgid "Exploratory"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:359
+msgid "Client"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:367
+msgid "Participating"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:373
+msgid "What's in the router's job queue?"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:375
+msgid "Congestion"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:380
+msgid "Job lag"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:386
+msgid "Message delay"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:392
+msgid "Tunnel lag"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:398
+msgid "Backlog"
+msgstr ""
diff --git a/apps/routerconsole/locale/messages_zh.po b/apps/routerconsole/locale/messages_zh.po
new file mode 100644
index 0000000000..8456438ca9
--- /dev/null
+++ b/apps/routerconsole/locale/messages_zh.po
@@ -0,0 +1,281 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the routerconsole package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo , 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P routerconsole\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-10-20 11:55+0000\n"
+"PO-Revision-Date: 2009-10-19 12:59+0000\n"
+"Last-Translator: foo \n"
+"Language-Team: foo \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Chinese\n"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:95
+msgid "config update"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:334
+msgid "Update policy"
+msgstr ""
+
+#: src/net/i2p/router/web/CSSHelper.java:36
+#: src/net/i2p/router/web/SummaryBarRenderer.java:26
+#: src/net/i2p/router/web/SummaryBarRenderer.java:28
+msgid "I2P Router Console"
+msgstr ""
+
+#: src/net/i2p/router/web/ConfigUpdateHelper.java:90
+msgid "Notify only"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:42
+msgid "I2P Services"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:48
+msgid "Manage your I2P hosts file here (I2P domain name resolution)"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:50
+msgid "Addressbook"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:54
+msgid "Built-in anonymous BitTorrent Client"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:56
+msgid "Torrents"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:60
+msgid "Anonymous webmail client"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:62
+msgid "Webmail"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:66
+msgid "Anonymous resident webserver"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:68
+msgid "Webserver"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:72
+msgid "Configure I2P Router"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:74
+msgid "I2P Internals"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:80
+#: src/net/i2p/router/web/SummaryBarRenderer.java:344
+msgid "View existing tunnels and tunnel build status"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:82
+msgid "Tunnels"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:86
+#: src/net/i2p/router/web/SummaryBarRenderer.java:221
+msgid "Show all current peer connections"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:88
+#: src/net/i2p/router/web/SummaryBarRenderer.java:223
+msgid "Peers"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:92
+msgid "Show recent peer performance profiles"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:94
+msgid "Profiles"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:98
+msgid "Show list of all known I2P routers"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:100
+msgid "NetDB"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:104
+msgid "Health Report"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:106
+msgid "Logs"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:110
+msgid "Show the router's workload, and how it's performing"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:112
+msgid "Jobs"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:116
+msgid "Graph router performance"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:118
+msgid "Graphs"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:122
+msgid "Textual router performance statistics"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:124
+msgid "Stats"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:134
+msgid "I2P Router Help"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:136
+msgid "General"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:139
+msgid "Your unique I2P router identity is"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:143
+msgid "never reveal it to anyone"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:145
+msgid "Local Identity"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:150
+msgid "Version"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:157
+msgid "How long we've been running for this session"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:160
+msgid "Uptime"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:167
+msgid ""
+"Help with configuring your firewall and router for optimal I2P performance"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:194
+msgid "Download"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:198
+#: src/net/i2p/router/web/SummaryBarRenderer.java:207
+msgid "Update"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:203
+msgid "Download Unsigned"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:229
+msgid "Active"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:237
+msgid "Fast"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:243
+msgid "High capacity"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:249
+msgid "Integrated"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:255
+msgid "Known"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:270
+msgid "Help with firewall configuration"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:272
+msgid "Check NAT/firewall"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:309
+msgid "Configure router bandwidth allocation"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:311
+msgid "Bandwidth in/out"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:328
+msgid "Total"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:336
+msgid "Used"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:346
+msgid "Tunnels in/out"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:351
+msgid "Exploratory"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:359
+msgid "Client"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:367
+msgid "Participating"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:373
+msgid "What's in the router's job queue?"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:375
+msgid "Congestion"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:380
+msgid "Job lag"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:386
+msgid "Message delay"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:392
+msgid "Tunnel lag"
+msgstr ""
+
+#: src/net/i2p/router/web/SummaryBarRenderer.java:398
+msgid "Backlog"
+msgstr ""
diff --git a/core/java/src/net/i2p/util/LogWriter.java b/core/java/src/net/i2p/util/LogWriter.java
index 1437b9f4ae..829b91d7b2 100644
--- a/core/java/src/net/i2p/util/LogWriter.java
+++ b/core/java/src/net/i2p/util/LogWriter.java
@@ -153,13 +153,13 @@ class LogWriter implements Runnable {
if (!parent.exists()) {
boolean ok = parent.mkdirs();
if (!ok) {
- System.err.println("Unable to create the parent directy: " + parent.getAbsolutePath());
- System.exit(0);
+ System.err.println("Unable to create the parent directory: " + parent.getAbsolutePath());
+ //System.exit(0);
}
}
if (!parent.isDirectory()) {
System.err.println("wtf, we cannot put the logs in a subdirectory of a plain file! we want to stre the log as " + f.getAbsolutePath());
- System.exit(0);
+ //System.exit(0);
}
}
try {
diff --git a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java
index e241ff1f4a..757549e49a 100644
--- a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java
+++ b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java
@@ -362,10 +362,10 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
return new TunnelGatewayMessage(context);
case DataMessage.MESSAGE_TYPE:
return new DataMessage(context);
- case TunnelCreateMessage.MESSAGE_TYPE:
- return new TunnelCreateMessage(context);
- case TunnelCreateStatusMessage.MESSAGE_TYPE:
- return new TunnelCreateStatusMessage(context);
+ //case TunnelCreateMessage.MESSAGE_TYPE:
+ // return new TunnelCreateMessage(context);
+ //case TunnelCreateStatusMessage.MESSAGE_TYPE:
+ // return new TunnelCreateStatusMessage(context);
case TunnelBuildMessage.MESSAGE_TYPE:
return new TunnelBuildMessage(context);
case TunnelBuildReplyMessage.MESSAGE_TYPE:
diff --git a/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java
index e192e7752c..5c5e5a0a45 100644
--- a/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java
@@ -60,6 +60,4 @@ class DummyNetworkDatabaseFacade extends NetworkDatabaseFacade {
public Set getAllRouters() { return new HashSet(_routers.keySet()); }
public Set findNearestRouters(Hash key, int maxNumRouters, Set peersToIgnore) { return new HashSet(_routers.values()); }
-
- public void renderStatusHTML(Writer out) throws IOException {}
}
diff --git a/router/java/src/net/i2p/router/DummyTunnelManagerFacade.java b/router/java/src/net/i2p/router/DummyTunnelManagerFacade.java
index 3a19cd1178..4b8fb486e4 100644
--- a/router/java/src/net/i2p/router/DummyTunnelManagerFacade.java
+++ b/router/java/src/net/i2p/router/DummyTunnelManagerFacade.java
@@ -10,11 +10,14 @@ package net.i2p.router;
import java.io.IOException;
import java.io.Writer;
+import java.util.List;
+import java.util.Map;
import java.util.Set;
import net.i2p.data.Destination;
import net.i2p.data.Hash;
import net.i2p.data.TunnelId;
+import net.i2p.router.tunnel.pool.TunnelPool;
/**
* Build and maintain tunnels throughout the network.
@@ -50,4 +53,10 @@ class DummyTunnelManagerFacade implements TunnelManagerFacade {
public void restart() {}
public void shutdown() {}
public void startup() {}
+
+ public void listPools(List out) {}
+ public Map getInboundClientPools() { return null; }
+ public Map getOutboundClientPools() { return null; }
+ public TunnelPool getInboundExploratoryPool() { return null; }
+ public TunnelPool getOutboundExploratoryPool() { return null; }
}
diff --git a/router/java/src/net/i2p/router/InNetMessagePool.java b/router/java/src/net/i2p/router/InNetMessagePool.java
index 802aedec0a..1d3cac39dd 100644
--- a/router/java/src/net/i2p/router/InNetMessagePool.java
+++ b/router/java/src/net/i2p/router/InNetMessagePool.java
@@ -18,8 +18,8 @@ import net.i2p.data.i2np.DatabaseLookupMessage;
import net.i2p.data.i2np.DatabaseSearchReplyMessage;
import net.i2p.data.i2np.DeliveryStatusMessage;
import net.i2p.data.i2np.I2NPMessage;
-import net.i2p.data.i2np.TunnelCreateMessage;
-import net.i2p.data.i2np.TunnelCreateStatusMessage;
+//import net.i2p.data.i2np.TunnelCreateMessage;
+//import net.i2p.data.i2np.TunnelCreateStatusMessage;
import net.i2p.data.i2np.TunnelDataMessage;
import net.i2p.data.i2np.TunnelGatewayMessage;
import net.i2p.util.I2PThread;
@@ -74,7 +74,7 @@ public class InNetMessagePool implements Service {
_context.statManager().createRateStat("inNetPool.dropped", "How often do we drop a message", "InNetPool", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l });
_context.statManager().createRateStat("inNetPool.droppedDeliveryStatusDelay", "How long after a delivery status message is created do we receive it back again (for messages that are too slow to be handled)", "InNetPool", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l });
_context.statManager().createRateStat("inNetPool.duplicate", "How often do we receive a duplicate message", "InNetPool", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l });
- _context.statManager().createRateStat("inNetPool.droppedTunnelCreateStatusMessage", "How often we drop a slow-to-arrive tunnel request response", "InNetPool", new long[] { 60*60*1000l, 24*60*60*1000l });
+ //_context.statManager().createRateStat("inNetPool.droppedTunnelCreateStatusMessage", "How often we drop a slow-to-arrive tunnel request response", "InNetPool", new long[] { 60*60*1000l, 24*60*60*1000l });
_context.statManager().createRateStat("inNetPool.droppedDbLookupResponseMessage", "How often we drop a slow-to-arrive db search response", "InNetPool", new long[] { 60*60*1000l, 24*60*60*1000l });
_context.statManager().createRateStat("pool.dispatchDataTime", "How long a tunnel dispatch takes", "Tunnels", new long[] { 10*60*1000l, 60*60*1000l, 24*60*60*1000l });
_context.statManager().createRateStat("pool.dispatchGatewayTime", "How long a tunnel gateway dispatch takes", "Tunnels", new long[] { 10*60*1000l, 60*60*1000l, 24*60*60*1000l });
@@ -125,8 +125,8 @@ public class InNetMessagePool implements Service {
if (invalidReason != null) {
int level = Log.WARN;
- if (messageBody instanceof TunnelCreateMessage)
- level = Log.INFO;
+ //if (messageBody instanceof TunnelCreateMessage)
+ // level = Log.INFO;
if (_log.shouldLog(level))
_log.log(level, "Duplicate message received [" + messageBody.getUniqueId()
+ " expiring on " + exp + "]: " + messageBody.getClass().getName() + ": " + invalidReason
@@ -195,10 +195,10 @@ public class InNetMessagePool implements Service {
_log.warn("Dropping unhandled delivery status message created " + timeSinceSent + "ms ago: " + messageBody);
_context.statManager().addRateData("inNetPool.droppedDeliveryStatusDelay", timeSinceSent, timeSinceSent);
}
- } else if (type == TunnelCreateStatusMessage.MESSAGE_TYPE) {
- if (_log.shouldLog(Log.INFO))
- _log.info("Dropping slow tunnel create request response: " + messageBody);
- _context.statManager().addRateData("inNetPool.droppedTunnelCreateStatusMessage", 1, 0);
+ //} else if (type == TunnelCreateStatusMessage.MESSAGE_TYPE) {
+ // if (_log.shouldLog(Log.INFO))
+ // _log.info("Dropping slow tunnel create request response: " + messageBody);
+ // _context.statManager().addRateData("inNetPool.droppedTunnelCreateStatusMessage", 1, 0);
} else if (type == DatabaseSearchReplyMessage.MESSAGE_TYPE) {
if (_log.shouldLog(Log.INFO))
_log.info("Dropping slow db lookup response: " + messageBody);
diff --git a/router/java/src/net/i2p/router/MessageHistory.java b/router/java/src/net/i2p/router/MessageHistory.java
index a116aaca7c..4db6c47c68 100644
--- a/router/java/src/net/i2p/router/MessageHistory.java
+++ b/router/java/src/net/i2p/router/MessageHistory.java
@@ -39,9 +39,8 @@ public class MessageHistory {
private final static byte[] NL = System.getProperty("line.separator").getBytes();
private final static int FLUSH_SIZE = 1000; // write out at least once every 1000 entries
- /** config property determining whether we want to debug with the message history */
+ /** config property determining whether we want to debug with the message history - default false */
public final static String PROP_KEEP_MESSAGE_HISTORY = "router.keepHistory";
- public final static boolean DEFAULT_KEEP_MESSAGE_HISTORY = false;
/** config property determining where we want to log the message history, if we're keeping one */
public final static String PROP_MESSAGE_HISTORY_FILENAME = "router.historyFilename";
public final static String DEFAULT_MESSAGE_HISTORY_FILENAME = "messageHistory.txt";
@@ -67,19 +66,8 @@ public class MessageHistory {
String getFilename() { return _historyFile; }
private void updateSettings() {
- String keepHistory = _context.router().getConfigSetting(PROP_KEEP_MESSAGE_HISTORY);
- if (keepHistory != null) {
- _doLog = Boolean.TRUE.toString().equalsIgnoreCase(keepHistory);
- } else {
- _doLog = DEFAULT_KEEP_MESSAGE_HISTORY;
- }
-
- String filename = null;
- if (_doLog) {
- filename = _context.router().getConfigSetting(PROP_MESSAGE_HISTORY_FILENAME);
- if ( (filename == null) || (filename.trim().length() <= 0) )
- filename = DEFAULT_MESSAGE_HISTORY_FILENAME;
- }
+ _doLog = Boolean.valueOf(_context.getProperty(PROP_KEEP_MESSAGE_HISTORY)).booleanValue();
+ _historyFile = _context.getProperty(PROP_MESSAGE_HISTORY_FILENAME, DEFAULT_MESSAGE_HISTORY_FILENAME);
}
/**
@@ -96,13 +84,6 @@ public class MessageHistory {
_reinitializeJob.getTiming().setStartAfter(_context.clock().now()+5000);
_context.jobQueue().addJob(_reinitializeJob);
} else {
- String filename = null;
- filename = _context.router().getConfigSetting(PROP_MESSAGE_HISTORY_FILENAME);
- if ( (filename == null) || (filename.trim().length() <= 0) )
- filename = DEFAULT_MESSAGE_HISTORY_FILENAME;
-
- _doLog = DEFAULT_KEEP_MESSAGE_HISTORY;
- _historyFile = filename;
_localIdent = getName(_context.routerHash());
// _unwrittenEntries = new ArrayList(64);
updateSettings();
@@ -142,6 +123,7 @@ public class MessageHistory {
* @param replyTunnel the tunnel sourceRoutePeer should forward the source routed message to
* @param replyThrough the gateway of the tunnel that the sourceRoutePeer will be sending to
*/
+/********
public void requestTunnelCreate(TunnelId createTunnel, TunnelId outTunnel, Hash peerRequested, Hash nextPeer, TunnelId replyTunnel, Hash replyThrough) {
if (!_doLog) return;
StringBuilder buf = new StringBuilder(128);
@@ -156,6 +138,7 @@ public class MessageHistory {
buf.append("who forwards it through [").append(replyTunnel.getTunnelId()).append("] on [").append(getName(replyThrough)).append("]");
addEntry(buf.toString());
}
+*********/
/**
* The local router has received a request to join the createTunnel with the next hop being nextPeer,
@@ -167,6 +150,7 @@ public class MessageHistory {
* @param ok whether we will join the tunnel
* @param sourceRoutePeer peer through whom we should send our garlic routed ok through
*/
+/*********
public void receiveTunnelCreate(TunnelId createTunnel, Hash nextPeer, Date expire, boolean ok, Hash sourceRoutePeer) {
if (!_doLog) return;
StringBuilder buf = new StringBuilder(128);
@@ -177,6 +161,7 @@ public class MessageHistory {
buf.append("ok? ").append(ok).append(" expiring on [").append(getTime(expire.getTime())).append("]");
addEntry(buf.toString());
}
+*********/
/**
* The local router has joined the given tunnel operating in the given state.
diff --git a/router/java/src/net/i2p/router/NetworkDatabaseFacade.java b/router/java/src/net/i2p/router/NetworkDatabaseFacade.java
index 865fbf8ecc..3885ea6d53 100644
--- a/router/java/src/net/i2p/router/NetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/NetworkDatabaseFacade.java
@@ -10,6 +10,7 @@ package net.i2p.router;
import java.io.IOException;
import java.io.Writer;
+import java.util.Collections;
import java.util.Set;
import net.i2p.data.Hash;
@@ -60,7 +61,10 @@ public abstract class NetworkDatabaseFacade implements Service {
public int getKnownLeaseSets() { return 0; }
public boolean isInitialized() { return true; }
public void rescan() {}
- public void renderRouterInfoHTML(Writer out, String s) throws IOException {}
- public void renderLeaseSetHTML(Writer out) throws IOException {}
- public void renderStatusHTML(Writer out, boolean b) throws IOException {}
+ /** @deprecated moved to router console */
+ public void renderStatusHTML(Writer out) throws IOException {}
+ /** public for NetDbRenderer in routerconsole */
+ public Set getLeases() { return Collections.EMPTY_SET; }
+ /** public for NetDbRenderer in routerconsole */
+ public Set getRouters() { return Collections.EMPTY_SET; }
}
diff --git a/router/java/src/net/i2p/router/TunnelManagerFacade.java b/router/java/src/net/i2p/router/TunnelManagerFacade.java
index e8bdc31d38..148499a43d 100644
--- a/router/java/src/net/i2p/router/TunnelManagerFacade.java
+++ b/router/java/src/net/i2p/router/TunnelManagerFacade.java
@@ -8,11 +8,14 @@ package net.i2p.router;
*
*/
+import java.util.List;
+import java.util.Map;
import java.util.Set;
import net.i2p.data.Destination;
import net.i2p.data.Hash;
import net.i2p.data.TunnelId;
+import net.i2p.router.tunnel.pool.TunnelPool;
/**
* Build and maintain tunnels throughout the network.
@@ -74,4 +77,14 @@ public interface TunnelManagerFacade extends Service {
public void setOutboundSettings(TunnelPoolSettings settings);
public void setInboundSettings(Hash client, TunnelPoolSettings settings);
public void setOutboundSettings(Hash client, TunnelPoolSettings settings);
+ /** for TunnelRenderer in router console */
+ public void listPools(List out);
+ /** for TunnelRenderer in router console */
+ public Map getInboundClientPools();
+ /** for TunnelRenderer in router console */
+ public Map getOutboundClientPools();
+ /** for TunnelRenderer in router console */
+ public TunnelPool getInboundExploratoryPool();
+ /** for TunnelRenderer in router console */
+ public TunnelPool getOutboundExploratoryPool();
}
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
index 491b823a7b..be55c3da6d 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
@@ -848,7 +848,9 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
return searchJob;
}
- private Set getLeases() {
+ /** public for NetDbRenderer in routerconsole */
+ @Override
+ public Set getLeases() {
if (!_initialized) return null;
Set leases = new HashSet();
Set keys = getDataStore().getKeys();
@@ -860,7 +862,9 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
}
return leases;
}
- private Set getRouters() {
+ /** public for NetDbRenderer in routerconsole */
+ @Override
+ public Set getRouters() {
if (!_initialized) return null;
Set routers = new HashSet();
Set keys = getDataStore().getKeys();
@@ -897,241 +901,4 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
}
_context.jobQueue().addJob(new StoreJob(_context, this, key, ds, onSuccess, onFailure, sendTimeout, toIgnore));
}
-
- class LeaseSetComparator implements Comparator {
- public int compare(Object l, Object r) {
- Destination dl = ((LeaseSet)l).getDestination();
- Destination dr = ((LeaseSet)r).getDestination();
- boolean locall = _context.clientManager().isLocal(dl);
- boolean localr = _context.clientManager().isLocal(dr);
- if (locall && !localr) return -1;
- if (localr && !locall) return 1;
- return dl.calculateHash().toBase64().compareTo(dr.calculateHash().toBase64());
- }
- }
-
- class RouterInfoComparator implements Comparator {
- public int compare(Object l, Object r) {
- return ((RouterInfo)l).getIdentity().getHash().toBase64().compareTo(((RouterInfo)r).getIdentity().getHash().toBase64());
- }
- }
-
- @Override
- public void renderRouterInfoHTML(Writer out, String routerPrefix) throws IOException {
- StringBuilder buf = new StringBuilder(4*1024);
- buf.append("Network Database RouterInfo Lookup
\n");
- if (".".equals(routerPrefix)) {
- renderRouterInfo(buf, _context.router().getRouterInfo(), true, true);
- } else {
- boolean notFound = true;
- Set routers = getRouters();
- for (Iterator iter = routers.iterator(); iter.hasNext(); ) {
- RouterInfo ri = (RouterInfo)iter.next();
- Hash key = ri.getIdentity().getHash();
- if (key.toBase64().startsWith(routerPrefix)) {
- renderRouterInfo(buf, ri, false, true);
- notFound = false;
- }
- }
- if (notFound)
- buf.append("Router ").append(routerPrefix).append(" not found in network database");
- }
- out.write(buf.toString());
- out.flush();
- }
-
- public void renderStatusHTML(Writer out) throws IOException {
- renderStatusHTML(out, true);
- }
-
- @Override
- public void renderLeaseSetHTML(Writer out) throws IOException {
- StringBuilder buf = new StringBuilder(4*1024);
- buf.append("Network Database Contents
\n");
- buf.append("View RouterInfo");
- buf.append("LeaseSets
\n");
- Set leases = new TreeSet(new LeaseSetComparator());
- leases.addAll(getLeases());
- long now = _context.clock().now();
- for (Iterator iter = leases.iterator(); iter.hasNext(); ) {
- LeaseSet ls = (LeaseSet)iter.next();
- Destination dest = ls.getDestination();
- Hash key = dest.calculateHash();
- buf.append("LeaseSet: ").append(key.toBase64());
- if (_context.clientManager().isLocal(dest)) {
- buf.append(" (Local ");
- if (! _context.clientManager().shouldPublishLeaseSet(key))
- buf.append("Unpublished ");
- buf.append("Destination ");
- TunnelPoolSettings in = _context.tunnelManager().getInboundSettings(key);
- if (in != null && in.getDestinationNickname() != null)
- buf.append(in.getDestinationNickname());
- else
- buf.append(dest.toBase64().substring(0, 6));
- } else {
- buf.append(" (Destination ");
- String host = _context.namingService().reverseLookup(dest);
- if (host != null)
- buf.append(host);
- else
- buf.append(dest.toBase64().substring(0, 6));
- }
- buf.append(")
\n");
- long exp = ls.getEarliestLeaseDate()-now;
- if (exp > 0)
- buf.append("Expires in ").append(DataHelper.formatDuration(exp)).append("
\n");
- else
- buf.append("Expired ").append(DataHelper.formatDuration(0-exp)).append(" ago
\n");
- for (int i = 0; i < ls.getLeaseCount(); i++) {
- buf.append("Lease ").append(i + 1).append(": Gateway ");
- buf.append(_context.commSystem().renderPeerHTML(ls.getLease(i).getGateway()));
- buf.append(" Tunnel ").append(ls.getLease(i).getTunnelId().getTunnelId()).append("
\n");
- }
- buf.append("
\n");
- out.write(buf.toString());
- buf.setLength(0);
- }
- out.write(buf.toString());
- out.flush();
- }
-
- @Override
- public void renderStatusHTML(Writer out, boolean full) throws IOException {
- int size = getKnownRouters() * 512;
- if (full)
- size *= 4;
- StringBuilder buf = new StringBuilder(size);
- out.write("\n");
- if (!_initialized) {
- buf.append("Not initialized\n");
- out.write(buf.toString());
- out.flush();
- return;
- }
-
- Hash us = _context.routerHash();
- out.write("\n");
-
- RouterInfo ourInfo = _context.router().getRouterInfo();
- renderRouterInfo(buf, ourInfo, true, true);
- out.write(buf.toString());
- buf.setLength(0);
-
- ObjectCounter versions = new ObjectCounter();
- ObjectCounter countries = new ObjectCounter();
-
- Set routers = new TreeSet(new RouterInfoComparator());
- routers.addAll(getRouters());
- for (Iterator iter = routers.iterator(); iter.hasNext(); ) {
- RouterInfo ri = (RouterInfo)iter.next();
- Hash key = ri.getIdentity().getHash();
- boolean isUs = key.equals(us);
- if (!isUs) {
- renderRouterInfo(buf, ri, false, full);
- out.write(buf.toString());
- buf.setLength(0);
- String routerVersion = ri.getOption("router.version");
- if (routerVersion != null)
- versions.increment(routerVersion);
- String country = _context.commSystem().getCountry(key);
- if(country != null)
- countries.increment(country);
- }
- }
-
- buf.append("");
- List versionList = new ArrayList(versions.objects());
- if (versionList.size() > 0) {
- Collections.sort(versionList, Collections.reverseOrder());
- buf.append("\n");
- buf.append("Version | Count | \n");
- for (String routerVersion : versionList) {
- int num = versions.count(routerVersion);
- buf.append("").append(DataHelper.stripHTML(routerVersion));
- buf.append(" | ").append(num).append(" | \n");
- }
- buf.append(" \n");
- }
- buf.append(" | ");
- out.write(buf.toString());
- buf.setLength(0);
-
- List countryList = new ArrayList(countries.objects());
- if (countryList.size() > 0) {
- Collections.sort(countryList);
- buf.append("\n");
- buf.append("Country | Count | \n");
- for (String country : countryList) {
- int num = countries.count(country);
- buf.append(" ");
- buf.append(_context.commSystem().getCountryName(country));
- buf.append(" | ").append(num).append(" | \n");
- }
- buf.append(" \n");
- }
- buf.append(" |
");
- out.write(buf.toString());
- out.flush();
- }
-
- /**
- * Be careful to use stripHTML for any displayed routerInfo data
- * to prevent vulnerabilities
- */
- private void renderRouterInfo(StringBuilder buf, RouterInfo info, boolean isUs, boolean full) {
- String hash = info.getIdentity().getHash().toBase64();
- buf.append("");
- if (isUs) {
- buf.append("Our info: ").append(hash).append(" |
---|
\n");
- } else {
- buf.append("Peer info for: ").append(hash).append("\n");
- if (full) {
- buf.append("[Back] |
\n");
- } else {
- buf.append("[Full entry] | \n");
- }
- }
-
- long age = _context.clock().now() - info.getPublished();
- if (isUs && _context.router().isHidden())
- buf.append("Hidden, Updated: ").append(DataHelper.formatDuration(age)).append(" ago \n");
- else if (age > 0)
- buf.append("Published: ").append(DataHelper.formatDuration(age)).append(" ago \n");
- else
- buf.append("Published: in ").append(DataHelper.formatDuration(0-age)).append("??? \n");
- buf.append("Address(es): ");
- String country = _context.commSystem().getCountry(info.getIdentity().getHash());
- if(country != null) {
- buf.append(" ");
- }
- for (Iterator iter = info.getAddresses().iterator(); iter.hasNext(); ) {
- RouterAddress addr = (RouterAddress)iter.next();
- buf.append(DataHelper.stripHTML(addr.getTransportStyle())).append(": ");
- for (Iterator optIter = addr.getOptions().keySet().iterator(); optIter.hasNext(); ) {
- String name = (String)optIter.next();
- String val = addr.getOptions().getProperty(name);
- buf.append('[').append(DataHelper.stripHTML(name)).append('=').append(DataHelper.stripHTML(val)).append("] ");
- }
- }
- buf.append(" | \n");
- if (full) {
- buf.append("Stats:
\n");
- for (Iterator iter = info.getOptions().keySet().iterator(); iter.hasNext(); ) {
- String key = (String)iter.next();
- String val = info.getOption(key);
- buf.append(DataHelper.stripHTML(key)).append(" = ").append(DataHelper.stripHTML(val)).append(" \n");
- }
- buf.append(" |
\n");
- } else {
- }
- buf.append("\n");
- }
-
}
diff --git a/router/java/src/net/i2p/router/peermanager/PeerManagerFacadeImpl.java b/router/java/src/net/i2p/router/peermanager/PeerManagerFacadeImpl.java
index 14ee5317e2..69d5f11ce5 100644
--- a/router/java/src/net/i2p/router/peermanager/PeerManagerFacadeImpl.java
+++ b/router/java/src/net/i2p/router/peermanager/PeerManagerFacadeImpl.java
@@ -78,7 +78,7 @@ public class PeerManagerFacadeImpl implements PeerManagerFacade {
return _manager.getPeersByCapability(capability);
}
- /** @deprecated, moved to routerconsole */
+ /** @deprecated moved to routerconsole */
public void renderStatusHTML(Writer out) throws IOException {
}
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java
index 147dd2f764..3cb4fc9ab2 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java
@@ -374,6 +374,9 @@ public class TunnelDispatcher implements Service {
_context.statManager().addRateData("tunnel.dispatchDataTime", dispatchTime, dispatchTime);
}
+ /** High for now, just to prevent long-lived-message attacks */
+ private static final long MAX_FUTURE_EXPIRATION = 3*60*1000 + Router.CLOCK_FUDGE_FACTOR;
+
/**
* We are the inbound tunnel gateway, so encrypt it as necessary and forward
* it on.
@@ -385,7 +388,10 @@ public class TunnelDispatcher implements Service {
if (gw != null) {
if (_log.shouldLog(Log.DEBUG))
_log.debug("dispatch where we are the inbound gateway: " + gw + ": " + msg);
- if ( (msg.getMessageExpiration() < before - Router.CLOCK_FUDGE_FACTOR) || (msg.getMessage().getMessageExpiration() < before - Router.CLOCK_FUDGE_FACTOR) ) {
+ long minTime = before - Router.CLOCK_FUDGE_FACTOR;
+ long maxTime = before + MAX_FUTURE_EXPIRATION;
+ if ( (msg.getMessageExpiration() < minTime) || (msg.getMessage().getMessageExpiration() < minTime) ||
+ (msg.getMessageExpiration() > maxTime) || (msg.getMessage().getMessageExpiration() > maxTime) ) {
if (_log.shouldLog(Log.ERROR))
_log.error("Not dispatching a gateway message for tunnel " + msg.getTunnelId().getTunnelId()
+ " as the wrapper's expiration is in " + DataHelper.formatDuration(msg.getMessageExpiration()-before)
@@ -463,6 +469,12 @@ public class TunnelDispatcher implements Service {
_log.warn("why are you sending a tunnel message that expired "
+ (before-msg.getMessageExpiration()) + "ms ago? "
+ msg, new Exception("cause"));
+ } else if (msg.getMessageExpiration() > before + MAX_FUTURE_EXPIRATION) {
+ if (_log.shouldLog(Log.ERROR))
+ _log.error("why are you sending a tunnel message that expires "
+ + (msg.getMessageExpiration() - before) + "ms from now? "
+ + msg, new Exception("cause"));
+ return;
}
long tid1 = outboundTunnel.getTunnelId();
long tid2 = (targetTunnel != null ? targetTunnel.getTunnelId() : -1);
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
index f7c752c8c9..d879750359 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
@@ -391,7 +391,7 @@ public class TunnelPoolManager implements TunnelManagerFacade {
}
/** list of TunnelPool instances currently in play */
- void listPools(List out) {
+ public void listPools(List out) {
synchronized (_clientInboundPools) {
out.addAll(_clientInboundPools.values());
}
@@ -409,227 +409,8 @@ public class TunnelPoolManager implements TunnelManagerFacade {
public int getInboundBuildQueueSize() { return _executor.getInboundBuildQueueSize(); }
-
+ /** @deprecated moved to routerconsole */
public void renderStatusHTML(Writer out) throws IOException {
- out.write("Exploratory tunnels (config):
\n");
- renderPool(out, _inboundExploratory, _outboundExploratory);
-
- List
destinations = null;
- synchronized (_clientInboundPools) {
- destinations = new ArrayList(_clientInboundPools.keySet());
- }
- for (int i = 0; i < destinations.size(); i++) {
- Hash client = destinations.get(i);
- TunnelPool in = null;
- TunnelPool outPool = null;
- synchronized (_clientInboundPools) {
- in = _clientInboundPools.get(client);
- }
- synchronized (_clientOutboundPools) {
- outPool = _clientOutboundPools.get(client);
- }
- String name = (in != null ? in.getSettings().getDestinationNickname() : null);
- if ( (name == null) && (outPool != null) )
- name = outPool.getSettings().getDestinationNickname();
- if (name == null)
- name = client.toBase64().substring(0,4);
- out.write("Client tunnels for " + name);
- if (_context.clientManager().isLocal(client))
- out.write(" (config):
\n");
- else
- out.write(" (dead):\n");
- renderPool(out, in, outPool);
- }
-
- List participating = _context.tunnelDispatcher().listParticipatingTunnels();
- Collections.sort(participating, new TunnelComparator());
- out.write("Participating tunnels:
\n");
- out.write("Receive on | From | "
- + "Send on | To | Expiration | "
- + "Usage | Rate | Role |
\n");
- long processed = 0;
- RateStat rs = _context.statManager().getRate("tunnel.participatingMessageCount");
- if (rs != null)
- processed = (long)rs.getRate(10*60*1000).getLifetimeTotalValue();
- int inactive = 0;
- for (int i = 0; i < participating.size(); i++) {
- HopConfig cfg = (HopConfig)participating.get(i);
- if (cfg.getProcessedMessagesCount() <= 0) {
- inactive++;
- continue;
- }
- out.write("");
- if (cfg.getReceiveTunnel() != null)
- out.write(" " + cfg.getReceiveTunnel().getTunnelId() +" | ");
- else
- out.write(" n/a | ");
- if (cfg.getReceiveFrom() != null)
- out.write(" " + netDbLink(cfg.getReceiveFrom()) +" | ");
- else
- out.write(" | ");
- if (cfg.getSendTunnel() != null)
- out.write(" " + cfg.getSendTunnel().getTunnelId() +" | ");
- else
- out.write(" | ");
- if (cfg.getSendTo() != null)
- out.write(" " + netDbLink(cfg.getSendTo()) +" | ");
- else
-// out.write(" | ");
- out.write(" | ");
- long timeLeft = cfg.getExpiration()-_context.clock().now();
- if (timeLeft > 0)
- out.write(" " + DataHelper.formatDuration(timeLeft) + " | ");
- else
- out.write(" (grace period) | ");
- out.write(" " + cfg.getProcessedMessagesCount() + "KB | ");
- int lifetime = (int) ((_context.clock().now() - cfg.getCreation()) / 1000);
- if (lifetime <= 0)
- lifetime = 1;
- if (lifetime > 10*60)
- lifetime = 10*60;
- int bps = 1024 * (int) cfg.getProcessedMessagesCount() / lifetime;
- out.write(" " + bps + "Bps | ");
- if (cfg.getSendTo() == null)
- out.write(" Outbound Endpoint | ");
- else if (cfg.getReceiveFrom() == null)
- out.write(" Inbound Gateway | ");
- else
- out.write(" Participant | ");
- out.write("
\n");
- processed += cfg.getProcessedMessagesCount();
- }
- out.write("
\n");
- out.write("Inactive participating tunnels: " + inactive + "
\n");
- out.write("Lifetime bandwidth usage: " + DataHelper.formatSize(processed*1024) + "B
\n");
- renderPeers(out);
- }
-
- class TunnelComparator implements Comparator {
- public int compare(Object l, Object r) {
- return (int) (((HopConfig)r).getProcessedMessagesCount() - ((HopConfig)l).getProcessedMessagesCount());
- }
- }
-
- private void renderPool(Writer out, TunnelPool in, TunnelPool outPool) throws IOException {
- List tunnels = null;
- if (in == null)
- tunnels = new ArrayList();
- else
- tunnels = in.listTunnels();
- if (outPool != null)
- tunnels.addAll(outPool.listTunnels());
-
- long processedIn = (in != null ? in.getLifetimeProcessed() : 0);
- long processedOut = (outPool != null ? outPool.getLifetimeProcessed() : 0);
-
- int live = 0;
- int maxLength = 1;
- for (int i = 0; i < tunnels.size(); i++) {
- TunnelInfo info = tunnels.get(i);
- if (info.getLength() > maxLength)
- maxLength = info.getLength();
- }
- out.write("In/Out | Expiry | Usage | Gateway | ");
- if (maxLength > 3) {
- out.write("Participants | ");
- }
- else if (maxLength == 3) {
- out.write("Participant | ");
- }
- if (maxLength > 1) {
- out.write("Endpoint | ");
- }
- out.write("
\n");
- for (int i = 0; i < tunnels.size(); i++) {
- TunnelInfo info = tunnels.get(i);
- long timeLeft = info.getExpiration()-_context.clock().now();
- if (timeLeft <= 0)
- continue; // don't display tunnels in their grace period
- live++;
- if (info.isInbound())
- out.write("  | ");
- else
- out.write("
 | ");
- out.write(" " + DataHelper.formatDuration(timeLeft) + " | \n");
- out.write(" " + info.getProcessedMessagesCount() + "KB | \n");
- for (int j = 0; j < info.getLength(); j++) {
- Hash peer = info.getPeer(j);
- TunnelId id = (info.isInbound() ? info.getReceiveTunnelId(j) : info.getSendTunnelId(j));
- if (_context.routerHash().equals(peer)) {
- out.write(" " + (id == null ? "" : "" + id) + " | ");
- } else {
- String cap = getCapacity(peer);
- out.write(" " + netDbLink(peer) + (id == null ? "" : " " + id) + cap + " | ");
- }
- if (info.getLength() < maxLength && (info.getLength() == 1 || j == info.getLength() - 2)) {
- for (int k = info.getLength(); k < maxLength; k++)
- out.write(" | ");
- }
- }
- out.write("
\n");
-
- if (info.isInbound())
- processedIn += info.getProcessedMessagesCount();
- else
- processedOut += info.getProcessedMessagesCount();
- }
- out.write("
\n");
- if (in != null) {
- List pending = in.listPending();
- if (pending.size() > 0)
- out.write("Build in progress: " + pending.size() + " inbound\n");
- live += pending.size();
- }
- if (outPool != null) {
- List pending = outPool.listPending();
- if (pending.size() > 0)
- out.write("Build in progress: " + pending.size() + " outbound\n");
- live += pending.size();
- }
- if (live <= 0)
- out.write("No tunnels; waiting for the grace period to end.\n");
- out.write("Lifetime bandwidth usage: " + DataHelper.formatSize(processedIn*1024) + "B in, " +
- DataHelper.formatSize(processedOut*1024) + "B out");
- }
-
- private void renderPeers(Writer out) throws IOException {
- // count up the peers in the local pools
- ObjectCounter lc = new ObjectCounter();
- int tunnelCount = countTunnelsPerPeer(lc);
-
- // count up the peers in the participating tunnels
- ObjectCounter pc = new ObjectCounter();
- int partCount = countParticipatingPerPeer(pc);
-
- Set peers = new HashSet(lc.objects());
- peers.addAll(pc.objects());
- List peerList = new ArrayList(peers);
- Collections.sort(peerList, new HashComparator());
-
- out.write("Tunnel Counts By Peer:
\n");
- out.write("Peer | Expl. + Client | % of total | Part. from + to | % of total |
\n");
- for (Hash h : peerList) {
- out.write(" ");
- out.write(netDbLink(h));
- out.write(" | " + lc.count(h));
- out.write(" | ");
- if (tunnelCount > 0)
- out.write("" + (lc.count(h) * 100 / tunnelCount));
- else
- out.write('0');
- out.write(" | " + pc.count(h));
- out.write(" | ");
- if (partCount > 0)
- out.write("" + (pc.count(h) * 100 / partCount));
- else
- out.write('0');
- out.write('\n');
- }
- out.write(" |
\n");
}
/** @return total number of non-fallback expl. + client tunnels */
@@ -682,39 +463,27 @@ public class TunnelPoolManager implements TunnelManagerFacade {
return rv;
}
- /** @return total number of part. tunnels */
- private int countParticipatingPerPeer(ObjectCounter pc) {
- List participating = _context.tunnelDispatcher().listParticipatingTunnels();
- for (HopConfig cfg : participating) {
- Hash from = cfg.getReceiveFrom();
- if (from != null)
- pc.increment(from);
- Hash to = cfg.getSendTo();
- if (to != null)
- pc.increment(to);
- }
- return participating.size();
- }
-
- class HashComparator implements Comparator {
- public int compare(Object l, Object r) {
- return ((Hash)l).toBase64().compareTo(((Hash)r).toBase64());
+ /** for TunnelRenderer in router console */
+ public Map getInboundClientPools() {
+ synchronized (_clientInboundPools) {
+ return new HashMap(_clientInboundPools);
}
}
- private String getCapacity(Hash peer) {
- RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer);
- if (info != null) {
- String caps = info.getCapabilities();
- for (char c = Router.CAPABILITY_BW12; c <= Router.CAPABILITY_BW256; c++) {
- if (caps.indexOf(c) >= 0)
- return " " + c;
- }
+ /** for TunnelRenderer in router console */
+ public Map getOutboundClientPools() {
+ synchronized (_clientOutboundPools) {
+ return new HashMap(_clientOutboundPools);
}
- return "";
}
- private String netDbLink(Hash peer) {
- return _context.commSystem().renderPeerHTML(peer);
+ /** for TunnelRenderer in router console */
+ public TunnelPool getInboundExploratoryPool() {
+ return _inboundExploratory;
+ }
+
+ /** for TunnelRenderer in router console */
+ public TunnelPool getOutboundExploratoryPool() {
+ return _outboundExploratory;
}
}
diff --git a/router/java/src/net/i2p/data/i2np/TunnelCreateMessage.java b/router/java/test/net/i2p/data/i2np/TunnelCreateMessage.java
similarity index 100%
rename from router/java/src/net/i2p/data/i2np/TunnelCreateMessage.java
rename to router/java/test/net/i2p/data/i2np/TunnelCreateMessage.java
diff --git a/router/java/src/net/i2p/data/i2np/TunnelCreateStatusMessage.java b/router/java/test/net/i2p/data/i2np/TunnelCreateStatusMessage.java
similarity index 100%
rename from router/java/src/net/i2p/data/i2np/TunnelCreateStatusMessage.java
rename to router/java/test/net/i2p/data/i2np/TunnelCreateStatusMessage.java