propagate from branch 'i2p.i2p.zzz.test3' (head 1f086d33dd3479afceb025d2da7956d7470fb3e5)

to branch 'i2p.i2p' (head 6959293ce260b9da4d61776717c02e20a0c7b2dd)
This commit is contained in:
zzz
2009-08-07 18:30:04 +00:00
51 changed files with 1229 additions and 453 deletions

View File

@@ -711,7 +711,7 @@ public class I2PSnarkServlet extends HttpServlet {
out.write("<span class=\"snarkConfigTitle\">Configuration:</span><br />\n");
out.write("Data directory: <input type=\"text\" size=\"40\" name=\"dataDir\" value=\"" + dataDir + "\" ");
out.write("title=\"Directory to store torrents and data\" disabled=\"true\" /> <i>(Edit i2psnark.config and restart to change)</i><br />\n");
out.write("Auto start: <input type=\"checkbox\" name=\"autoStart\" value=\"true\" "
out.write("Auto start: <input type=\"checkbox\" class=\"optbox\" name=\"autoStart\" value=\"true\" "
+ (autoStart ? "checked " : "")
+ "title=\"If true, automatically start torrents that are added\" />");
//Auto add: <input type="checkbox" name="autoAdd" value="true" title="If true, automatically add torrents that are found in the data directory" />
@@ -738,7 +738,7 @@ public class I2PSnarkServlet extends HttpServlet {
out.write("Up bandwidth limit: <input type=\"text\" name=\"upBW\" value=\""
+ _manager.util().getMaxUpBW() + "\" size=\"3\" maxlength=\"3\" /> KBps <i>(Half <a href=\"/config.jsp\" target=\"blank\">available bandwidth</a> recommended.)</i><br />\n");
out.write("Use open trackers also: <input type=\"checkbox\" name=\"useOpenTrackers\" value=\"true\" "
out.write("Use open trackers also: <input type=\"checkbox\" class=\"optbox\" name=\"useOpenTrackers\" value=\"true\" "
+ (useOpenTrackers ? "checked " : "")
+ "title=\"If true, uses open trackers in addition\" /> ");
out.write("Announce URLs: <input type=\"text\" name=\"openTrackers\" value=\""

View File

@@ -55,7 +55,7 @@ public class ConfigClientsHandler extends FormHandler {
else
startWebApp(app);
} else {
addFormError("Unsupported " + _action);
addFormError("Unsupported " + _action + ".");
}
}
@@ -70,18 +70,18 @@ public class ConfigClientsHandler extends FormHandler {
ca.disabled = val == null;
}
ClientAppConfig.writeClientAppConfig(_context, clients);
addFormNotice("Client configuration saved successfully - restart required to take effect");
addFormNotice("Client configuration saved successfully - restart required to take effect.");
}
private void startClient(int i) {
List clients = ClientAppConfig.getClientApps(_context);
if (i >= clients.size()) {
addFormError("Bad client index");
addFormError("Bad client index.");
return;
}
ClientAppConfig ca = (ClientAppConfig) clients.get(i);
LoadClientAppsJob.runClient(ca.className, ca.clientName, LoadClientAppsJob.parseArgs(ca.args), _log);
addFormNotice("Client " + ca.clientName + " started");
addFormNotice("Client " + ca.clientName + " started.");
}
private void saveWebAppChanges() {
@@ -98,7 +98,7 @@ public class ConfigClientsHandler extends FormHandler {
props.setProperty(name, "" + (val != null));
}
RouterConsoleRunner.storeWebAppProperties(props);
addFormNotice("WebApp configuration saved successfully - restart required to take effect");
addFormNotice("WebApp configuration saved successfully - restart required to take effect.");
}
// Big hack for the moment, not using properties for directory and port
@@ -116,14 +116,14 @@ public class ConfigClientsHandler extends FormHandler {
path = new File(path, app + ".war");
s.addWebApplication("/"+ app, path.getAbsolutePath()).start();
// no passwords... initialize(wac);
addFormNotice("WebApp <a href=\"/" + app + "/\">" + app + "</a> started");
addFormNotice("WebApp <a href=\"/" + app + "/\">" + app + "</a> started.");
} catch (Exception ioe) {
addFormError("Failed to start " + app + " " + ioe);
addFormError("Failed to start " + app + " " + ioe + ".");
}
return;
}
}
}
addFormError("Failed to find server");
addFormError("Failed to find server.");
}
}

View File

@@ -14,8 +14,8 @@ public class ConfigClientsHelper extends HelperBase {
public String getForm1() {
StringBuilder buf = new StringBuilder(1024);
buf.append("<table border=\"1\">\n");
buf.append("<tr><th>Client</th><th>Run at Startup?</th><th>Start Now</th><th>Class and arguments</th></tr>\n");
buf.append("<table>\n");
buf.append("<tr><th align=\"right\">Client</th><th>Run at Startup?</th><th>Start Now</th><th align=\"left\">Class and arguments</th></tr>\n");
List clients = ClientAppConfig.getClientApps(_context);
for (int cur = 0; cur < clients.size(); cur++) {
@@ -30,8 +30,8 @@ public class ConfigClientsHelper extends HelperBase {
public String getForm2() {
StringBuilder buf = new StringBuilder(1024);
buf.append("<table border=\"1\">\n");
buf.append("<tr><th>WebApp</th><th>Run at Startup?</th><th>Start Now</th><th>Description</th></tr>\n");
buf.append("<table>\n");
buf.append("<tr><th align=\"right\">WebApp</th><th>Run at Startup?</th><th>Start Now</th><th align=\"left\">Description</th></tr>\n");
Properties props = RouterConsoleRunner.webAppProperties();
Set keys = new TreeSet(props.keySet());
for (Iterator iter = keys.iterator(); iter.hasNext(); ) {
@@ -47,7 +47,7 @@ public class ConfigClientsHelper extends HelperBase {
}
private void renderForm(StringBuilder buf, String index, String name, boolean urlify, boolean enabled, boolean ro, String desc) {
buf.append("<tr><td>");
buf.append("<tr><td class=\"mediumtags\" align=\"right\" width=\"25%\">");
if (urlify && enabled) {
String link = "/";
if (! RouterConsoleRunner.ROUTERCONSOLE.equals(name))
@@ -56,16 +56,16 @@ public class ConfigClientsHelper extends HelperBase {
} else {
buf.append(name);
}
buf.append("</td><td align=\"center\"><input type=\"checkbox\" name=\"").append(index).append(".enabled\" value=\"true\" ");
buf.append("</td><td align=\"center\" width=\"10%\"><input type=\"checkbox\" class=\"optbox\" name=\"").append(index).append(".enabled\" value=\"true\" ");
if (enabled) {
buf.append("checked=\"true\" ");
if (ro)
buf.append("disabled=\"true\" ");
}
buf.append("/></td><td>&nbsp;");
buf.append("/></td><td align=\"center\" width=\"15%\">");
if (!enabled) {
buf.append("<button type=\"submit\" name=\"action\" value=\"Start ").append(index).append("\" >Start<span class=hide> ").append(index).append("</span></button>");
}
buf.append("&nbsp;</td><td>").append(desc).append("</td></tr>\n");
buf.append("</td><td align=\"left\" width=\"50%\">").append(desc).append("</td></tr>\n");
}
}

View File

@@ -47,7 +47,7 @@ public class ConfigTunnelsHandler extends FormHandler {
boolean saveRequired = false;
if (_log.shouldLog(Log.DEBUG))
_log.debug("Saving changes, with props = " + _settings);
_log.debug("Saving changes, with props = " + _settings + ".");
int updated = 0;
int index = 0;
@@ -67,7 +67,7 @@ public class ConfigTunnelsHandler extends FormHandler {
try {
client.fromBase64(poolName);
} catch (DataFormatException dfe) {
addFormError("Internal error (pool name could not resolve - " + poolName + ")");
addFormError("Internal error (pool name could not resolve - " + poolName + ").");
index++;
continue;
}
@@ -76,7 +76,7 @@ public class ConfigTunnelsHandler extends FormHandler {
}
if ( (in == null) || (out == null) ) {
addFormError("Internal error (pool settings cound not be found for " + poolName + ")");
addFormError("Internal error (pool settings cound not be found for " + poolName + ").");
index++;
continue;
}
@@ -131,14 +131,14 @@ public class ConfigTunnelsHandler extends FormHandler {
}
if (updated > 0)
addFormNotice("Updated settings for " + updated + " pools");
addFormNotice("Updated settings for " + updated + " pools.");
if (saveRequired) {
boolean saved = _context.router().saveConfig();
if (saved)
addFormNotice("Exploratory tunnel configuration saved successfully");
addFormNotice("Exploratory tunnel configuration saved successfully.");
else
addFormNotice("Error saving the configuration (applied but not saved) - please see the error logs");
addFormNotice("Error saving the configuration (applied but not saved) - please see the error logs.");
}
}
private static final int getInt(Object val) {

View File

@@ -62,18 +62,18 @@ public class ConfigTunnelsHelper extends HelperBase {
in.getLength() + in.getLengthVariance() <= 0 ||
out.getLength() <= 0 ||
out.getLength() + out.getLengthVariance() <= 0)
buf.append("<tr><th colspan=\"3\"><font color=\"red\">ANONYMITY WARNING - Settings include 0-hop tunnels</font></th></tr>");
buf.append("<tr><th colspan=\"3\"><font color=\"red\">ANONYMITY WARNING - Settings include 0-hop tunnels.</font></th></tr>");
else if (in.getLength() <= 1 ||
in.getLength() + in.getLengthVariance() <= 1 ||
out.getLength() <= 1 ||
out.getLength() + out.getLengthVariance() <= 1)
buf.append("<tr><th colspan=\"3\"><font color=\"red\">ANONYMITY WARNING - Settings include 1-hop tunnels</font></th></tr>");
buf.append("<tr><th colspan=\"3\"><font color=\"red\">ANONYMITY WARNING - Settings include 1-hop tunnels.</font></th></tr>");
if (in.getLength() + Math.abs(in.getLengthVariance()) >= WARN_LENGTH ||
out.getLength() + Math.abs(out.getLengthVariance()) >= WARN_LENGTH)
buf.append("<tr><th colspan=\"3\"><font color=\"red\">PERFORMANCE WARNING - Settings include very long tunnels</font></th></tr>");
buf.append("<tr><th colspan=\"3\"><font color=\"red\">PERFORMANCE WARNING - Settings include very long tunnels.</font></th></tr>");
if (in.getQuantity() + in.getBackupQuantity() >= WARN_QUANTITY ||
out.getQuantity() + out.getBackupQuantity() >= WARN_QUANTITY)
buf.append("<tr><th colspan=\"3\"><font color=\"red\">PERFORMANCE WARNING - Settings include high tunnel quantities</font></th></tr>");
buf.append("<tr><th colspan=\"3\"><font color=\"red\">PERFORMANCE WARNING - Settings include high tunnel quantities.</font></th></tr>");
buf.append("<tr><th></th><th><img src=\"/themes/console/images/inbound.png\" alt=\"Inbound\" title=\"Inbound Tunnels\"/>&nbsp;&nbsp;Inbound</th><th><img src=\"/themes/console/images/outbound.png\" alt=\"Outbound Tunnels\" title=\"Outbound\"/>&nbsp;&nbsp;Outbound</th></tr>\n");

View File

@@ -24,8 +24,8 @@ public class ConfigUIHandler extends FormHandler {
else
_context.router().setConfigSetting(CSSHelper.PROP_THEME_NAME, _config);
if (_context.router().saveConfig())
addFormNotice("Theme change successfully saved (<a href=\"configui.jsp\">refresh page to view</a>)");
addFormNotice("Theme change successfully saved (<a href=\"configui.jsp\">refresh page</a> to view).");
else
addFormNotice("Error saving the configuration (applied but not saved) - please see the error logs");
addFormNotice("Error saving the configuration (applied but not saved) - please see the error logs.");
}
}

View File

@@ -9,7 +9,7 @@ public class ConfigUIHelper extends HelperBase {
StringBuilder buf = new StringBuilder(512);
String current = _context.getProperty(CSSHelper.PROP_THEME_NAME, CSSHelper.DEFAULT_THEME);
for (String theme : themes) {
buf.append("<input type=\"radio\" name=\"theme\" ");
buf.append("<input type=\"radio\" class=\"optbox\" name=\"theme\" ");
if (theme.equals(current))
buf.append("checked=\"true\" ");
buf.append("value=\"").append(theme).append("\"/>").append(theme).append("<br />\n");

View File

@@ -42,10 +42,10 @@ public class ConfigUpdateHelper extends HelperBase {
public String getUpdateThroughProxy() {
String proxy = _context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY);
if (Boolean.valueOf(proxy).booleanValue())
return "<input type=\"checkbox\" value=\"true\" name=\"updateThroughProxy\" checked=\"true\" >";
return "<input type=\"checkbox\" class=\"optbox\" value=\"true\" name=\"updateThroughProxy\" checked=\"true\" >";
else
return "<input type=\"checkbox\" value=\"true\" name=\"updateThroughProxy\" >";
return "<input type=\"checkbox\" class=\"optbox\" value=\"true\" name=\"updateThroughProxy\" >";
}
private static final long PERIODS[] = new long[] { 12*60*60*1000l, 24*60*60*1000l, 48*60*60*1000l, -1l };

View File

@@ -109,13 +109,13 @@ public class GraphHelper extends HelperBase {
_out.write("<p />[<a href=\"configstats.jsp\">Select Stats to Graph</a>]<p />");
_out.write("<form action=\"graphs.jsp\" method=\"GET\">");
_out.write("Periods: <input size=\"3\" type=\"text\" name=\"periodCount\" value=\"" + _periodCount + "\" /><br />\n");
_out.write("Plot averages: <input type=\"radio\" name=\"showEvents\" value=\"false\" " + (_showEvents ? "" : "checked=\"true\" ") + " /> ");
_out.write("or plot events: <input type=\"radio\" name=\"showEvents\" value=\"true\" "+ (_showEvents ? "checked=\"true\" " : "") + " /><br />\n");
_out.write("Plot averages: <input type=\"radio\" class=\"optbox\" name=\"showEvents\" value=\"false\" " + (_showEvents ? "" : "checked=\"true\" ") + " /> ");
_out.write("or plot events: <input type=\"radio\" class=\"optbox\" name=\"showEvents\" value=\"true\" "+ (_showEvents ? "checked=\"true\" " : "") + " /><br />\n");
_out.write("Image sizes: width: <input size=\"4\" type=\"text\" name=\"width\" value=\"" + _width
+ "\" /> pixels, height: <input size=\"4\" type=\"text\" name=\"height\" value=\"" + _height
+ "\" /><br />\n");
_out.write("Refresh delay: <select name=\"refreshDelay\"><option value=\"60\">1 minute</option><option value=\"120\">2 minutes</option><option value=\"300\">5 minutes</option><option value=\"600\">10 minutes</option><option value=\"1800\">30 minutes</option><option value=\"3600\">1 hour</option><option value=\"-1\">Never</option></select><br />\n");
_out.write("<hr /><input type=\"submit\" value=\"Redraw\" /></div>");
_out.write("<hr /><div class=\"formaction\"><input type=\"submit\" value=\"Redraw\" /></div></div>");
} catch (IOException ioe) {
ioe.printStackTrace();
}

View File

@@ -30,6 +30,7 @@
<b>I2P will work best if you configure your rates to match the speed of your internet connection.</b>
</p>
<p>
<div class="wideload">
<table>
<tr><td><input style="text-align: right; width: 5em;" name="inboundrate" type="text" size="5" maxlength="5" value="<jsp:getProperty name="nethelper" property="inboundRate" />" /> KBps
In <td>(<jsp:getProperty name="nethelper" property="inboundRateBits" />)<br />
@@ -49,7 +50,7 @@
-->
<tr><td><jsp:getProperty name="nethelper" property="sharePercentageBox" />
Share <td>(<jsp:getProperty name="nethelper" property="shareRateBits" />)<br />
</table>
</table></div>
</p><p>
<% int share = nethelper.getShareBandwidth();
if (share < 12) {
@@ -59,15 +60,14 @@
out.print("It improves your anonymity by creating cover traffic, and helps the network.<br />");
} else {
out.print("You have configured I2P to share<b> " + share + "KBps</b>. ");
out.print("The higher the share bandwidth the more you improve your anonymity and help the network.<br />");
out.print("The higher the share bandwidth the more you improve your anonymity and help the network.<hr />");
}
%>
</p><p>
<input type="submit" name="save" value="Save changes" /> <input type="reset" value="Cancel" /><br />
</p>
<!--
</p><div class="formaction">
<input type="submit" name="save" value="Save changes" /> <input type="reset" value="Cancel" /></div>
<!--
<b>Enable load testing: </b>
<input type="checkbox" name="enableloadtesting" value="true" <jsp:getProperty name="nethelper" property="enableLoadTesting" /> />
<input type="checkbox" class="optbox" name="enableloadtesting" value="true" <jsp:getProperty name="nethelper" property="enableLoadTesting" /> />
<p>If enabled, your router will periodically anonymously probe some of your peers
to see what sort of throughput they can handle. This improves your router's ability
to pick faster peers, but can cost substantial bandwidth. Relevant data from the
@@ -80,20 +80,20 @@
<b>The default settings will work for most people. There is <a href="#chelp">help below</a>.</b>
</p><p>
<b>UPnP Configuration:</b><br />
<input type="checkbox" name="upnp" value="true" <jsp:getProperty name="nethelper" property="upnpChecked" /> />
<input type="checkbox" class="optbox" name="upnp" value="true" <jsp:getProperty name="nethelper" property="upnpChecked" /> />
Enable UPnP to open firewall ports - <a href="peers.jsp#upnp">UPnP status</a>
</p><p>
<b>IP Configuration:</b><br />
Externally reachable hostname or IP address:<br />
<input type="radio" name="udpAutoIP" value="local,upnp,ssu" <%=nethelper.getUdpAutoIPChecked(3) %> />
<input type="radio" class="optbox" name="udpAutoIP" value="local,upnp,ssu" <%=nethelper.getUdpAutoIPChecked(3) %> />
Use all auto-detect methods<br />
<input type="radio" name="udpAutoIP" value="local,ssu" <%=nethelper.getUdpAutoIPChecked(4) %> />
<input type="radio" class="optbox" name="udpAutoIP" value="local,ssu" <%=nethelper.getUdpAutoIPChecked(4) %> />
Disable UPnP IP address detection<br />
<input type="radio" name="udpAutoIP" value="upnp,ssu" <%=nethelper.getUdpAutoIPChecked(5) %> />
<input type="radio" class="optbox" name="udpAutoIP" value="upnp,ssu" <%=nethelper.getUdpAutoIPChecked(5) %> />
Ignore local interface IP address<br />
<input type="radio" name="udpAutoIP" value="ssu" <%=nethelper.getUdpAutoIPChecked(0) %> />
<input type="radio" class="optbox" name="udpAutoIP" value="ssu" <%=nethelper.getUdpAutoIPChecked(0) %> />
Use SSU IP address detection only<br />
<input type="radio" name="udpAutoIP" value="fixed" <%=nethelper.getUdpAutoIPChecked(1) %> />
<input type="radio" class="optbox" name="udpAutoIP" value="fixed" <%=nethelper.getUdpAutoIPChecked(1) %> />
Specify hostname or IP:
<input name ="udpHost1" type="text" size="16" value="<jsp:getProperty name="nethelper" property="udphostname" />" />
<% String[] ips = nethelper.getAddresses();
@@ -110,14 +110,14 @@
}
%>
<br />
<input type="radio" name="udpAutoIP" value="hidden" <%=nethelper.getUdpAutoIPChecked(2) %> />
<input type="radio" class="optbox" name="udpAutoIP" value="hidden" <%=nethelper.getUdpAutoIPChecked(2) %> />
Hidden mode - do not publish IP <i>(prevents participating traffic)</i><br />
</p><p>
<b>UDP Configuration:</b><br />
UDP port:
<input name ="udpPort" type="text" size="5" maxlength="5" value="<jsp:getProperty name="nethelper" property="configuredUdpPort" />" /><br />
<!-- let's keep this simple...
<input type="checkbox" name="requireIntroductions" value="true" <jsp:getProperty name="nethelper" property="requireIntroductionsChecked" /> />
<input type="checkbox" class="optbox" name="requireIntroductions" value="true" <jsp:getProperty name="nethelper" property="requireIntroductionsChecked" /> />
Require SSU introductions
<i>(Enable if you cannot open your firewall)</i>
</p><p>
@@ -126,31 +126,32 @@
</p><p>
<b>TCP Configuration:</b><br />
Externally reachable hostname or IP address:<br />
<input type="radio" name="ntcpAutoIP" value="true" <%=nethelper.getTcpAutoIPChecked(2) %> />
<input type="radio" class="optbox" name="ntcpAutoIP" value="true" <%=nethelper.getTcpAutoIPChecked(2) %> />
Use auto-detected IP address
<i>(currently <jsp:getProperty name="nethelper" property="udpIP" />)</i>
if we are not firewalled<br />
<input type="radio" name="ntcpAutoIP" value="always" <%=nethelper.getTcpAutoIPChecked(3) %> />
<input type="radio" class="optbox" name="ntcpAutoIP" value="always" <%=nethelper.getTcpAutoIPChecked(3) %> />
Always use auto-detected IP address (Not firewalled)<br />
<input type="radio" name="ntcpAutoIP" value="false" <%=nethelper.getTcpAutoIPChecked(1) %> />
<input type="radio" class="optbox" name="ntcpAutoIP" value="false" <%=nethelper.getTcpAutoIPChecked(1) %> />
Specify hostname or IP:
<input name ="ntcphost" type="text" size="16" value="<jsp:getProperty name="nethelper" property="ntcphostname" />" /><br />
<input type="radio" name="ntcpAutoIP" value="false" <%=nethelper.getTcpAutoIPChecked(0) %> />
<input type="radio" class="optbox" name="ntcpAutoIP" value="false" <%=nethelper.getTcpAutoIPChecked(0) %> />
Disable inbound (Firewalled)<br />
<input type="radio" name="ntcpAutoIP" value="disabled" <%=nethelper.getTcpAutoIPChecked(4) %> />
<input type="radio" class="optbox" name="ntcpAutoIP" value="disabled" <%=nethelper.getTcpAutoIPChecked(4) %> />
Completely disable <i>(select only if behind a firewall that throttles or blocks outbound TCP)</i><br />
</p><p>
Externally reachable TCP port:<br />
<input type="radio" name="ntcpAutoPort" value="2" <%=nethelper.getTcpAutoPortChecked(2) %> />
<input type="radio" class="optbox" name="ntcpAutoPort" value="2" <%=nethelper.getTcpAutoPortChecked(2) %> />
Use the same port configured for UDP
<i>(currently <jsp:getProperty name="nethelper" property="udpPort" />)</i><br />
<input type="radio" name="ntcpAutoPort" value="1" <%=nethelper.getTcpAutoPortChecked(1) %> />
<input type="radio" class="optbox" name="ntcpAutoPort" value="1" <%=nethelper.getTcpAutoPortChecked(1) %> />
Specify Port:
<input name ="ntcpport" type="text" size="5" maxlength="5" value="<jsp:getProperty name="nethelper" property="ntcpport" />" /><br />
</p><p><b>Note: Changing these settings will restart your router.</b>
</p>
</p><hr><div class="formaction">
<input type="submit" name="save" value="Save changes" /> <input type="reset" value="Cancel" />
</div>
</div>
<h3><a name="chelp">Configuration Help:</a></h3>
<div align="justify">
<p>
@@ -248,7 +249,7 @@
<hr />
<!--
<b>Dynamic Router Keys: </b>
<input type="checkbox" name="dynamicKeys" value="true" <jsp:getProperty name="nethelper" property="dynamicKeysChecked" /> /><br />
<input type="checkbox" class="optbox" name="dynamicKeys" value="true" <jsp:getProperty name="nethelper" property="dynamicKeysChecked" /> /><br />
<p>
This setting causes your router identity to be regenerated every time your IP address
changes. If you have a dynamic IP this option can speed up your reintegration into

View File

@@ -16,12 +16,13 @@
<div class="main" id="main">
<%@include file="confignav.jsp" %>
<jsp:useBean class="net.i2p.router.web.ConfigAdvancedHandler" id="formhandler" scope="request" />
<jsp:setProperty name="formhandler" property="*" />
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<jsp:getProperty name="formhandler" property="allMessages" />
<div class="configure">
<div class="wideload">
<form action="configadvanced.jsp" method="POST">
<% String prev = System.getProperty("net.i2p.router.web.ConfigAdvancedHandler.nonce");
if (prev != null) System.setProperty("net.i2p.router.web.ConfigAdvancedHandler.noncePrev", prev);
@@ -30,15 +31,14 @@
<input type="hidden" name="action" value="blah" />
<h3>Advanced I2P Configuration</h3>
<textarea rows="32" cols="60" name="config" wrap="off"><jsp:getProperty name="advancedhelper" property="settings" /></textarea><br /><hr>
<p align="right">
<div class="formaction">
<input type="submit" name="shouldsave" value="Apply" />
<input type="reset" value="Cancel" />
</p>
<p>
NOTE: Some changes may require a restart to take effect.
</p>
<input type="reset" value="Cancel" /><br />
<b>NOTE:</b> Some changes may require a restart to take effect.
</div>
</form>
</div>
</div>
</div>
</body>
</html>

View File

@@ -35,14 +35,13 @@ button span.hide{
<h3>Client Configuration</h3>
<p>
The Java clients listed below are started by the router and run in the same JVM.
</p><p>
</p><p> <div class="wideload">
<jsp:getProperty name="clientshelper" property="form1" />
</p><p>
<i>All changes require restart to take effect. To change other client options, edit the clients.config file.</i>
</p> <hr /><p>
</p> <hr /><div class="formaction">
<input type="submit" name="action" value="Save Client Configuration" />
</p>
<hr />
</div></div>
<h3>WebApp Configuration</h3>
<p>
The Java web applications listed below are started by the webConsole client and run in the same JVM as the router.
@@ -54,15 +53,18 @@ button span.hide{
A web app may also be disabled by removing the .war file from the webapps directory;
however the .war file and web app will reappear when you update your router to a newer version,
so disabling the web app here is the preferred method.
</p><p>
</p><p><div class="wideload">
<jsp:getProperty name="clientshelper" property="form2" />
</p><p><hr>
<input type="submit" name="action" value="Save WebApp Configuration" />
</p><hr><p>
</p>
<p>
<i>All changes require restart to take effect. To change other webapp options, edit the webapps.config file.</i>
</p>
<hr><div class="formaction">
<input type="submit" name="action" value="Save WebApp Configuration" />
</div>
</form>
</div>
</div>
</div>
</body>
</html>

View File

@@ -11,7 +11,7 @@
<h1>I2P Keyring Configuration</h1>
<div class="main" id="main">
<%@include file="confignav.jsp" %>
<jsp:useBean class="net.i2p.router.web.ConfigKeyringHandler" id="formhandler" scope="request" />
<jsp:setProperty name="formhandler" property="*" />
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
@@ -26,8 +26,9 @@
<h3>Keyring</h3>
The router keyring is used to decrypt encrypted leaseSets.
The keyring may contain keys for local or remote encrypted destinations.
<p><jsp:getProperty name="keyringhelper" property="summary" />
</p>
<div class="wideload"><p>
<jsp:getProperty name="keyringhelper" property="summary" />
</p></div>
<hr />
@@ -40,22 +41,22 @@
Enter keys for encrypted remote destinations here.
Keys for local destinations must be entered on the <a href="i2ptunnel/index.jsp">I2PTunnel page</a>.
<p>
<div class="wideload">
<table>
<tr>
<td>Dest. name, hash, or full key:
<td><textarea name="peer" cols="44" rows="1" style="height: 3em;" wrap="off"></textarea>
<td class="mediumtags" align="right">Dest. name, hash, or full key:</td>
<td><textarea name="peer" cols="44" rows="1" style="height: 3em;" wrap="off"></textarea></td>
<tr>
<td align="right">Session Key:
<td><input type="text" size="55" name="key" />
<td class="mediumtags" align="right">Session Key:</td>
<td><input type="text" size="55" name="key" /></td>
<tr>
<td>
<td><div align="right">
<input type="submit" name="action" value="Add key" />
</div>
<td align="right">
<input type="submit" name="action" value="Add key" /></td>
</table>
</form>
</div>
</div>
</div>
</body>

View File

@@ -13,7 +13,7 @@
<h1>I2P Logging Configuration</h1>
<div class="main" id="main">
<%@include file="confignav.jsp" %>
<jsp:useBean class="net.i2p.router.web.ConfigLoggingHandler" id="formhandler" scope="request" />
<jsp:setProperty name="formhandler" property="*" />
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
@@ -26,34 +26,35 @@
<input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigLoggingHandler.nonce")%>" />
<input type="hidden" name="action" value="blah" />
<h3>Configure I2P Logging Options</h3>
<div class="wideload">
<table border="0" cellspacing="5">
<tr>
<td valign="top"><b>Logging filename:</b>
<td class="mediumtags" align="right"><b>Logging filename:</b>
<td><input type="text" name="logfilename" size="40" value="<jsp:getProperty name="logginghelper" property="logFilePattern" />" />
<br /> <i>(the symbol '@' will be replaced during log rotation)</i>
<tr>
<td valign="top"><b>Log record format:</b>
<td class="mediumtags" align="right"><b>Log record format:</b>
<td><input type="text" name="logformat" size="20" value="<jsp:getProperty name="logginghelper" property="recordPattern" />" />
<br /> <i>(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority,
'm' = message)</i>
<tr>
<td valign="top"><b>Log date format:</b>
<td class="mediumtags" align="right"><b>Log date format:</b>
<td><input type="text" name="logdateformat" size="20" value="<jsp:getProperty name="logginghelper" property="datePattern" />" />
<br /> <i>('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss'
= second, 'SSS' = millisecond)</i>
<tr>
<td valign="top"><b>Max log file size:</b>
<td class="mediumtags" align="right"><b>Max log file size:</b>
<td><input type="text" name="logfilesize" size="4" value="<jsp:getProperty name="logginghelper" property="maxFileSize" />" />
<br />
<tr>
<td valign="top"><b>Default log level:</b>
<td class="mediumtags" align="right"><b>Default log level:</b>
<td><jsp:getProperty name="logginghelper" property="defaultLogLevelBox" /> <br /> <i>(DEBUG and INFO are not recommended defaults,
as they will drastically slow down your router)</i>
<tr>
<td valign="top"><b>Log level overrides:</b>
<td class="mediumtags" align="right"><b>Log level overrides:</b>
<td><jsp:getProperty name="logginghelper" property="logLevelTable" />
<tr>
<td colspan="2" valign="top"><hr>
<td colspan="2"><hr>
<tr>
<td>
<td> <div align="right">
@@ -64,5 +65,6 @@
</form>
</div>
</div>
</div>
</body>
</html>

View File

@@ -37,18 +37,19 @@
<a name="unsh"> </a>
<a name="bonus"> </a>
<h2>Manual Peer Controls</h2>
Router Hash:
<input type="text" size="55" name="peer" value="<%=peer%>" />
<div class="mediumtags">Router Hash:
<input type="text" size="55" name="peer" value="<%=peer%>" /></div>
<h3>Manually Shitlist / Unshitlist a Router</h3>
Shitlisting will prevent the participation of this peer in tunnels you create.
<p>
<hr />
<div class="formaction">
<input type="submit" name="action" value="Shitlist peer until restart" />
<input type="submit" name="action" value="Unshitlist peer" />
<% if (! "".equals(peer)) { %>
<font color="blue">&lt;---- click to verify action</font>
<!-- <font color="blue">&lt;---- click to verify action</font> -->
<% } %>
</p>
<hr />
</div>
<h3>Adjust Profile Bonuses</h3>
Bonuses may be positive or negative, and affect the peer's inclusion in Fast
and High Capacity tiers. Fast peers are used for client tunnels, and High
@@ -59,24 +60,24 @@
if (! "".equals(peer)) {
// get existing bonus values?
}
%>
Speed:
%>
<hr />
<div class="mediumtags">Speed:
<input type="text" size="8" name="speed" value="<%=speed%>" />
Capacity:
<input type="text" size="8" name="capacity" value="<%=capacity%>" />
<input type="submit" name="action" value="Adjust peer bonuses" />
<input type="submit" name="action" value="Adjust peer bonuses" /></div>
</p>
</form>
<hr />
<a name="shitlist"> </a>
<jsp:useBean class="net.i2p.router.web.ProfilesHelper" id="profilesHelper" scope="request" />
<jsp:setProperty name="profilesHelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<jsp:getProperty name="profilesHelper" property="shitlistSummary" />
<hr />
<div class="wideload">
<jsp:getProperty name="peerhelper" property="blocklistSummary" />
</div>
</div>
</div>
</body>

View File

@@ -26,11 +26,11 @@
<p>Graceful shutdown lets the router satisfy the agreements it has already made
before shutting down, but may take a few minutes. If you need to kill the
router immediately, that option is available as well.</p>
<hr><div class="formaction">
<input type="submit" name="action" value="Shutdown gracefully" />
<input type="submit" name="action" value="Shutdown immediately" />
<input type="submit" name="action" value="Cancel graceful shutdown" />
<hr>
</div>
<% if (System.getProperty("wrapper.version") != null) { %>
<p>If you want the router to restart itself after shutting down, you can choose one of
the following. This is useful in some situations - for example, if you changed
@@ -38,30 +38,32 @@
or the interface it listens on. A graceful restart will take a few minutes (but your peers
will appreciate your patience), while a hard restart does so immediately. After tearing down
the router, it will wait 1 minute before starting back up again.</p>
<hr><div class="formaction">
<input type="submit" name="action" value="Graceful restart" />
<input type="submit" name="action" value="Hard restart" />
<% } %>
<hr>
<% } %></div>
<% if ( (System.getProperty("os.name") != null) && (System.getProperty("os.name").startsWith("Win")) ) { %>
<h3>Systray integration</h3>
<p>On the windows platform, there is a small application to sit in the system
tray, allowing you to view the router's status (later on, I2P client applications
will be able to integrate their own functionality into the system tray as well).
If you are on windows, you can either enable or disable that icon here.</p>
<hr><div class="formaction">
<input type="submit" name="action" value="Show systray icon" />
<input type="submit" name="action" value="Hide systray icon" />
<hr>
</div>
<h3>Run on startup</h3>
<p>You can control whether I2P is run on startup or not by selecting one of the
following options - I2P will install (or remove) a service accordingly. You can
also run the <code>install_i2p_service_winnt.bat</code> (or
<code>uninstall_i2p_service_winnt.bat</code>) from the command line, if you prefer.</p>
<hr><div class="formaction">
<input type="submit" name="action" value="Run I2P on startup" />
<input type="submit" name="action" value="Don't run I2P on startup" /><br />
<input type="submit" name="action" value="Don't run I2P on startup" /></div>
<p><b>Note:</b> If you are running I2P as service right now, removing it will shut
down your router immediately. You may want to consider shutting down gracefully, as
above, then running uninstall_i2p_service_winnt.bat.</p><hr>
above, then running uninstall_i2p_service_winnt.bat.</p>
<% } %>
<% if (System.getProperty("wrapper.version") != null) { %>
@@ -69,17 +71,19 @@
<p>At times, it may be helpful to debug I2P by getting a thread dump. To do so,
please select the following option and review the thread dumped to
<a href="logs.jsp#servicelogs">wrapper.log</a>.</p>
<hr><div class="formaction">
<input type="submit" name="action" value="Dump threads" />
<% } %><hr>
<% } %></div>
<h3>Launch browser on router startup?</h3>
<p>I2P's main configuration interface is this web console, so for your convenience
I2P can launch a web browser pointing at
<a href="http://127.0.0.1:7657/index.jsp">http://127.0.0.1:7657/index.jsp</a> whenever
the router starts up.</p>
<hr><div class="formaction">
<input type="submit" name="action" value="View console on startup" />
<input type="submit" name="action" value="Do not view console on startup" />
</form><hr>
</form></div>
</div>
</div>
</body>

View File

@@ -56,7 +56,7 @@ function toggleAll(category)
<h1>I2P Stats Configuration</h1>
<div class="main" id="main">
<%@include file="confignav.jsp" %>
<jsp:useBean class="net.i2p.router.web.ConfigStatsHandler" id="formhandler" scope="request" />
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<jsp:setProperty name="formhandler" property="*" />
@@ -73,39 +73,39 @@ function toggleAll(category)
<input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigStatsHandler.nonce")%>" />
<h3>Configure I2P Stat Collection</h3>
Enable full stats?
<input type="checkbox" name="isFull" value="true" <%
<input type="checkbox" class="optbox" name="isFull" value="true" <%
if (statshelper.getIsFull()) { %>checked="true" <% } %>/>
(change requires restart to take effect)<br />
Stat file: <input type="text" name="filename" value="<%=statshelper.getFilename()%>" /><br />
Filter: (<a href="javascript: void(null);" onclick="toggleAll('*')">toggle all</a>)<hr />
<div class="wideload">
<table>
<% while (statshelper.hasMoreStats()) {
while (statshelper.groupRequired()) { %>
<tr><td valign="top" align="left" colspan="3">
<tr class="tablefooter"><td align="left" colspan="3">
<b><%=statshelper.getCurrentGroupName()%></b>
(<a href="javascript: void(null);" onclick="toggleAll('<%=statshelper.getCurrentGroupName()%>')">toggle all</a>)
</td></tr><tr><td>Log</td><td>Graph</td><td></td></tr><%
</td></tr><tr class="tablefooter"><td align="center"><b>Log</b></td><td align="center"><b>Graph</b></td><td></td></tr><%
} // end iterating over required groups for the current stat %>
<tr><td valign="top" align="left">
<tr><td align="center">
<a name="<%=statshelper.getCurrentStatName()%>"></a>
<input id="<%=statshelper.getCurrentGroupName()%>" type="checkbox" name="statList" value="<%=statshelper.getCurrentStatName()%>" <%
<input id="<%=statshelper.getCurrentGroupName()%>" type="checkbox" class="optbox" name="statList" value="<%=statshelper.getCurrentStatName()%>" <%
if (statshelper.getCurrentIsLogged()) { %>checked="true" <% } %>/></td>
<td valign="top" align="left">
<td align="center">
<% if (statshelper.getCurrentCanBeGraphed()) { %>
<input id="<%=statshelper.getCurrentGroupName()%>" type="checkbox" name="graphList" value="<%=statshelper.getCurrentGraphName()%>" <%
<input id="<%=statshelper.getCurrentGroupName()%>" type="checkbox" class="optbox" name="graphList" value="<%=statshelper.getCurrentGraphName()%>" <%
if (statshelper.getCurrentIsGraphed()) { %>checked="true" <% } %>/><% } %></td>
<td valign="top" align="left"><b><%=statshelper.getCurrentStatName()%>:</b><br />
<td align="left"><b><%=statshelper.getCurrentStatName()%>:</b><br />
<%=statshelper.getCurrentStatDescription()%></td></tr><%
} // end iterating over all stats %>
<tr><td colspan="3"><hr /></td></tr>
<tr><td><input type="checkbox" name="explicitFilter" /></td>
<tr><td colspan="3"></td></tr>
<tr><td align="center"><input type="checkbox" class="optbox" name="explicitFilter" /></td>
<td colspan="2">Advanced filter:
<input type="text" name="explicitFilterValue" value="<%=statshelper.getExplicitFilter()%>" size="40" /></td></tr>
<tr><td colspan="3"><hr /></td></tr>
<tr><td><input type="submit" name="shouldsave" value="Save changes" /> </td>
<td><input type="reset" value="Cancel" /></td><td></td></tr></form>
<tr class="tablefooter"><td colspan="3" align="right"><input type="submit" name="shouldsave" value="Save changes" /><input type="reset" value="Cancel" /></td></tr></form>
</table>
</div>
</div>
</div>
</body>
</html>

View File

@@ -14,7 +14,6 @@
<h1>I2P Tunnel Configuration</h1>
<div class="main" id="main">
<%@include file="confignav.jsp" %>
<jsp:useBean class="net.i2p.router.web.ConfigTunnelsHandler" id="formhandler" scope="request" />
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<jsp:setProperty name="formhandler" property="shouldsave" value="<%=request.getParameter("shouldsave")%>" />
@@ -31,7 +30,7 @@
High CPU and/or high outbound bandwidth usage may result.
Change these settings with care, and adjust them if you have problems.
</i></p>
<div class="wideload">
<form action="configtunnels.jsp" method="POST">
<% String prev = System.getProperty("net.i2p.router.web.ConfigTunnelsHandler.nonce");
if (prev != null) System.setProperty("net.i2p.router.web.ConfigTunnelsHandler.noncePrev", prev);
@@ -42,9 +41,10 @@
<i>Note - Exploratory tunnel setting changes are stored in the router.config file.</i></br>
<i>Client tunnel changes are temporary and are not saved.</i><br>
<i>To make permanent client tunnel changes see the </i><a href="i2ptunnel/index.jsp">i2ptunnel page</a>.<br>
<hr /> <input type="submit" name="shouldsave" value="Save changes" /> <input type="reset" value="Cancel" />
<hr /><div class="formaction"><input type="submit" name="shouldsave" value="Save changes" /> <input type="reset" value="Cancel" /></div>
</form>
</div>
</div>
</div>
</body>
</html>

View File

@@ -34,9 +34,9 @@
<input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigUIHandler.nonce")%>" />
<input type="hidden" name="action" value="blah" />
<jsp:getProperty name="uihelper" property="settings" />
<hr>
<hr><div class="formaction">
<input type="submit" name="shouldsave" value="Apply" /> <input type="reset" value="Cancel" />
</form>
</form></div>
<% } else { %>
Theme selection disabled for Internet Explorer, sorry.<hr>If you're not using IE, it's likely that
your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes.

View File

@@ -28,52 +28,49 @@
System.setProperty("net.i2p.router.web.ConfigUpdateHandler.nonce", new java.util.Random().nextLong()+""); %>
<input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigUpdateHandler.nonce")%>" />
<h3>Check for I2P and news updates</h3>
<table border="0" cellspacing="5">
<div class="wideload"><table border="0" cellspacing="5">
<tr>
<td colspan="2"></tr>
<tr>
<td><b>News:</b></td>
<td class= "mediumtags" align="right"><b>News:</b></td>
<td> <% if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress", "false"))) { %> <i>Update In Progress</i><br /> <% } else { %> <input type="submit" name="action" value="Check for update now" />
<% } %></tr>
<tr>
<td colspan="2"><hr /></td>
</tr>
<tr>
<td><b>News URL:</b></td>
<td class= "mediumtags" align="right"><b>News URL:</b></td>
<td><input type="text" size="60" name="newsURL" value="<jsp:getProperty name="updatehelper" property="newsURL" />"></td>
</tr>
<tr>
<td><b>Refresh frequency:</b>
<td class= "mediumtags" align="right"><b>Refresh frequency:</b>
<td><jsp:getProperty name="updatehelper" property="refreshFrequencySelectBox" />
<tr>
<td><b>Update policy:</b>
<td class= "mediumtags" align="right"><b>Update policy:</b>
<td><jsp:getProperty name="updatehelper" property="updatePolicySelectBox" />
<tr>
<td><b>Update through the eepProxy?</b>
<td class= "mediumtags" align="right"><b>Update through the eepProxy?</b>
<td><jsp:getProperty name="updatehelper" property="updateThroughProxy" />
<tr>
<td><b>eepProxy host:</b>
<td class= "mediumtags" align="right"><b>eepProxy host:</b>
<td><input type="text" size="10" name="proxyHost" value="<jsp:getProperty name="updatehelper" property="proxyHost" />" />
<tr>
<td><b>eepProxy port:</b>
<td class= "mediumtags" align="right"><b>eepProxy port:</b>
<td><input type="text" size="4" name="proxyPort" value="<jsp:getProperty name="updatehelper" property="proxyPort" />" />
<tr>
<td><b>Update URLs:</b>
<td class= "mediumtags" align="right"><b>Update URLs:</b>
<td><textarea name="updateURL" wrap="off"><jsp:getProperty name="updatehelper" property="updateURL" /></textarea>
<tr>
<td><b>Trusted keys:</b>
<td class= "mediumtags" align="right"><b>Trusted keys:</b>
<td><textarea name="trustedKeys" wrap="off"><jsp:getProperty name="updatehelper" property="trustedKeys" /></textarea>
<tr>
<tr>
<td colspan="2"><hr />
<tr>
<tr>
<td>
<td><div align="right">
<td><div class="formaction">
<input type="submit" name="action" value="Save" />
<input type="reset" value="Cancel" />
</div>
</table>
</div>
</form>
</div>
</div>

View File

@@ -18,3 +18,4 @@
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="cssHelper" scope="request" />
<jsp:setProperty name="cssHelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<link href="<%=cssHelper.getTheme(request.getHeader("User-Agent"))%>console.css" rel="stylesheet" type="text/css" />
<!--[if IE]><link href="/themes/console/classic/ieshim.css" rel="stylesheet" type="text/css" /><![endif]-->

View File

@@ -11,6 +11,7 @@
<h1>I2P Performance Graphs</h1>
<div class="main" id="main">
<div class="graphspanel">
<div class="widepanel">
<jsp:useBean class="net.i2p.router.web.GraphHelper" id="graphHelper" scope="request" />
<jsp:setProperty name="graphHelper" property="*" />
<jsp:setProperty name="graphHelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
@@ -18,5 +19,6 @@
<jsp:getProperty name="graphHelper" property="images" />
<jsp:getProperty name="graphHelper" property="form" />
</div>
</div>
</body>
</html>

View File

@@ -10,6 +10,7 @@
<%@include file="summary.jsp" %>
<h1>I2P Network Database Summary</h1>
<div class="main" id="main">
<div class="wideload">
<jsp:useBean class="net.i2p.router.web.NetDbHelper" id="netdbHelper" scope="request" />
<jsp:setProperty name="netdbHelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<jsp:setProperty name="netdbHelper" property="writer" value="<%=out%>" />
@@ -18,6 +19,6 @@
<jsp:setProperty name="netdbHelper" property="lease" value="<%=request.getParameter("l")%>" />
<jsp:getProperty name="netdbHelper" property="netDbSummary" />
</div>
</div>
</body>
</html>

View File

@@ -9,7 +9,7 @@
<%@include file="summary.jsp" %>
<h1>I2P Network Peer Profiles</h1>
<div class="main" id="main">
<div class="main" id="main"><div class="wideload">
<jsp:useBean class="net.i2p.router.web.ProfilesHelper" id="profilesHelper" scope="request" />
<jsp:setProperty name="profilesHelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<jsp:getProperty name="profilesHelper" property="profileSummary" />
@@ -17,6 +17,6 @@
<a name="shitlist"> </a>
<jsp:getProperty name="profilesHelper" property="shitlistSummary" />
</div>
</div>
</body>
</html>

View File

@@ -62,7 +62,7 @@
if (!shutdownSoon) {
out.print("<hr /><p><form action=\"summaryframe.jsp\" method=\"GET\">\n");
if ("0".equals(d)) {
out.print("<b>Refresh (s):<b> <input size=\"3\" type=\"text\" name=\"refresh\" value=\"60\" />\n");
out.print("<b>Refresh (s):<b> <input size=\"3\" type=\"text\" name=\"refresh\" value=\"60\" align=\"right\" />\n");
out.print("<button type=\"submit\">Enable</button>\n");
} else {
// this will load in the iframe but subsequent pages will not have the iframe

View File

@@ -26,9 +26,9 @@
<jsp:getProperty name="linkhelper" property="content" />
<% } else { %>
<u><b>I2P Services</b></u><br />
<a href="susimail/susimail" target="blank">Susimail</a>
<a href="susidns/index.jsp" target="_blank">SusiDNS</a>
<a href="i2psnark/" target="_blank">Torrents</a>
<a href="susidns/index.jsp" target="_blank">Addressbook</a>
<a href="i2psnark/" target="_blank">Torrents</a>
<a href="susimail/susimail" target="blank">Webmail</a>
<a href="http://127.0.0.1:7658/" target="_blank">Webserver</a><hr />
<u><b>I2P Internals</b></u><br />
<a href="i2ptunnel/index.jsp" target="_blank">I2PTunnel</a>

View File

@@ -1545,7 +1545,7 @@ public class WebMail extends HttpServlet
"<tr><td align=\"right\">Cc:</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_CC + "\" value=\"" + cc + "\"></td></tr>\n" +
"<tr><td align=\"right\">Bcc:</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_BCC + "\" value=\"" + bcc + "\"></td></tr>\n" +
"<tr><td align=\"right\">Subject:</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_SUBJECT + "\" value=\"" + subject + "\"></td></tr>\n" +
"<tr><td>&nbsp;</td><td align=\"left\"><input type=\"checkbox\" name=\"" + NEW_BCC_TO_SELF + "\" value=\"1\"" + ( bccToSelf.compareToIgnoreCase( "false" ) != 0 ? "checked" : "" )+ ">Bcc to self</td></tr>\n" +
"<tr><td>&nbsp;</td><td align=\"left\"><input type=\"checkbox\" class=\"optbox\" name=\"" + NEW_BCC_TO_SELF + "\" value=\"1\"" + ( bccToSelf.compareToIgnoreCase( "false" ) != 0 ? "checked" : "" )+ ">Bcc to self</td></tr>\n" +
"<tr><td colspan=\"2\" align=\"center\"><textarea cols=\"" + Config.getProperty( CONFIG_COMPOSER_COLS, 80 )+ "\" rows=\"" + Config.getProperty( CONFIG_COMPOSER_ROWS, 10 )+ "\" name=\"" + NEW_TEXT + "\">" + text + "</textarea>" +
"<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n" +
"<tr><td align=\"right\">New Attachment:</td><td align=\"left\"><input type=\"file\" size=\"50%\" name=\"" + NEW_FILENAME + "\" value=\"\"><input type=\"submit\" name=\"" + NEW_UPLOAD + "\" value=\"Upload File\"></td></tr>" );
@@ -1558,7 +1558,7 @@ public class WebMail extends HttpServlet
wroteHeader = true;
}
Attachment attachment = (Attachment)it.next();
out.println( "<tr><td colspan=\"2\" align=\"center\"><input type=\"checkbox\" name=\"check" + attachment.hashCode() + "\" value=\"1\">&nbsp;" + attachment.getFileName() + "</td></tr>");
out.println( "<tr><td colspan=\"2\" align=\"center\"><input type=\"checkbox\" class=\"optbox\" name=\"check" + attachment.hashCode() + "\" value=\"1\">&nbsp;" + attachment.getFileName() + "</td></tr>");
}
}
out.println( "</table>" );
@@ -1632,7 +1632,7 @@ public class WebMail extends HttpServlet
", markAll=" + sessionObject.markAll +
", invert=" + sessionObject.invert +
", clear=" + sessionObject.clear );
out.println( "<tr class=\"list" + bg + "\"><td><input type=\"checkbox\" name=\"check" + i + "\" value=\"1\"" +
out.println( "<tr class=\"list" + bg + "\"><td><input type=\"checkbox\" class=\"optbox\" name=\"check" + i + "\" value=\"1\"" +
( idChecked ? "checked" : "" ) + ">" + ( RELEASE ? "" : "" + i ) + "</td><td>" + link + mail.shortSender + "</a></td><td>&nbsp;</td><td>" + link + mail.shortSubject + "</a></td><td>&nbsp;</td><td>" + mail.formattedDate + "</a></td><td>&nbsp;</td><td>" + mail.size + " Bytes</a></td></tr>" );
bg = 1 - bg;
i++;

View File

@@ -502,7 +502,7 @@ public class TransientSessionKeyManager extends SessionKeyManager {
public String renderStatusHTML() {
StringBuilder buf = new StringBuilder(1024);
buf.append("<h2>Inbound sessions</h2>");
buf.append("<table border=\"1\">");
buf.append("<table>");
Set<TagSet> inbound = getInboundTagSets();
Map<SessionKey, Set<TagSet>> inboundSets = new HashMap(inbound.size());
for (Iterator<TagSet> iter = inbound.iterator(); iter.hasNext();) {
@@ -528,7 +528,7 @@ public class TransientSessionKeyManager extends SessionKeyManager {
buf.append("<h2><b>Outbound sessions</b></h2>");
buf.append("<table border=\"1\">");
buf.append("<table>");
Set<OutboundSession> outbound = getOutboundSessions();
for (Iterator<OutboundSession> iter = outbound.iterator(); iter.hasNext();) {
OutboundSession sess = iter.next();

View File

@@ -1,3 +1,18 @@
2009-08-03 dr|z3d
* Extensive update to the Classic theme; custom css hacks for IE.
2009-08-02 dr|z3d
* Better support for Internet Explorer/classic theme.
* Incremental improvements to classic theme.
* More UI tweaks and fiddles.
* Fixes for I2PSnark UI; more to come.
2009-07-31 dr|z3d
* Resolve anomalous buttons and text fields in console ui.
* Enhance presentation of data in /peers.jsp.
* Fix themes issue with horizontal width of radio/checkbox icons.
* Other cosmetic UI enhancements.
* 2009-07-31 0.7.6 released
2009-07-31 zzz

View File

@@ -1,10 +1,15 @@
/* Optimised for less capable browers and system specifications */
body {
margin: 1em 0em;
padding: 0em;
margin: 0;
padding: 0;
text-align: left;
background: #FFF;
background: #bbf;
color: #000;
font: 10pt/120% Verdana, Tahoma, Helvetica, sans-serif;
/*
font: 10pt/140% Verdana, Tahoma, Helvetica, sans-serif;
*/
font: 9pt/140% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
}
.hide {
@@ -16,18 +21,64 @@ img {
}
pre {
overflow: auto;
font-size: 8pt !important;
width: 100%;
overflow-x: scroll;
}
div.logo {
float: left;
position-relative: top 20px ;
width: 200px;
left: 1em;
top: 1em;
margin: 0em;
padding: .5em;
margin: 0 0 0 20px;
padding: 10px 5px;
text-align: center;
border: 5px solid #ddf;
background-color: #eef;
-moz-border-radius: 15px;
-moz-box-shadow: inset 0px 0px 0px 2px #99f;
-khtml-border-radius: 15px;
-khtml-box-shadow: inset 0px 0px 0px 2px #99f;
}
div.logo hr {
color: #ddf;
background: #ddf;
height: 5px;
border: 0px solid #ddf;
margin: 8px -3px;
}
div.logo a:link, div.logo a:visited {
text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.5);
}
div.logo a:active {
text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7);
color: #f60;
}
div.logo a:hover {
text-shadow: 0px 0px 1px rgba(128, 0, 0, 0.7);
color: #900;
}
div.warning a:link {
color: #f60;
text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.5);
}
div.warning a:visited{
color: #f90;
}
div.warning a:hover{
color: #d30;
text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7);
}
div.warning a:active{
color: #900;
}
div.toolbar {
@@ -37,78 +88,202 @@ div.toolbar {
}
div.routersummaryouter {
float: left;
float: left;
width: 200px;
margin: 0;
padding: 0;
border: 0;
clear: left;/* fixes a bug in Opera */
overflow: auto;
clear: left; /* fixes a bug in Opera */
}
div.routersummary {
background: #fafaff;
width: 175px;
background: #ddf;
width: 190px;
color: inherit;
margin: 0em;
padding: 5px;
text-align: left;
border: medium solid #efefff;
margin: 0;
padding: 7px 0 0 0px;
text-align: center !important;
border: 5px solid #bbf;
font-size: 9pt;
word-wrap: break-word;
font: 9pt/125%;
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
}
div.routersummary hr {
color: #ccf;
background: #ccf;
color: #bbf;
background: #bbf;
height: 2px;
border: 0px solid #ccf;
margin: 10px 0;
border-bottom: 1px inset #bbf;
margin: 5px 1px 4px 1px;
-moz-box-shadow: inset 0px -1px 0px 1px #99f;
}
div.routersummary p {
padding: 0;
}
div.routersummary a:link, div.routersummary a:visited {
text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.3);
}
div.routersummary a:hover {
text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7);
color: #f60;
}
div.routersummary input[type=text] {
text-align: right !important;
}
div.warning {
margin: 0em 1em 1em 224px;
padding: .5em 1em;
background: #ffefef;
border: medium solid #ffafaf;
margin: 20px 20px 10px 260px;
padding: 0px 20px 20px 75px;
background: #ffd;
border: 5px solid #fb7;
text-align: left;
color: inherit;
background-image:url("../images/errortriangle.png");
background-position: 17px center;
background-repeat:no-repeat;
-moz-border-radius: 15px;
-moz-box-shadow: inset 0px 0px 0px 2px #f60;
-kthml-border-radius: 15px;
-khtml-box-shadow: inset 0px 0px 0px 2px #f60;
}
div.warning hr {
color: #fb7;
background: #fb7;
height: 5px;
border: 0px solid #fb7;
margin: 5px 0;
margin: 20px 0;
}
div.warning h3 {
border-bottom: 5px solid #fb7;
padding-bottom: 10px;
}
div.main {
margin: 0em 1em 1em 224px;
padding: .5em 1em;
background: #ffffef;
border: medium solid #ffffd0;
margin: 0px 0px 0px 195px;
padding: 15px 15px 15px 15px;
background: #eef;
border: 5px solid #bbf;
border-top: 0;
text-align: left;
color: inherit;
color: #001;
min-width: 570px;
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
}
div.main li {
padding-bottom: 10px;
list-style: square;
}
div.main li:first-child {
padding-top: 20px;
}
div.main textarea {
width: 100% !important;
width: 98% !important;
margin: 2px 0 2px 5px;
}
div.news {
margin: 0em 1em 1em 224px;
padding: .5em 1em;
margin: -5px 0px 0 195px;
padding: -10px 15px 8px 15px;
background: #ffffc0;
border: medium solid #ffffa0;
border: 5px solid #bbf;
text-align: justify;
color: inherit;
min-width: 600px;
padding-bottom: 8px;
padding-left: 10px;
padding-right: 10px;
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
}
/* convert the list entry to our title */
div.news li {
text-align: justify;
list-style: none;
margin: -15px 15px -20px -20px;
padding: 0px 0 15px 0;
border-bottom: 2px solid #cc7;
border-top: 0px solid #cc7;
padding: 3px 5px 5px 5px;
font-size: 12pt;
color: #540;
}
div.news p {
color: #330;
}
div.news a:link {
color: #773;
text-shadow: 0px 0px 1px rgba(128, 128, 48, 0.3);
}
div.news a:visited {
color: #f00 !important;
text-shadow: 0px 0px 1px rgba(128, 128, 48, 0.3);
}
div.news hr {
color: #cc7;
background: #cc7;
height: 2px;
border: 0px solid #cc7;
margin: 5px 0;
}
div.confignav {
padding: 1em;
background: #efefff;
padding: 12px 0 15px 0;
background: #cfc;
margin: -20px -20px 0 -20px;
border: 5px solid #bbf;
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
}
div.configure {
padding: 1em;
background: #ffffc0;
margin: 1px -20px 0 -20px;
padding: 0px 20px 0px 20px;
}
div.configure table {
font-size: 9pt;
font-weight: bold;
-moz-box-shadow: inset 0px 0px 1px 1px #001;
}
div.configure tr, div.configure td {
padding: 10px 2px;
}
div.configure tr {
-moz-box-shadow: inset 0px 0px 1px 0px #bbf;
}
div.messages {
padding: 1em;
background: #fafaff;
padding: 0px 10px;
background: #fff;
border: 5px solid #bbf;
border-right: 0;
margin: -5px -15px 10px -20px;
text-align: center;
font-size: 9pt;
font-weight: bold;
color: #474;
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
}
div.messages li, div.messages ul {
padding: 15px 0 5px 5px;
margin: -15px 0 0 0;
}
div.messages span.error {
@@ -121,43 +296,80 @@ div.messages span.notice {
h1 {
font-size: 18pt;
text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.7);
text-align: center;
border: 5px solid #bbf;
padding: 13px 10px 12px 10px;
margin: 0 0px 0 195px;
line-height: 93%;
text-transform: uppercase;
letter-spacing: 0.3em;
background: #fff;
min-width: 600px;
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
}
h2 {
font-size: 12pt;
font-size: 14pt;
padding: 10px;
border-bottom: 5px solid #bbf;
border-top: 0px solid #bbf;
letter-spacing: 0.04em;
}
h3 {
font-size: 10pt;
font-size: 12pt;
padding: 0 10px 10px 10px;
border-bottom: 5px solid #bbf;
border-top: 0px solid #bbf;
letter-spacing: 0.04em;
}
.proxyfooter{
font-size: 7pt;
display: none !important;
}
table {
/* border-collapse: collapse; */
border: 5px solid #dfd;
border-collapse: collapse;
border: 5px solid #bbf;
margin: 5px 0px;
cell-padding: 1px;
font-size: 7pt;
background: #fff;
width: 100%;
}
table hr {
padding: 0px 0;
color: #bbf;
background: #bbf;
border: 0px solid #bbf;
margin: 0px -5px;
height: 1px;
}
table tt {
font-size: 7.5pt;
}
th {
background-color: #ccf;
padding: 5px 2px;
background-color: #fff;
padding: 8px 2px;
text-align: center;
border-bottom: 1px solid #88f;
}
tt {
font-size: 8pt;
}
tt, pre {
font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
}
td {
padding: 2px;
padding: 4px;
}
tr:nth-child(even) {
@@ -169,11 +381,11 @@ tr:nth-child(odd) {
}
hr {
color: #ff9;
background: #ff9;
height: 2px;
border: 0px solid #ff9;
margin: 10px 0;
color: #bbf;
background: #bbf;
height: 5px;
border: 0px solid #bbf;
margin: 5px 0;
}
.statusnotes {
@@ -181,6 +393,148 @@ hr {
font-size: 8pt;
color: #001;
text-align: center;
margin: -3px 0 0 0;
background: #fff;
}
margin: -7px 0 7px 0;
background: #bbf;
border: 5px solid #bbf;
border-top: 0;
padding: 4px 0 2px 0;
}
input {
margin: 3px 5px 3px 0;
vertical-align: middle;
}
input[type=text] {
margin: 3px 5px 3px 5px;
vertical-align: middle;
}
select {
margin: 3px 5px 3px 5px;
vertical-align: middle;
}
submit {
margin: 3px 5px 3px 5px;
padding 2px 0;
font: 8pt/140% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
}
p {
padding: 5px 20px 0px 20px;
text-align: justify;
}
.formaction {
text-align: right;
}
.langbox {
margin: 29px -15px 0px 5px;
color: #001;
font-size: 7pt;
width: 180px;
text-align: center;
float: right;
valign: middle;
}
.langbox img {
padding: 0 2px; /* Ignored by IE8 */
}
a:link{
color: #006;
text-decoration: none;
font-weight: bold;
word-wrap: break-word;
}
a:visited{
color: #448;
text-decoration: none;
font-weight: bold;
}
a:hover{
color: #f60;
text-decoration: underline;
font-weight: bold;
}
a:active{
color: #f93;
text-decoration: underline;
font-weight: bold;
}
pre {
font-size: 9pt;
margin: 0px 20px;
}
tt {
font-size: 9pt;
font-weight: bold;
color: darkgreen;
}
.tablefooter {
border: 1px solid #88f;
}
.tablefooter tr, .tablefooter td {
background: #bbf;
font-size: 8pt;
font-weight: bold;
line-height: 150%;
word-wrap: nowrap;
padding: 8px 1px;
}
.tidylist {
text-align: justify;
padding-right: 30px;
}
div.graphspanel {
padding: 20px 10px;
margin: -20px;
background: #ddf url('images/lightbluetile.png');
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
border: 5px solid #bbf;
-moz-box-shadow: inset 0px 0px 1px 0px #002;
text-align: center !important;
}
div.graphspanel img {
border: 1px solid #99f;
padding: 2px;
margin: 6px;
background: #ddf;
-moz-box-shadow: inset 0px 0px 1px 1px #99f;
}
div.graphspanel img:hover {
border: 1px solid #003;
padding: 2px;
margin: 6px;
text-align: center !important;
background: #001;
-moz-box-shadow: inset 0px 0px 2px 1px #f60;
}
div.graphspanel hr {
margin: 20px 0;
}
div.graphspanel form {
text-align: left;
margin: 0 20px;
}
div.graphspanel h3 {
text-align: left;
}

View File

@@ -0,0 +1,152 @@
/* Welcome to the wonderful world of kludgey IE fixes */
.wideload {
overflow: auto;
width: 100%;
}
.formaction {
text-align: left !important;
margin: -10px 0 10px 0;
}
div.configure {
text-align: center;
}
div.configure p, div.configure table {
text-align: justify;
}
div.main ul {
margin-right: 20px;
}
div.configure textarea {
width: 450px !important;
}
div.configure input {
margin-left: 5px;
}
div.configure table {
width: 550px !important;
text-align: center;
}
h1 {
padding: 15px 10px 16px -10px !important;
margin: 0 0px 0 175px !important;
background-color: #bbf !important;
color: #001;
}
h2 {
padding-top: 0;
text-align: left !important;
}
h3 {
margin-top: 10px;
text-align: left !important
}
div.confignav {
padding: 15px 0 15px 0;
border-left: 0px;
margin-left: -15px;
border-top: 5px solid #bbf;
margin-bottom: 10px !important;
}
div.messages {
border-left: 0;
border-right: 0;
margin: -10px -15px 0px -15px;
}
div.main, div.news {
margin: -5px 0px 10px 185px;
border: 5px solid #bbf;
}
div.main hr, div.news hr {
margin: 0;
}
div.main {
border-top: 5px solid #bbf;
}
div.news {
border-left: 5px solid #bbf;
margin: -5px 0px 0 185px;
padding-bottom: 8px;
}
div.news hr {
color: #bbf;
background: #bbf;
height: 3px;
border: 0px;
margin: 0 -10px 0 -13px !important;
}
div.routersummary {
color: #001;
padding-left: 0px;
border-left: 5px solid #bbf;
}
div.routersummary submit {
padding: 0;
margin-bottom: 5px;
}
div.news li {
padding-top: 0px 0px !important;
margin-bottom: -23px !important;
}
div.logo {
}
div.warning {
padding: 0px 20px 20px 80px;
margin-top: -20px;
margin-left: -10px !important;
}
.langbox {
margin: 22px -20px 0px 5px;
}
td {
text-align: left;
}
th {
text-align: left;
padding-left: 3px;
padding-right: 1px;
}
div.configure hr{
margin: 10px 0 15px 0;
}
input {
padding: 0;
}
div.graphspanel img {
border: 1px solid #99f;
margin: 6px 0 !important;
background: #ddf;
-moz-box-shadow: inset 0px 0px 1px 1px #99f;
}
div.graphspanel hr {
margin: 20px 0;
}

View File

@@ -65,7 +65,7 @@ div.toolbar a:visited {
}
div.toolbar a:hover, button:hover{
border: 1px solid #eeeeff;
border: 1px solid #f60;
background: #003;
color: #f60;
}
@@ -89,7 +89,7 @@ div.routersummary {
width: 175px;
padding: 10px;
text-align: center;
border: 1px solid #9999ff;
border: 1px solid #99f;
background: #003;
background: url(images/darkbluebg.png);
color: #eef;
@@ -102,6 +102,28 @@ div.routersummary {
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
}
div.routersummary input[type=text] {
text-align: right !important;
-moz-box-shadow: inset 1px 1px 1px 0px #000;
}
div.routersummary hr {
color: #99f;
background: #99f;
height: 1px;
border-bottom: 1px outset #bbf;
margin: 5px -10px 4px -10px;
}
div.routersummary hr {
color: #bbf;
background: #bbf;
height: 2px;
border-bottom: 1px outset #bbf;
margin: 8px -10px 7px -10px;
-moz-box-shadow: inset 0px -4px 2px 1px #001;
}
div.warning {
margin: 5px 20px 10px 240px;
padding: 0px 25px 20px 75px;
@@ -254,14 +276,25 @@ table {
background: #003;
}
table hr {
padding: 0px 0;
color: #99f;
background: #99f;
border: 0px solid #99f;
margin: 0px 0px;
height: 1px;
display: none;
}
th {
padding: 6px 3px;
padding: 6px 2px;
color: #eef;
text-align: center;
font-size: 8pt;
font-size: 9pt;
background: #004 url('images/tabletitledark.png') repeat-x;
border-top: 1px solid #99f;
border-bottom: 1px solid #99f;
border-bottom: 1px solid #99f !important;
line-height: 110%;
}
tr {
@@ -285,7 +318,7 @@ tr:last-child {
}
*/
td {
padding: 6px 4px;
padding: 6px 3px;
color: #eef;
vertical-align: middle;
border-top: 1px inset #006;
@@ -391,7 +424,7 @@ h2 {
color: #fff;
text-shadow: 0px 0px 1px rgba(255, 255, 255, 0.5);
letter-spacing: 0.05em;
background: #003 url('images/darkbluebg.png');
background: #003 url('images/titletile.png');
padding: 5px 10px 8px 10px;
wordwrap: none;
border: 1px solid #99f;
@@ -434,8 +467,9 @@ h4 {
font-size: 11pt;
}
button {
border: 1px outset #ddddc0;
button, button:visited {
font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
border: 1px outset #77f;
padding: 1px 3px;
background: #bbf;
text-decoration: none;
@@ -448,12 +482,23 @@ button {
text-align: center;
vertical-align: middle;
min-width: 76px;
-moz-box-shadow: inset 0px 1px 1px 0px #55f;
background: #003;
color: #99f;
}
button:hover {
border: 1px solid #f60;
-moz-box-shadow: inset 0px 1px 1px 0px #eef;
background: #001;
color: #f60;
}
button:active {
border: 1px inset #f60;
background: #f60;
color: #fff;
-moz-box-shadow: inset 0px 0px 0px 0px #f60;
}
.underline {
@@ -486,37 +531,70 @@ sidebarlogo {
}
input {
background: #bbf;
color: #002;
border: 1px outset #55f;
-moz-box-shadow: inset 0px 1px 1px 0px #55f;
background: #003;
color: #99f;
margin: 5px;
font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
border: 1px solid #99f;
font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
padding: 1px 2px;
text-decoration: none;
min-width: 110px;
opacity: 0.8;
border-radius: 4px;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
}
input:hover {
background: #eef;
color: #001;
background: #001;
color: #f60;
border: 1px solid #f60;
-moz-box-shadow: inset 0px 1px 1px 0px #eef;
}
input:active {
background: #002;
color: #f30;
border: 1px solid #f30;
}
input:active {
border: 1px inset #f60;
background: #f60;
color: #fff;
border: 1px solid #f60;
}
input[type=text] {
background: #002;
color: #eef;
margin: 5px 10px;
padding: 4px 2px;
font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
border: 1px solid #bbf;
text-decoration: none;
border-radius: 4px;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
-moz-box-shadow: inset 1px 1px 1px 0px #000;
}
input[type=text]:active, input[type=text]:hover {
background: #001;
}
fieldset {
overflow: hidden;
position: relative;
}
select {
background: #002;
color: #eef;
margin: 5px;
border: 1px solid #99f;
border-radius: 0;
-moz-border-radius: 0;
-khtml-border-radius: 0;
margin: 5px 10px;
border: 1px solid #bbf;
border-radius: 4px;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
min-width: 110px;
font: 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
padding: 2px;
@@ -526,13 +604,13 @@ textarea {
background: #001;
color: #eef;
padding: 5px;
margin: 15px 15px 5px 0px;
margin: 10px;
border-radius: 4px;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
min-height: 100px;
min-width: 100%;
min-width: 97%;
text-align: left;
border: 1px solid #99f;
}
@@ -596,4 +674,49 @@ form {}
.mediumtags {
font-size: 9pt;
}
.optbox {
min-width: 16px !important;
max-width: 16px !important;
width: 16px !important;
min-height: 16px;
max-height: 16px;
height: 16px;
opacity: 1.0;
border: 0;
margin: 5px 5px 5px 10px;
padding: 2px;
overflow: hidden;
position: relative;
}
.optbox:hover {
min-width: 16px !important;
max-width: 16px !important;
width: 16px !important;
min-height: 16px;
max-height: 16px;
height: 16px;
opacity: 1.0;
border: 0;
margin: 5px 5px 5px 10px;
padding: 2px;
}
.cells {
border: 1px inset #005;
border-left: 1px outset #002;
}
.tablefooter tr, .tablefooter td {
background: #004 url('images/tabletitledark.png') repeat-x !important;
border-top: 1px solid #99f;
border-bottom: 1px solid #99f !important;
font-size: 7pt;
line-height: 110%;
}
.formaction {
text-align: right;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -19,7 +19,7 @@ img {
pre {
width: 98%;
overflow-x: scroll;
overflow: auto;
text-align: left;
font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
color: #333;
@@ -105,6 +105,19 @@ div.routersummary {
-moz-box-shadow: inset 0px 0px 1px 0px #002;
}
div.routersummary input[type=text] {
text-align: right !important;
}
div.routersummary hr {
color: #eef;
background: #eef;
height: 2px;
border-bottom: 1px solid #eef;
margin: 8px -10px 7px -10px;
-moz-box-shadow: inset 0px 1px 1px 1px #001;
}
div.warning {
margin: 5px 20px 10px 240px;
padding: 0px 25px 20px 75px;
@@ -130,7 +143,6 @@ div.main {
text-align: left;
color: #001;
width: auto;
/* overflow-x: scroll; */
}
div.main hr, hr {
@@ -227,6 +239,7 @@ div.configure {
border-radius: 4px;
border: 1px solid #000022;
-moz-box-shadow: inset 0px 0px 1px 0px #002;
min-width: 400px;
}
div.graphspanel {
@@ -238,9 +251,9 @@ div.graphspanel {
border-radius: 4px;
border: 1px solid #000022;
-moz-box-shadow: inset 0px 0px 1px 0px #002;
text-align: center !important;
}
div.graphspanel img {
border: 1px solid #003;
padding: 2px;
@@ -248,7 +261,7 @@ div.graphspanel img {
text-align: center !important;
background: #001;
-moz-box-shadow: inset 0px 0px 1px 1px #99f;
opacity: 0.9;
opacity: 0.8;
}
div.graphspanel img:hover {
@@ -261,6 +274,10 @@ div.graphspanel img:hover {
opacity: 1;
}
div.graphspanel form {
text-align: left;
}
div.messages {
padding: 10px;
margin: 10px 0 20px 0;
@@ -299,6 +316,17 @@ table {
cell-padding: 1px;
font-size: 7pt;
background: #b4c8ff url('images/tabletitlelight.png') repeat-x;
font: 7pt/130% "Lucida Sans Unicode", Verdana, Bitstream Vera Sans", Tahoma, Helvetica, sans-serif;
}
table hr {
padding: 0px 0;
color: #99f;
background: #99f;
border: 0px solid #99f;
margin: 0px 0px;
height: 1px;
display: none;
}
th {
@@ -307,8 +335,9 @@ th {
background: #b4c8ff url('images/tabletitlelight.png') repeat-x;
text-align: center;
font-size: 9pt;
border-bottom: 1px solid #001;
border-top: 1px solid #001;
line-height: 110%;
border-bottom: 1px solid #001 !important;
border-top: 1px solid #001 !important;
}
tr {
@@ -331,7 +360,7 @@ tr:last-child {
}
*/
td {
padding: 5px;
padding: 5px 3px;
color: #000;
vertical-align: middle;
border-top: 1px inset #001;
@@ -432,7 +461,7 @@ h2 {
font-size: 12pt;
color: #001;
letter-spacing: 0.05em;
background: #ddf url('images/lightbluetile.png');
background: #ddf url('images/titletile.png');
text-shadow: 0px 0px 1px rgba(0, 0, 64, 0.5);
padding: 7px 10px;
wordwrap: none;
@@ -473,10 +502,11 @@ h4 {
font-size: 11pt;
}
button {
border: 1px outset #ddddc0;
button, button:visited {
font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
border: 1px outset #999;
padding: 1px 3px;
background: #bbf !important;
background: #ddf !important;
text-decoration: none;
border-radius: 4px;
-moz-border-radius: 4px;
@@ -486,18 +516,22 @@ button {
margin: 0 1px;
text-align: center;
min-width: 80px;
-moz-box-shadow: inset 0px 2px 8px 0px #fff;
color: #006;
}
button:hover{
border: 1px solid #f60;
background: #f60 !important;
color: #fff;
-moz-box-shadow: inset 0px 0px 0px 1px #fff;
}
button:active{
border: 1px solid #f60;
background: #001 !important;
color: #f60;
-moz-box-shadow: inset 0px 0px 0px 1px #f60;
}
.underline {
@@ -526,14 +560,33 @@ input {
border: 1px solid #001;
text-decoration: none;
min-width: 110px;
opacity: 0.8;
}
input, input:visited {
border: 1px outset #999;
background: #ddf;
color: #001;
margin: 5px;
font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
padding: 1px 2px;
text-decoration: none;
min-width: 110px;
border-radius: 4px;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
-moz-box-shadow: inset 0px 2px 8px 0px #fff;
color: #006;
opacity: 0.9;
}
input:hover {
background: #f60;
color: #fff;
border: 1px solid #f60;
opacity: 0.9;
opacity: 1.0;
-moz-box-shadow: inset 0px 0px 0px 1px #fff;
}
input:active {
@@ -541,6 +594,17 @@ input:active {
color: #f60;
border: 1px solid #f60;
opacity: 1.0;
-moz-box-shadow: inset 0px 0px 0px 1px #f60;
}
input[type=text] {
background: #eef;
color: #001;
margin: 5px 10px 5px 10px;
padding: 4px 2px;
font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
border: 1px solid #001;
text-decoration: none;
}
submit {
@@ -566,11 +630,15 @@ select {
border: 1px solid #001;
min-width: 110px;
font: 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
border-radius: 4px;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
text-align: left !important;
}
textarea {
padding: 5px;
margin: 15px 15px 5px 0px;
margin: 5px 15px 5px 10px;
background: #eef;
color: #003;
border-radius: 4px;
@@ -578,7 +646,7 @@ textarea {
-khtml-border-radius: 4px;
font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
min-height: 100px;
min-width: 100%;
min-width: 97%;
border: 1px solid #001;
}
@@ -622,7 +690,7 @@ form {}
-khtml-border-radius: 4px;
text-align: justify;
-moz-box-shadow: inset 0px 0px 1px 0px #002;
overflow-x: scroll;
overflow: auto;
}
div.joblog:li {
@@ -641,4 +709,53 @@ form {}
font-size: 8pt;
font-style: italic;
font-weight: bold;
}
.optbox {
min-width: 16px !important;
max-width: 16px !important;
width: 16px !important;
min-height: 16px;
max-height: 16px;
height: 16px;
opacity: 1.0;
border: 0;
margin: 5px 5px 5px 10px;
padding: 2px;
}
.optbox:hover {
min-width: 16px !important;
max-width: 16px !important;
width: 16px !important;
min-height: 16px;
max-height: 16px;
height: 16px;
opacity: 1.0;
border: 0;
margin: 5px 5px 5px 10px;
padding: 2px;
}
.cells {
border-left: 1px outset #bbf;
border-top: 1px inset #99f !important;
border-bottom: 1px inset #99f !important;
}
.tablefooter {
background: #b4c8ff url('images/tabletitlelight.png') repeat-x;
}
.tablefooter tr, .tablefooter td {
background: #b4c8ff url('images/tabletitlelight.png') repeat-x;
border-top: 1px solid #001;
border-bottom: 1px solid #001 !important;
padding: 8px 2px !important;
font-size: 7pt;
line-height: 110%;
}
.formaction {
text-align: right;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -56,18 +56,19 @@ body {
font-size: 9pt;
font-weight: bold;
text-align: left;
margin: 0 0 15px 0;
padding: 0px;
margin: 0 0px 10px 0px;
padding: 0;
border-spacing: 0px;
-moz-border-radius: 4px 0 0 0;
-khtml-border-radius: 4px;
border-radius: 4px;
border: 2px solid #930;
text-align: center;
overflow-x: scroll;
background: #ddf url('../console/images/orangetile.png');
text-align: left;
overflow: auto;
background: #f40 url('../console/images/orangetile.png');
color: #531;
height: 64px;
width: auto;
}
pre {
@@ -85,6 +86,7 @@ table {
padding: 0px;
border-width: 0px;
border-spacing: 0px;
border-collapse: collapse;
}
th {
@@ -92,8 +94,9 @@ th {
font-size: 8pt;
border-top: 1px outset #001;
border-bottom: 1px inset #001;
background: #f91 url('/themes/console/images/tabletitleorange.png') repeat-x;
text-align: left;
background: #f60 url('/themes/console/images/tabletitleorange.png') repeat-x;
text-align: right;
whitespace: nowrap;
}
.SnarkTorrents {
@@ -104,7 +107,7 @@ th {
td {
padding: 5px;
text-align: left;
text-align: right;
}
.snarkTorrentEven {
background-color: #fb1;
@@ -134,8 +137,8 @@ td {
.page {
background-color: #fff;
color:#310;
min-width: 700px !important;
max-width: 800px !important;
min-width: 800px !important;
/* max-width: 800px !important; */
margin: 20px;
padding: 10px 20px 5px 20px;
-moz-border-radius: 4px;
@@ -173,7 +176,7 @@ hr {
}
a:link{
color: #830;
color: #930;
text-decoration: none;
font-weight: bold;
word-wrap: break-word;
@@ -186,7 +189,7 @@ a:visited{
}
a:hover{
color: #f60;
color: #900;
font-weight: bold;
}

View File

@@ -35,7 +35,7 @@
<p></p>
There are many more eepsites - just follow the links from the ones you see,
bookmark your favorites, and visit them often!
</ul>
</ul></ul>
<br />
<br />
<ul>

View File

@@ -767,10 +767,10 @@ public class Blocklist {
out.write("</table>");
}
if (_blocklistSize > 0) {
out.write("<table><tr><td align=center colspan=2><b>IPs from Blocklist File</b></td></tr><tr><td align=center><b>From</b></td><td align=center><b>To</b></td></tr>");
out.write("<table><tr><th align=center colspan=2><b>IPs from Blocklist File</b></th></tr><tr><td align=center width=50%><b>From:</b></td><td align=center width=50%><b>To:</b></td></tr>");
for (int i = 0; i < _blocklistSize; i++) {
int from = getFrom(_blocklist[i]);
out.write("<tr><td align=right>"); out.write(toStr(from)); out.write("</td><td align=right>");
out.write("<tr><td align=center width=50%>"); out.write(toStr(from)); out.write("</td><td align=center width=50%>");
int to = getTo(_blocklist[i]);
if (to != from) {
out.write(toStr(to)); out.write("</td></tr>\n");
@@ -779,7 +779,7 @@ public class Blocklist {
}
out.write("</table>");
} else {
out.write("<br>No blocklist file entries");
out.write("<br><i>No blocklist file entries.</i>");
}
out.flush();
}

View File

@@ -607,7 +607,7 @@ public class JobQueue {
out.flush();
StringBuilder buf = new StringBuilder(32*1024);
buf.append("<b><div class=\"joblog\"><h3>I2P JobQueue</h3># runners: ").append(numRunners).append(" [states=");
buf.append("<b><div class=\"joblog\"><h3>I2P JobQueue</h3><div class=\"wideload\"># runners: ").append(numRunners).append(" [states=");
if (states != null)
for (int i = 0; i < states.length; i++)
buf.append(states[i]).append(" ");
@@ -667,7 +667,7 @@ public class JobQueue {
/** render the HTML for the job stats */
private void getJobStats(StringBuilder buf) {
buf.append("<table border=\"1\">\n");
buf.append("<table>\n");
buf.append("<tr><th>Job</th><th>Runs</th>");
buf.append("<th>Time</th><th><i>Avg</i></th><th><i>Max</i></th><th><i>Min</i></th>");
buf.append("<th>Pending</th><th><i>Avg</i></th><th><i>Max</i></th><th><i>Min</i></th></tr>\n");
@@ -734,6 +734,6 @@ public class JobQueue {
buf.append("<td><i>").append(minPendingTime).append("</i></td>");
buf.append("</tr>\n");
buf.append("</table>\n");
buf.append("</table></div>\n");
}
}

View File

@@ -67,7 +67,7 @@ public class PersistentKeyRing extends KeyRing {
@Override
public void renderStatusHTML(Writer out) throws IOException {
StringBuilder buf = new StringBuilder(1024);
buf.append("\n<table border=\"1\"><tr><th align=\"left\">Destination Hash<th align=\"left\">Name or Dest.<th align=\"left\">Session Key</tr>");
buf.append("\n<table><tr><th align=\"left\">Destination Hash<th align=\"left\">Name or Dest.<th align=\"left\">Session Key</tr>");
for (Entry<Hash, SessionKey> e : entrySet()) {
buf.append("\n<tr><td>");
Hash h = e.getKey();

View File

@@ -759,7 +759,7 @@ public class Router {
buf.setLength(0);
buf.append("\n<hr /><a name=\"logs\"> </a>\n");
List msgs = _context.logManager().getBuffer().getMostRecentMessages();
buf.append("\n<h2>Most recent console messages:</h2><table border=\"1\">\n");
buf.append("\n<h2>Most recent console messages:</h2><table>\n");
for (Iterator iter = msgs.iterator(); iter.hasNext(); ) {
String msg = (String)iter.next();
buf.append("<tr><td align=\"left\"><pre>");

View File

@@ -18,7 +18,7 @@ public class RouterVersion {
/** deprecated */
public final static String ID = "Monotone";
public final static String VERSION = CoreVersion.VERSION;
public final static long BUILD = 0;
public final static long BUILD = 07;
/** for example "-test" */
public final static String EXTRA = "";
public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA;

View File

@@ -218,7 +218,11 @@ class ProfileOrganizerRenderer {
}
buf.append("</table>");
buf.append("<p><i>Definitions:<ul>");
buf.append("<h3>Thresholds:</h3>");
buf.append("<b>Speed:</b> ").append(num(_organizer.getSpeedThreshold())).append(" (").append(fast).append(" fast peers)<br />");
buf.append("<b>Capacity:</b> ").append(num(_organizer.getCapacityThreshold())).append(" (").append(reliable).append(" high capacity peers)<br />");
buf.append("<b>Integration:</b> ").append(num(_organizer.getIntegrationThreshold())).append(" (").append(integrated).append(" well integrated peers)");
buf.append("<h3>Definitions:</h3><ul>");
buf.append("<li><b>groups</b>: as determined by the profile organizer</li>");
buf.append("<li><b>caps</b>: capabilities in the netDb, not used to determine profiles</li>");
buf.append("<li><b>speed</b>: peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel</li>");
@@ -226,10 +230,6 @@ class ProfileOrganizerRenderer {
buf.append("<li><b>integration</b>: how many new peers have they told us about lately?</li>");
buf.append("<li><b>failing?</b>: is the peer currently swamped (and if possible we should avoid nagging them)?</li>");
buf.append("</ul></i>");
buf.append("<p><b>Thresholds:</b><br />");
buf.append("<b>Speed:</b> ").append(num(_organizer.getSpeedThreshold())).append(" (").append(fast).append(" fast peers)<br />");
buf.append("<b>Capacity:</b> ").append(num(_organizer.getCapacityThreshold())).append(" (").append(reliable).append(" high capacity peers)<br />");
buf.append("<b>Integration:</b> ").append(num(_organizer.getIntegrationThreshold())).append(" (").append(integrated).append(" well integrated peers)<br />");
out.write(buf.toString());
out.flush();
}

View File

@@ -619,8 +619,8 @@ public class FIFOBandwidthLimiter {
public void renderStatusHTML(Writer out) throws IOException {
long now = now();
StringBuilder buf = new StringBuilder(4096);
buf.append("<p><b id=\"bwlim\">Limiter Status:</b><br />").append(getStatus().toString()).append("</p>\n");
buf.append("<p><b>Pending bandwidth requests:</b><ul>");
buf.append("<h3><b id=\"bwlim\">Limiter Status:</b></h3>").append(getStatus().toString()).append("\n");
buf.append("<h3>Pending bandwidth requests:</h3><ul>");
buf.append("<li>Inbound requests: <ol>");
synchronized (_pendingInboundRequests) {
for (int i = 0; i < _pendingInboundRequests.size(); i++) {
@@ -643,7 +643,7 @@ public class FIFOBandwidthLimiter {
buf.append("ms ago</li>\n");
}
}
buf.append("</ol></li></ul></p>\n");
buf.append("</ol></li></ul></p><hr>\n");
out.write(buf.toString());
out.flush();
}

View File

@@ -492,7 +492,7 @@ public class TransportManager implements TransportEventListener {
t.renderStatusHTML(out, urlBase, sortFlags);
}
StringBuilder buf = new StringBuilder(4*1024);
buf.append("<p><b>Router Transport Addresses:</b><br /><pre>\n");
buf.append("<h3>Router Transport Addresses:</h3><pre>\n");
for (int i = 0; i < _transports.size(); i++) {
Transport t = (Transport)_transports.get(i);
if (t.getCurrentAddress() != null)

View File

@@ -639,19 +639,19 @@ public class NTCPTransport extends TransportImpl {
long totalRecv = 0;
StringBuilder buf = new StringBuilder(512);
buf.append("<p><b id=\"ntcpcon\">NTCP connections: ").append(peers.size());
buf.append(" limit: ").append(getMaxConnections());
buf.append(" timeout: ").append(DataHelper.formatDuration(_pumper.getIdleTimeout()));
buf.append("</b><br />\n");
buf.append("<table>\n");
buf.append("<p><b id=\"ntcpcon\"><h3>NTCP connections: ").append(peers.size());
buf.append(". Limit: ").append(getMaxConnections());
buf.append(". Timeout: ").append(DataHelper.formatDuration(_pumper.getIdleTimeout()));
buf.append(".</b></h3>\n");
buf.append("<div class=\"wideload\"><table>\n");
buf.append("<tr><th><a href=\"#def.peer\">Peer</a></th>");
buf.append("<th>Dir</th>");
buf.append("<th align=\"right\"><a href=\"#def.idle\">Idle</a></th>");
buf.append("<th align=\"right\"><a href=\"#def.rate\">In/Out</a></th>");
buf.append("<th align=\"right\"><a href=\"#def.up\">Up</a></th>");
buf.append("<th align=\"right\"><a href=\"#def.skew\">Skew</a></th>");
buf.append("<th align=\"right\"><a href=\"#def.send\">Send</a></th>");
buf.append("<th align=\"right\"><a href=\"#def.recv\">Recv</a></th>");
buf.append("<th align=\"right\"><a href=\"#def.send\">TX</a></th>");
buf.append("<th align=\"right\"><a href=\"#def.recv\">RX</a></th>");
buf.append("<th>Out queue</th>");
buf.append("<th>Backlogged?</th>");
buf.append("<th>Reading?</th>");
@@ -660,20 +660,20 @@ public class NTCPTransport extends TransportImpl {
buf.setLength(0);
for (Iterator iter = peers.iterator(); iter.hasNext(); ) {
NTCPConnection con = (NTCPConnection)iter.next();
buf.append("<tr><td align=\"right\" nowrap>");
buf.append("<tr> <td class=\"cells\" align=\"left\" nowrap>");
buf.append(_context.commSystem().renderPeerHTML(con.getRemotePeer().calculateHash()));
//byte[] ip = getIP(con.getRemotePeer().calculateHash());
//if (ip != null)
// buf.append(' ').append(_context.blocklist().toStr(ip));
buf.append("</td><td align=\"center\"><code>");
buf.append("</td> <td class=\"cells\" align=\"center\">");
if (con.isInbound())
buf.append("in");
buf.append("<img src=\"/themes/console/images/inbound.png\" alt=\"Inbound\" title=\"Inbound\"/>");
else
buf.append("out");
buf.append("</code></td><td align=\"right\"><code>");
buf.append("<img src=\"/themes/console/images/outbound.png\" alt=\"Outbound\" title=\"Outbound\"/>");
buf.append("</td> <td class=\"cells\" align=\"right\">");
buf.append(con.getTimeSinceReceive()/1000);
buf.append("s/").append(con.getTimeSinceSend()/1000);
buf.append("s</code></td><td align=\"right\"><code>");
buf.append("s</td> <td class=\"cells\" align=\"center\">");
if (con.getTimeSinceReceive() < 10*1000) {
buf.append(formatRate(con.getRecvRate()/1024));
bpsRecv += con.getRecvRate();
@@ -687,47 +687,47 @@ public class NTCPTransport extends TransportImpl {
} else {
buf.append(formatRate(0));
}
buf.append("KBps");
buf.append("</code></td><td align=\"right\"><code>").append(DataHelper.formatDuration(con.getUptime()));
buf.append("K/s");
buf.append("</td> <td class=\"cells\" align=\"center\">").append(DataHelper.formatDuration(con.getUptime()));
totalUptime += con.getUptime();
offsetTotal = offsetTotal + con.getClockSkew();
buf.append("</code></td><td align=\"right\"><code>").append(con.getClockSkew());
buf.append("s</code></td><td align=\"right\"><code>").append(con.getMessagesSent());
buf.append("</td> <td class=\"cells\" align=\"center\">").append(con.getClockSkew());
buf.append("s</td> <td class=\"cells\" align=\"center\">").append(con.getMessagesSent());
totalSend += con.getMessagesSent();
buf.append("</code></td><td align=\"right\"><code>").append(con.getMessagesReceived());
buf.append("</td> <td class=\"cells\" align=\"center\">").append(con.getMessagesReceived());
totalRecv += con.getMessagesReceived();
long outQueue = con.getOutboundQueueSize();
if (outQueue <= 0) {
buf.append("</code></td><td align=\"right\"><code>No messages");
buf.append("</td> <td class=\"cells\" align=\"center\">No messages");
} else {
buf.append("</code></td><td align=\"right\"><code>").append(outQueue).append(" message");
buf.append("</td> <td class=\"cells\" align=\"center\">").append(outQueue).append(" message");
if (outQueue > 1)
buf.append("s");
}
buf.append("</code></td><td align=\"center\"><code>").append(con.getConsecutiveBacklog() > 0 ? "true" : "false");
buf.append("</td> <td class=\"cells\" align=\"center\">").append(con.getConsecutiveBacklog() > 0 ? "true" : "false");
long readTime = con.getReadTime();
if (readTime <= 0) {
buf.append("</code></td><td align=\"center\"><code>No");
buf.append("</td> <td class=\"cells\" align=\"center\">No");
} else {
buf.append("</code></td><td><code>For ").append(DataHelper.formatDuration(readTime));
buf.append("</td> <td class=\"cells\">For ").append(DataHelper.formatDuration(readTime));
}
buf.append("</code></td></tr>\n");
buf.append("</td></tr>\n");
out.write(buf.toString());
buf.setLength(0);
}
if (peers.size() > 0) {
buf.append("<tr><td colspan=\"11\"><hr /></td></tr>\n");
buf.append("<tr><td>").append(peers.size()).append(" peers</td><td>&nbsp;</td><td>&nbsp;");
buf.append("</td><td align=\"right\">").append(formatRate(bpsRecv/1024)).append("/").append(formatRate(bpsSend/1024)).append("KBps");
buf.append("</td><td align=\"right\">").append(DataHelper.formatDuration(totalUptime/peers.size()));
buf.append("</td><td align=\"right\">").append(peers.size() > 0 ? DataHelper.formatDuration(offsetTotal*1000/peers.size()) : "0ms");
buf.append("</td><td align=\"right\">").append(totalSend).append("</td><td align=\"right\">").append(totalRecv);
buf.append("</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;");
// buf.append("<tr> <td colspan=\"11\"><hr /></td></tr>\n");
buf.append("<tr class=\"tablefooter\"> <td align=\"center\"><b>").append(peers.size()).append(" peers</b></td> <td>&nbsp;</td> <td>&nbsp;");
buf.append("</td> <td align=\"center\"><b>").append(formatRate(bpsRecv/1024)).append("/").append(formatRate(bpsSend/1024)).append("K/s</b>");
buf.append("</td> <td align=\"center\"><b>").append(DataHelper.formatDuration(totalUptime/peers.size()));
buf.append("</b></td> <td align=\"center\"><b>").append(peers.size() > 0 ? DataHelper.formatDuration(offsetTotal*1000/peers.size()) : "0ms");
buf.append("</b></td> <td align=\"center\"><b>").append(totalSend).append("</b></td> <td align=\"center\"><b>").append(totalRecv);
buf.append("</b></td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;");
buf.append("</td></tr>\n");
}
buf.append("</table></p>\n");
buf.append("</table></div></p>\n");
out.write(buf.toString());
buf.setLength(0);
}

View File

@@ -1763,51 +1763,51 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
int numPeers = 0;
StringBuilder buf = new StringBuilder(512);
buf.append("<p><b id=\"udpcon\">UDP connections: ").append(peers.size());
buf.append(" limit: ").append(getMaxConnections());
buf.append(" timeout: ").append(DataHelper.formatDuration(_expireTimeout));
buf.append("</b><br />\n");
buf.append("<table>\n");
buf.append("<tr><th><a href=\"#def.peer\">Peer</a>");
buf.append("<p><b id=\"udpcon\"><h3>UDP connections: ").append(peers.size());
buf.append(". Limit: ").append(getMaxConnections());
buf.append(". Timeout: ").append(DataHelper.formatDuration(_expireTimeout));
buf.append(".</b></h3>\n");
buf.append("<div class=\"wideload\"><table>\n");
buf.append("<tr><th class=\"smallhead\" nowrap><a href=\"#def.peer\">Peer</a>");
if (sortFlags != FLAG_ALPHA)
buf.append(" <a href=\"").append(urlBase).append("?sort=0\">V</a> ");
buf.append("</th><th><a href=\"#def.dir\">Dir/Intro</a></th><th><a href=\"#def.idle\">Idle</a>");
buf.append("</th><th class=\"smallhead\" nowrap><a href=\"#def.dir\" title=\"Direction/Introduction\">Dir</a></th><th class=\"smallhead\" nowrap><a href=\"#def.idle\">Idle</a><br>");
appendSortLinks(buf, urlBase, sortFlags, "Sort by idle inbound", FLAG_IDLE_IN);
buf.append("/");
appendSortLinks(buf, urlBase, sortFlags, "Sort by idle outbound", FLAG_IDLE_OUT);
buf.append("</th>");
buf.append("<th><a href=\"#def.rate\">In/Out</a>");
buf.append("<th class=\"smallhead\" nowrap><a href=\"#def.rate\">In/Out</a><br>");
appendSortLinks(buf, urlBase, sortFlags, "Sort by inbound rate", FLAG_RATE_IN);
buf.append("/");
appendSortLinks(buf, urlBase, sortFlags, "Sort by outbound rate", FLAG_RATE_OUT);
buf.append("</th>\n");
buf.append("<th><a href=\"#def.up\">Up</a>");
buf.append("<th class=\"smallhead\" nowrap><a href=\"#def.up\">Up</a><br>");
appendSortLinks(buf, urlBase, sortFlags, "Sort by connection uptime", FLAG_UPTIME);
buf.append("</th><th><a href=\"#def.skew\">skew</a>");
buf.append("</th><th class=\"smallhead\" nowrap><a href=\"#def.skew\">Skew</a><br>");
appendSortLinks(buf, urlBase, sortFlags, "Sort by clock skew", FLAG_SKEW);
buf.append("</th>\n");
buf.append("<th><a href=\"#def.cwnd\">Cwnd</a>");
buf.append("<th class=\"smallhead\" nowrap><a href=\"#def.cwnd\">Cwnd</a><br>");
appendSortLinks(buf, urlBase, sortFlags, "Sort by congestion window", FLAG_CWND);
buf.append("</th><th><a href=\"#def.ssthresh\">Ssthresh</a>");
buf.append("</th><th class=\"smallhead\" nowrap><a href=\"#def.ssthresh\">Sst</a><br>");
appendSortLinks(buf, urlBase, sortFlags, "Sort by slow start threshold", FLAG_SSTHRESH);
buf.append("</th>\n");
buf.append("<th><a href=\"#def.rtt\">Rtt</a>");
buf.append("<th class=\"smallhead\" nowrap><a href=\"#def.rtt\">Rtt</a><br>");
appendSortLinks(buf, urlBase, sortFlags, "Sort by round trip time", FLAG_RTT);
buf.append("</th><th><a href=\"#def.dev\">Dev</a>");
buf.append("</th><th class=\"smallhead\" nowrap><a href=\"#def.dev\">Dev</a><br>");
appendSortLinks(buf, urlBase, sortFlags, "Sort by round trip time deviation", FLAG_DEV);
buf.append("</th><th><a href=\"#def.rto\">Rto</a>");
buf.append("</th><th class=\"smallhead\" nowrap><a href=\"#def.rto\">Rto</a><br>");
appendSortLinks(buf, urlBase, sortFlags, "Sort by retransmission timeout", FLAG_RTO);
buf.append("</th>\n");
buf.append("<th><a href=\"#def.mtu\">Mtu</a>");
buf.append("<th class=\"smallhead\" nowrap><a href=\"#def.mtu\">Mtu</a><br>");
appendSortLinks(buf, urlBase, sortFlags, "Sort by maximum transmit unit", FLAG_MTU);
buf.append("</th><th><a href=\"#def.send\">Send</a>");
buf.append("</th><th class=\"smallhead\" nowrap><a href=\"#def.send\">TX</a><br>");
appendSortLinks(buf, urlBase, sortFlags, "Sort by packets sent", FLAG_SEND);
buf.append("</th><th><a href=\"#def.recv\">Recv</a>");
buf.append("</th><th class=\"smallhead\" nowrap><a href=\"#def.recv\">RX</a><br>");
appendSortLinks(buf, urlBase, sortFlags, "Sort by packets received", FLAG_RECV);
buf.append("</th>\n");
buf.append("<th><a href=\"#def.resent\">Resent</a>");
buf.append("<th class=\"smallhead\" nowrap><a href=\"#def.resent\">ReTX</a><br>");
appendSortLinks(buf, urlBase, sortFlags, "Sort by packets retransmitted", FLAG_RESEND);
buf.append("</th><th><a href=\"#def.dupRecv\">DupRecv</a>");
buf.append("</th><th class=\"smallhead\" nowrap><a href=\"#def.dupRecv\">DupRX</a><br>");
appendSortLinks(buf, urlBase, sortFlags, "Sort by packets received more than once", FLAG_DUP);
buf.append("</th>\n");
buf.append("</tr>\n");
@@ -1819,16 +1819,16 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
if (now-peer.getLastReceiveTime() > 60*60*1000)
continue; // don't include old peers
buf.append("<tr><td align=\"right\" nowrap>");
buf.append("<tr> <td class=\"cells\" align=\"left\" nowrap>");
buf.append(_context.commSystem().renderPeerHTML(peer.getRemotePeer()));
//byte ip[] = peer.getRemoteIP();
//if (ip != null)
// buf.append(' ').append(_context.blocklist().toStr(ip));
buf.append("</td><td><code>");
buf.append("</td> <td class=\"cells\" nowrap align=\"left\">");
if (peer.isInbound())
buf.append("in ");
buf.append("<img src=\"/themes/console/images/inbound.png\" alt=\"Inbound\" title=\"Inbound\"/> ");
else
buf.append("out ");
buf.append("<img src=\"/themes/console/images/outbound.png\" alt=\"Outbound\" title=\"Outbound\"/> ");
if (peer.getWeRelayToThemAs() > 0)
buf.append("^");
else
@@ -1839,107 +1839,107 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
boolean appended = false;
if (_activeThrottle.isChoked(peer.getRemotePeer())) {
if (!appended) buf.append("<br />");
buf.append(" [choked]");
buf.append(" <i>Choked</i>");
appended = true;
}
if (peer.getConsecutiveFailedSends() > 0) {
if (!appended) buf.append("<br />");
buf.append(" [").append(peer.getConsecutiveFailedSends()).append(" failures]");
buf.append(" <i>").append(peer.getConsecutiveFailedSends()).append(" fail(s)</i>");
appended = true;
}
if (_context.shitlist().isShitlisted(peer.getRemotePeer(), STYLE)) {
if (!appended) buf.append("<br />");
buf.append(" [shitlisted]");
buf.append(" <i>Shitlist</i>");
appended = true;
}
//byte[] ip = getIP(peer.getRemotePeer());
//if (ip != null)
// buf.append(' ').append(_context.blocklist().toStr(ip));
buf.append("</code></td>");
buf.append("</td>");
long idleIn = (now-peer.getLastReceiveTime())/1000;
long idleOut = (now-peer.getLastSendTime())/1000;
if (idleIn < 0) idleIn = 0;
if (idleOut < 0) idleOut = 0;
buf.append("<td align=\"right\" ><code>");
buf.append(" <td class=\"cells\" align=\"right\" >");
buf.append(idleIn);
buf.append("s/");
buf.append(idleOut);
buf.append("s</code></td>");
buf.append("s</td>");
int recvBps = (idleIn > 2 ? 0 : peer.getReceiveBps());
int sendBps = (idleOut > 2 ? 0 : peer.getSendBps());
buf.append("<td align=\"right\" ><code>");
buf.append(" <td class=\"cells\" align=\"right\" nowrap>");
buf.append(formatKBps(recvBps));
buf.append("/");
buf.append(formatKBps(sendBps));
buf.append("KBps ");
buf.append("K/s ");
//buf.append(formatKBps(peer.getReceiveACKBps()));
//buf.append("KBps/");
//buf.append("K/s/");
//buf.append(formatKBps(peer.getSendACKBps()));
//buf.append("KBps ");
buf.append("</code></td>");
//buf.append("K/s ");
buf.append("</td>");
long uptime = now - peer.getKeyEstablishedTime();
buf.append("<td align=\"right\" ><code>");
buf.append(" <td class=\"cells\" align=\"center\" >");
buf.append(DataHelper.formatDuration(uptime));
buf.append("</code></td>");
buf.append("</td>");
buf.append("<td align=\"right\" ><code>");
buf.append(" <td class=\"cells\" align=\"center\" >");
buf.append(peer.getClockSkew());
buf.append("s</code></td>");
buf.append("s</td>");
offsetTotal = offsetTotal + peer.getClockSkew();
long sendWindow = peer.getSendWindowBytes();
buf.append("<td align=\"right\" ><code>");
buf.append(" <td class=\"cells\" align=\"right\" >");
buf.append(sendWindow/1024);
buf.append("K");
buf.append("/").append(peer.getConcurrentSends());
buf.append("/").append(peer.getConcurrentSendWindow());
buf.append("/").append(peer.getConsecutiveSendRejections());
buf.append("</code></td>");
buf.append("</td>");
buf.append("<td align=\"right\" ><code>");
buf.append(" <td class=\"cells\" align=\"center\" >");
buf.append(peer.getSlowStartThreshold()/1024);
buf.append("K</code></td>");
buf.append("K</td>");
int rtt = peer.getRTT();
int rto = peer.getRTO();
buf.append("<td align=\"right\" ><code>");
buf.append(" <td class=\"cells\" align=\"right\" >");
buf.append(rtt);
buf.append("</code></td>");
buf.append("</td>");
buf.append("<td align=\"right\" ><code>");
buf.append(" <td class=\"cells\" align=\"right\" >");
buf.append(peer.getRTTDeviation());
buf.append("</code></td>");
buf.append("</td>");
buf.append("<td align=\"right\" ><code>");
buf.append(" <td class=\"cells\" align=\"right\" >");
buf.append(rto);
buf.append("</code></td>");
buf.append("</td>");
buf.append("<td align=\"right\" ><code>");
buf.append(" <td class=\"cells\" align=\"right\" >");
buf.append(peer.getMTU()).append("/").append(peer.getReceiveMTU());
//.append('/');
//buf.append(peer.getMTUIncreases()).append('/');
//buf.append(peer.getMTUDecreases());
buf.append("</code></td>");
buf.append("</td>");
long sent = peer.getPacketsTransmitted();
long recv = peer.getPacketsReceived();
buf.append("<td align=\"right\" ><code>");
buf.append(" <td class=\"cells\" align=\"center\" >");
buf.append(sent);
buf.append("</code></td>");
buf.append("</td>");
buf.append("<td align=\"right\" ><code>");
buf.append(" <td class=\"cells\" align=\"center\" >");
buf.append(recv);
buf.append("</code></td>");
buf.append("</td>");
//double sent = (double)peer.getPacketsPeriodTransmitted();
//double sendLostPct = 0;
@@ -1949,16 +1949,16 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
long resent = peer.getPacketsRetransmitted();
long dupRecv = peer.getPacketsReceivedDuplicate();
buf.append("<td align=\"right\" ><code>");
buf.append(" <td class=\"cells\" align=\"center\" >");
//buf.append(formatPct(sendLostPct));
buf.append(resent); // + "/" + peer.getPacketsPeriodRetransmitted() + "/" + sent);
//buf.append(peer.getPacketRetransmissionRate());
buf.append("</code></td>");
buf.append("</td>");
double recvDupPct = (double)peer.getPacketsReceivedDuplicate()/(double)peer.getPacketsReceived();
buf.append("<td align=\"right\" ><code>");
buf.append(" <td class=\"cells\" align=\"center\" >");
buf.append(dupRecv); //formatPct(recvDupPct));
buf.append("</code></td>");
buf.append("</td>");
buf.append("</tr>\n");
out.write(buf.toString());
@@ -1980,25 +1980,25 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
numPeers++;
}
buf.append("<tr><td colspan=\"16\"><hr /></td></tr>\n");
buf.append(" <tr><td colspan=\"3\"><b>Total</b></td>");
buf.append(" <td align=\"right\">");
// buf.append("<tr><td colspan=\"16\"><hr /></td></tr>\n");
buf.append(" <tr class=\"tablefooter\"> <td colspan=\"3\" align=\"right\"><b>Total</b></td>");
buf.append(" <td align=\"center\" nowrap><b>");
buf.append(formatKBps(bpsIn)).append("/").append(formatKBps(bpsOut));
buf.append("KBps</td>");
buf.append(" <td align=\"right\">").append(numPeers > 0 ? DataHelper.formatDuration(uptimeMsTotal/numPeers) : "0s");
buf.append("</td><td align=\"right\">").append(numPeers > 0 ? DataHelper.formatDuration(offsetTotal*1000/numPeers) : "0ms").append("</td>\n");
buf.append(" <td align=\"right\">");
buf.append("K/s</b></td>");
buf.append(" <td align=\"center\"><b>").append(numPeers > 0 ? DataHelper.formatDuration(uptimeMsTotal/numPeers) : "0s");
buf.append("</b></td> <td align=\"center\"><b>").append(numPeers > 0 ? DataHelper.formatDuration(offsetTotal*1000/numPeers) : "0ms").append("</b></td>\n");
buf.append(" <td align=\"center\"><b>");
buf.append(numPeers > 0 ? cwinTotal/(numPeers*1024) + "K" : "0K");
buf.append("</td><td>&nbsp;</td>\n");
buf.append(" <td align=\"right\">");
buf.append("</b></td> <td>&nbsp;</td>\n");
buf.append(" <td align=\"center\"><b>");
buf.append(numPeers > 0 ? rttTotal/numPeers : 0);
buf.append("</td><td align=\"right\">&nbsp;</td><td align=\"right\">");
buf.append("</b></td> <td>&nbsp;</td> <td align=\"center\"><b>");
buf.append(numPeers > 0 ? rtoTotal/numPeers : 0);
buf.append("</td>\n <td>&nbsp;</td><td align=\"right\">");
buf.append(sendTotal).append("</td><td align=\"right\">").append(recvTotal).append("</td>\n");
buf.append(" <td align=\"right\">").append(resentTotal);
buf.append("</td><td align=\"right\">").append(dupRecvTotal).append("</td>\n");
buf.append(" </tr></table></p><p>\n");
buf.append("</b></td>\n <td>&nbsp;</td> <td align=\"center\"><b>");
buf.append(sendTotal).append("</td></b> <td align=\"center\"><b>").append(recvTotal).append("</b></td>\n");
buf.append(" <td align=\"center\"><b>").append(resentTotal);
buf.append("</b></td> <td align=\"center\"><b>").append(dupRecvTotal).append("</b></td>\n");
buf.append(" </tr></table></div></p><p>\n");
long bytesTransmitted = _context.bandwidthLimiter().getTotalAllocatedOutboundBytes();
// NPE here early
double averagePacketSize = _context.statManager().getRate("udp.sendPacketSize").getLifetimeAverageValue();
@@ -2006,8 +2006,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
resentTotal = (long)_context.statManager().getRate("udp.packetsRetransmitted").getLifetimeEventCount();
double nondupSent = ((double)bytesTransmitted - ((double)resentTotal)*averagePacketSize);
double bwResent = (nondupSent <= 0 ? 0d : ((((double)resentTotal)*averagePacketSize) / nondupSent));
buf.append("Percentage of bytes retransmitted (lifetime): ").append(formatPct(bwResent));
buf.append(" <i>(includes retransmission required by packet loss)</i><br /></p>\n");
buf.append("<h3>Percentage of bytes retransmitted (lifetime): ").append(formatPct(bwResent));
buf.append("</h3><i>(Includes retransmission required by packet loss)</i><br /></p>\n");
out.write(buf.toString());
buf.setLength(0);
out.write(KEY);
@@ -2026,27 +2026,27 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
}
}
private static final String KEY = "<p>" +
"<b id=\"def.peer\">peer</b>: the remote peer<br />\n" +
"<b id=\"def.dir\">dir</b>: v means they offer to introduce us, ^ means we offer to introduce them<br />\n" +
"<b id=\"def.idle\">idle</b>: the idle time is how long since a packet has been received or sent<br />\n" +
"<b id=\"def.rate\">in/out</b>: the rates show a smoothed inbound and outbound transfer rate (KBytes per second)<br />\n" +
"<b id=\"def.up\">up</b>: the uptime is how long ago this session was established<br />\n" +
"<b id=\"def.skew\">skew</b>: the skew says how far off the other user's clock is, relative to your own<br />\n" +
"<b id=\"def.cwnd\">cwnd</b>: the congestion window is how many bytes in 'in flight' you can send w/out an acknowledgement / <br />\n" +
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the number of currently active messages being sent /<br />\n" +
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the maximum number of concurrent messages to send /<br />\n"+
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the number of consecutive sends which were blocked due to throws message window size<br />\n" +
"<b id=\"def.ssthresh\">ssthresh</b>: the slow start threshold help make sure the cwnd doesn't grow too fast<br />\n" +
"<b id=\"def.rtt\">rtt</b>: the round trip time is how long it takes to get an acknowledgement of a packet<br />\n" +
"<b id=\"def.dev\">dev</b>: the standard deviation of the round trip time, to help control the retransmit timeout<br />\n" +
"<b id=\"def.rto\">rto</b>: the retransmit timeout controls how frequently an unacknowledged packet will be retransmitted<br />\n" +
"<b id=\"def.mtu\">mtu</b>: current sending packet size / estimated receiving packet size<br />\n" +
"<b id=\"def.send\">send</b>: the number of packets sent to the peer<br />\n" +
"<b id=\"def.recv\">recv</b>: the number of packets received from the peer<br />\n" +
"<b id=\"def.resent\">resent</b>: the number of packets retransmitted to the peer<br />\n" +
"<b id=\"def.dupRecv\">dupRecv</b>: the number of duplicate packets received from the peer" +
"</p>\n";
private static final String KEY = "<h3>Definitions:</h3><div class=\"configure\">" +
"<br><b id=\"def.peer\">Peer</b>: the remote peer.<br />\n" +
"<b id=\"def.dir\">Dir</b>: v means they offer to introduce us, ^ means we offer to introduce them.<br />\n" +
"<b id=\"def.idle\">Idle</b>: the idle time is how long since a packet has been received or sent.<br />\n" +
"<b id=\"def.rate\">In/out</b>: the rates show a smoothed inbound and outbound transfer rate (KBytes per second).<br />\n" +
"<b id=\"def.up\">Up</b>: the uptime is how long ago this session was established.<br />\n" +
"<b id=\"def.skew\">Skew</b>: the skew says how far off the other user's clock is, relative to your own.<br />\n" +
"<b id=\"def.cwnd\">Cwnd</b>: the congestion window is how many bytes in 'in flight' you can send w/out an acknowledgement, / <br />\n" +
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the number of currently active messages being sent, /<br />\n" +
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the maximum number of concurrent messages to send, /<br />\n"+
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the number of consecutive sends which were blocked due to throws message window size.<br />\n" +
"<b id=\"def.ssthresh\">Sst</b>: the slow start threshold helps make sure the cwnd doesn't grow too fast.<br />\n" +
"<b id=\"def.rtt\">Rtt</b>: the round trip time is how long it takes to get an acknowledgement of a packet.<br />\n" +
"<b id=\"def.dev\">Dev</b>: the standard deviation of the round trip time, to help control the retransmit timeout.<br />\n" +
"<b id=\"def.rto\">Rto</b>: the retransmit timeout controls how frequently an unacknowledged packet will be retransmitted.<br />\n" +
"<b id=\"def.mtu\">Mtu</b>: current sending packet size / estimated receiving packet size.<br />\n" +
"<b id=\"def.send\">TX</b>: the number of packets sent to the peer.<br />\n" +
"<b id=\"def.recv\">RX</b>: the number of packets received from the peer.<br />\n" +
"<b id=\"def.resent\">ReTX</b>: the number of packets retransmitted to the peer.<br />\n" +
"<b id=\"def.dupRecv\">DupRX</b>: the number of duplicate packets received from the peer." +
"</div>\n";
/**
* Cache the bid to reduce object churn

View File

@@ -405,7 +405,7 @@ public class TunnelPoolManager implements TunnelManagerFacade {
public void renderStatusHTML(Writer out) throws IOException {
out.write("<h2><a name=\"exploratory\" ></a>Exploratory tunnels (<a href=\"/configtunnels.jsp#exploratory\">config</a>):</h2>\n");
out.write("<div class=\"wideload\"><h2><a name=\"exploratory\" ></a>Exploratory tunnels (<a href=\"/configtunnels.jsp#exploratory\">config</a>):</h2>\n");
renderPool(out, _inboundExploratory, _outboundExploratory);
List destinations = null;
@@ -455,41 +455,41 @@ public class TunnelPoolManager implements TunnelManagerFacade {
}
out.write("<tr>");
if (cfg.getReceiveTunnel() != null)
out.write("<td align=\"center\">" + cfg.getReceiveTunnel().getTunnelId() +"</td>");
out.write(" <td class=\"cells\" align=\"center\">" + cfg.getReceiveTunnel().getTunnelId() +"</td>");
else
out.write("<td align=\"center\">n/a</td>");
out.write(" <td class=\"cells\" align=\"center\">n/a</td>");
if (cfg.getReceiveFrom() != null)
out.write("<td align=\"right\">" + netDbLink(cfg.getReceiveFrom()) +"</td>");
out.write(" <td class=\"cells\" align=\"right\">" + netDbLink(cfg.getReceiveFrom()) +"</td>");
else
out.write("<td align=\"center\">&nbsp;</td>");
out.write(" <td class=\"cells\" align=\"center\">&nbsp;</td>");
if (cfg.getSendTunnel() != null)
out.write("<td align=\"center\">" + cfg.getSendTunnel().getTunnelId() +"</td>");
out.write(" <td class=\"cells\" align=\"center\">" + cfg.getSendTunnel().getTunnelId() +"</td>");
else
out.write("<td align=\"center\">&nbsp;</td>");
out.write(" <td class=\"cells\" align=\"center\">&nbsp;</td>");
if (cfg.getSendTo() != null)
out.write("<td align=\"center\">" + netDbLink(cfg.getSendTo()) +"</td>");
out.write(" <td class=\"cells\" align=\"center\">" + netDbLink(cfg.getSendTo()) +"</td>");
else
// out.write("<td align=\"center\">&nbsp;</td>");
out.write("<td align=\"center\">&nbsp;</td>");
// out.write(" <td class=\"cells\" align=\"center\">&nbsp;</td>");
out.write(" <td class=\"cells\" align=\"center\">&nbsp;</td>");
long timeLeft = cfg.getExpiration()-_context.clock().now();
if (timeLeft > 0)
out.write("<td align=\"center\">" + DataHelper.formatDuration(timeLeft) + "</td>");
out.write(" <td class=\"cells\" align=\"center\">" + DataHelper.formatDuration(timeLeft) + "</td>");
else
out.write("<td align=\"center\">(grace period)</td>");
out.write("<td align=\"center\">" + cfg.getProcessedMessagesCount() + "KB</td>");
out.write(" <td class=\"cells\" align=\"center\">(grace period)</td>");
out.write(" <td class=\"cells\" align=\"center\">" + cfg.getProcessedMessagesCount() + "KB</td>");
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("<td align=\"center\">" + bps + "Bps</td>");
out.write(" <td class=\"cells\" align=\"center\">" + bps + "Bps</td>");
if (cfg.getSendTo() == null)
out.write("<td align=\"center\">Outbound Endpoint</td>");
out.write(" <td class=\"cells\" align=\"center\">Outbound Endpoint</td>");
else if (cfg.getReceiveFrom() == null)
out.write("<td align=\"center\">Inbound Gateway</td>");
out.write(" <td class=\"cells\" align=\"center\">Inbound Gateway</td>");
else
out.write("<td align=\"center\">Participant</td>");
out.write(" <td class=\"cells\" align=\"center\">Participant</td>");
out.write("</tr>\n");
processed += cfg.getProcessedMessagesCount();
}
@@ -543,23 +543,23 @@ public class TunnelPoolManager implements TunnelManagerFacade {
continue; // don't display tunnels in their grace period
live++;
if (info.isInbound())
out.write("<tr><td align=\"center\"><img src=\"/themes/console/images/inbound.png\" alt=\"Inbound\" title=\"Inbound\"/></td>");
out.write("<tr> <td class=\"cells\" align=\"center\"><img src=\"/themes/console/images/inbound.png\" alt=\"Inbound\" title=\"Inbound\"/></td>");
else
out.write("<tr><td align=\"center\"><img src=\"/themes/console/images/outbound.png\" alt=\"Outbound\" title=\"Outbound\"/></td>");
out.write("<td align=\"center\">" + DataHelper.formatDuration(timeLeft) + "</td>\n");
out.write("<td align=\"center\">" + info.getProcessedMessagesCount() + "KB</td>\n");
out.write("<tr> <td class=\"cells\" align=\"center\"><img src=\"/themes/console/images/outbound.png\" alt=\"Outbound\" title=\"Outbound\"/></td>");
out.write(" <td class=\"cells\" align=\"center\">" + DataHelper.formatDuration(timeLeft) + "</td>\n");
out.write(" <td class=\"cells\" align=\"center\">" + info.getProcessedMessagesCount() + "KB</td>\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("<td align=\"center\">" + (id == null ? "" : "" + id) + "</td>");
out.write(" <td class=\"cells\" align=\"center\">" + (id == null ? "" : "" + id) + "</td>");
} else {
String cap = getCapacity(peer);
out.write("<td align=\"center\">" + netDbLink(peer) + (id == null ? "" : " " + id) + cap + "</td>");
out.write(" <td class=\"cells\" align=\"center\">" + netDbLink(peer) + (id == null ? "" : " " + id) + cap + "</td>");
}
if (info.getLength() < maxLength && (info.getLength() == 1 || j == info.getLength() - 2)) {
for (int k = info.getLength(); k < maxLength; k++)
out.write("<td align=\"center\">&nbsp</td>");
out.write(" <td class=\"cells\" align=\"center\">&nbsp</td>");
}
}
out.write("</tr>\n");
@@ -583,8 +583,8 @@ public class TunnelPoolManager implements TunnelManagerFacade {
live += pending.size();
}
if (live <= 0)
out.write("<div class=\"statusnotes\"><center>N<b>No tunnels; waiting for the grace period to end.</center></b></div>\n");
out.write("<div class=\"statusnotes\"><center><b>Lifetime bandwidth usage: " + DataHelper.formatSize(processedIn*1024) + "<B in, " +
out.write("<div class=\"statusnotes\"><center><b>No tunnels; waiting for the grace period to end.</center></b></div>\n");
out.write("<div class=\"statusnotes\"><center><b>Lifetime bandwidth usage: " + DataHelper.formatSize(processedIn*1024) + "B in, " +
DataHelper.formatSize(processedOut*1024) + "B out</b></center></div>");
}
@@ -605,25 +605,25 @@ public class TunnelPoolManager implements TunnelManagerFacade {
out.write("<h2><a name=\"peers\"></a>Tunnel Counts By Peer:</h2>\n");
out.write("<table><tr><th>Peer</th><th>Expl. + Client</th><th>% of total</th><th>Part. from + to</th><th>% of total</th></tr>\n");
for (Hash h : peerList) {
out.write("<tr><td align=\"center\">");
out.write("<tr> <td class=\"cells\" align=\"center\">");
out.write(netDbLink(h));
out.write("<td align=\"center\">" + lc.count(h));
out.write("<td align=\"center\">");
out.write(" <td class=\"cells\" align=\"center\">" + lc.count(h));
out.write(" <td class=\"cells\" align=\"center\">");
if (tunnelCount > 0)
out.write("" + (lc.count(h) * 100 / tunnelCount));
else
out.write('0');
out.write("<td align=\"center\">" + pc.count(h));
out.write("<td align=\"center\">");
out.write(" <td class=\"cells\" align=\"center\">" + pc.count(h));
out.write(" <td class=\"cells\" align=\"center\">");
if (partCount > 0)
out.write("" + (pc.count(h) * 100 / partCount));
else
out.write('0');
out.write('\n');
}
out.write("<tr><td align=\"center\"><b>Tunnels</b><td align=\"center\"><b>" + tunnelCount);
out.write("</b><td>&nbsp;</td><td align=\"center\"><b>" + partCount);
out.write("</b><td>&nbsp;</td></tr></table>\n");
out.write("<tr class=\"tablefooter\"> <td align=\"center\"><b>Tunnels</b> <td align=\"center\"><b>" + tunnelCount);
out.write("</b> <td>&nbsp;</td> <td align=\"center\"><b>" + partCount);
out.write("</b> <td>&nbsp;</td></tr></table></div>\n");
}
/** @return total number of non-fallback expl. + client tunnels */