propagate from branch 'i2p.i2p' (head ab5f37b28e499d49e108e8e6869164d107c7049e)

to branch 'i2p.i2p.str4d.fux' (head fb4425cd3e38762f211f73d91c7a173972e7145c)
This commit is contained in:
str4d
2012-06-05 13:38:02 +00:00
45 changed files with 712 additions and 245 deletions

View File

@ -16,7 +16,7 @@ public class NewsHelper extends ContentHelper {
if (!news.exists()) if (!news.exists())
_page = (new File(_context.getBaseDir(), "docs/initialNews/initialNews.xml")).getAbsolutePath(); _page = (new File(_context.getBaseDir(), "docs/initialNews/initialNews.xml")).getAbsolutePath();
return super.getContent(); return super.getContent();
} }
/** @since 0.8.12 */ /** @since 0.8.12 */
public boolean shouldShowNews() { public boolean shouldShowNews() {

View File

@ -3,6 +3,9 @@ package net.i2p.router.web;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import net.i2p.data.DataHelper; import net.i2p.data.DataHelper;
import net.i2p.router.RouterContext; import net.i2p.router.RouterContext;
@ -12,6 +15,32 @@ import net.i2p.router.RouterContext;
* *
*/ */
public class SummaryBarRenderer { public class SummaryBarRenderer {
// Commented out because broken. Replaced by if-elseif blob below.
/*static final Map<String, java.lang.reflect.Method> ALL_SECTIONS;
static {
Map<String, java.lang.reflect.Method> aMap = new HashMap<String, java.lang.reflect.Method>();;
try {
aMap.put("HelpAndFAQ", SummaryBarRenderer.class.getMethod("renderHelpAndFAQHTML"));
aMap.put("I2PServices", SummaryBarRenderer.class.getMethod("renderI2PServicesHTML"));
aMap.put("I2PInternals", SummaryBarRenderer.class.getMethod("renderI2PInternalsHTML"));
aMap.put("General", SummaryBarRenderer.class.getMethod("renderGeneralHTML"));
aMap.put("ShortGeneral", SummaryBarRenderer.class.getMethod("renderShortGeneralHTML"));
aMap.put("NetworkReachability", SummaryBarRenderer.class.getMethod("renderNetworkReachabilityHTML"));
aMap.put("UpdateStatus", SummaryBarRenderer.class.getMethod("renderUpdateStatusHTML"));
aMap.put("RestartStatus", SummaryBarRenderer.class.getMethod("renderRestartStatusHTMLHTML"));
aMap.put("Peers", SummaryBarRenderer.class.getMethod("renderPeersHTML"));
aMap.put("FirewallAndReseedStatus", SummaryBarRenderer.class.getMethod("renderFirewallAndReseedStatusHTML"));
aMap.put("Bandwidth", SummaryBarRenderer.class.getMethod("renderBandwidthHTML"));
aMap.put("Tunnels", SummaryBarRenderer.class.getMethod("renderTunnelsHTML"));
aMap.put("Congestion", SummaryBarRenderer.class.getMethod("renderCongestionHTML"));
aMap.put("TunnelStatus", SummaryBarRenderer.class.getMethod("renderTunnelStatusHTML"));
aMap.put("Destinations", SummaryBarRenderer.class.getMethod("renderDestinationsHTML"));
aMap.put("NewsHeadings", SummaryBarRenderer.class.getMethod("renderNewsHeadingsHTML"));
} catch (java.lang.NoSuchMethodException e) {
}
ALL_SECTIONS = Collections.unmodifiableMap(aMap);
}*/
private final RouterContext _context; private final RouterContext _context;
private final SummaryHelper _helper; private final SummaryHelper _helper;
@ -26,147 +55,188 @@ public class SummaryBarRenderer {
*/ */
public void renderSummaryHTML(Writer out) throws IOException { public void renderSummaryHTML(Writer out) throws IOException {
StringBuilder buf = new StringBuilder(8*1024); StringBuilder buf = new StringBuilder(8*1024);
String theme = _context.getProperty(CSSHelper.PROP_THEME_NAME, CSSHelper.DEFAULT_THEME); String[] sections = _helper.getSummaryBarSections();
for (int i = 0; i < sections.length; i++) {
// TODO - the bar would render more cleanly if we specified the img height and width here, // Commented out because broken. Replaced by if-elseif blob below.
// but unfortunately the images in the different themes are different sizes. /*try {
// They range in height from 37 to 43 px. But there's a -2 bottom margin... String section = (String)ALL_SECTIONS.get(sections[i]).invoke(this);
// So put it in a div. if (section != null && section != "") {
buf.append("<div style=\"height: 36px;\"><a href=\"/\" target=\"_top\"><img src=\"") out.write("<hr>" + i + "<hr>\n" + section);
.append(CSSHelper.BASE_THEME_PATH) }
.append(theme) } catch (Exception e) {
.append("/images/i2plogo.png\" alt=\"") out.write("<hr>" +i + " - Exception<hr>\n" + e);
.append(_("I2P Router Console")) }*/
.append("\" title=\"") buf.setLength(0);
.append(_("I2P Router Console"))
.append("\"></a></div><hr>") String section = sections[i];
.append("<h3><a href=\"/help\" target=\"_top\" title=\"") buf.append("<hr>\n");
if ("HelpAndFAQ".equals(section))
buf.append(renderHelpAndFAQHTML());
else if ("I2PServices".equals(section))
buf.append(renderI2PServicesHTML());
else if ("I2PInternals".equals(section))
buf.append(renderI2PInternalsHTML());
else if ("General".equals(section))
buf.append(renderGeneralHTML());
else if ("ShortGeneral".equals(section))
buf.append(renderShortGeneralHTML());
else if ("NetworkReachability".equals(section))
buf.append(renderNetworkReachabilityHTML());
else if ("UpdateStatus".equals(section))
buf.append(renderUpdateStatusHTML());
else if ("RestartStatus".equals(section))
buf.append(renderRestartStatusHTML());
else if ("Peers".equals(section))
buf.append(renderPeersHTML());
else if ("FirewallAndReseedStatus".equals(section))
buf.append(renderFirewallAndReseedStatusHTML());
else if ("Bandwidth".equals(section))
buf.append(renderBandwidthHTML());
else if ("Tunnels".equals(section))
buf.append(renderTunnelsHTML());
else if ("Congestion".equals(section))
buf.append(renderCongestionHTML());
else if ("TunnelStatus".equals(section))
buf.append(renderTunnelStatusHTML());
else if ("Destinations".equals(section))
buf.append(renderDestinationsHTML());
else if ("NewsHeadings".equals(section))
buf.append(renderNewsHeadingsHTML());
// Only output section if there's more than the <hr> to print
if (buf.length() > 5)
out.write(buf.toString());
}
}
public String renderHelpAndFAQHTML() {
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/help\" target=\"_top\" title=\"")
.append(_("I2P Router Help &amp; FAQ")) .append(_("I2P Router Help &amp; FAQ"))
.append("\">") .append("\">")
.append(_("Help &amp; FAQ")) .append(_("Help &amp; FAQ"))
.append("</a></h3><hr>"); .append("</a></h3>");
return buf.toString();
}
File lpath = new File(_context.getBaseDir(), "docs/toolbar.html"); public String renderI2PServicesHTML() {
// you better have target="_top" for the links in there... StringBuilder buf = new StringBuilder(512);
if (lpath.exists()) { buf.append("<h3><a href=\"/configclients\" target=\"_top\" title=\"")
ContentHelper linkhelper = new ContentHelper(); .append(_("Configure startup of clients and webapps (services); manually start dormant services"))
linkhelper.setPage(lpath.getAbsolutePath()); .append("\">")
linkhelper.setMaxLines("100"); .append(_("I2P Services"))
buf.append(linkhelper.getContent()); .append("</a></h3>\n" +
} else {
buf.append("<h3><a href=\"/configclients\" target=\"_top\" title=\"")
.append(_("Configure startup of clients and webapps (services); manually start dormant services"))
.append("\">")
.append(_("I2P Services"))
.append("</a></h3>\n" +
"<hr class=\"b\"><table><tr><td>" + "<hr class=\"b\"><table><tr><td>" +
"<a href=\"/susimail/susimail\" target=\"blank\" title=\"") "<a href=\"/susimail/susimail\" target=\"blank\" title=\"")
.append(_("Anonymous webmail client")) .append(_("Anonymous webmail client"))
.append("\">") .append("\">")
.append(_("Email")) .append(_("Email"))
.append("</a>\n" + .append("</a>\n" +
"<a href=\"/i2psnark/\" target=\"_blank\" title=\"") "<a href=\"/i2psnark/\" target=\"_blank\" title=\"")
.append(_("Built-in anonymous BitTorrent Client")) .append(_("Built-in anonymous BitTorrent Client"))
.append("\">") .append("\">")
.append(_("Torrents")) .append(_("Torrents"))
.append("</a>\n" + .append("</a>\n" +
"<a href=\"http://127.0.0.1:7658/\" target=\"_blank\" title=\"") "<a href=\"http://127.0.0.1:7658/\" target=\"_blank\" title=\"")
.append(_("Local web server")) .append(_("Local web server"))
.append("\">") .append("\">")
.append(_("Website")) .append(_("Website"))
.append("</a>\n") .append("</a>\n")
.append(NavHelper.getClientAppLinks(_context)) .append(NavHelper.getClientAppLinks(_context))
.append("</td></tr></table>\n" + .append("</td></tr></table>\n");
return buf.toString();
}
"<hr><h3><a href=\"/config\" target=\"_top\" title=\"") public String renderI2PInternalsHTML() {
.append(_("Configure I2P Router")) StringBuilder buf = new StringBuilder(512);
.append("\">") buf.append("<h3><a href=\"/config\" target=\"_top\" title=\"")
.append(_("I2P Internals")) .append(_("Configure I2P Router"))
.append("</a></h3><hr class=\"b\">\n" + .append("\">")
.append(_("I2P Internals"))
.append("</a></h3><hr class=\"b\">\n" +
"<table><tr><td>\n" + "<table><tr><td>\n" +
"<a href=\"/tunnels\" target=\"_top\" title=\"") "<a href=\"/tunnels\" target=\"_top\" title=\"")
.append(_("View existing tunnels and tunnel build status")) .append(_("View existing tunnels and tunnel build status"))
.append("\">") .append("\">")
.append(_("Tunnels")) .append(_("Tunnels"))
.append("</a>\n" + .append("</a>\n" +
"<a href=\"/peers\" target=\"_top\" title=\"") "<a href=\"/peers\" target=\"_top\" title=\"")
.append(_("Show all current peer connections")) .append(_("Show all current peer connections"))
.append("\">") .append("\">")
.append(_("Peers")) .append(_("Peers"))
.append("</a>\n" + .append("</a>\n" +
"<a href=\"/profiles\" target=\"_top\" title=\"") "<a href=\"/profiles\" target=\"_top\" title=\"")
.append(_("Show recent peer performance profiles")) .append(_("Show recent peer performance profiles"))
.append("\">") .append("\">")
.append(_("Profiles")) .append(_("Profiles"))
.append("</a>\n" + .append("</a>\n" +
"<a href=\"/netdb\" target=\"_top\" title=\"") "<a href=\"/netdb\" target=\"_top\" title=\"")
.append(_("Show list of all known I2P routers")) .append(_("Show list of all known I2P routers"))
.append("\">") .append("\">")
.append(_("NetDB")) .append(_("NetDB"))
.append("</a>\n" + .append("</a>\n" +
"<a href=\"/logs\" target=\"_top\" title=\"") "<a href=\"/logs\" target=\"_top\" title=\"")
.append(_("Health Report")) .append(_("Health Report"))
.append("\">") .append("\">")
.append(_("Logs")) .append(_("Logs"))
.append("</a>\n"); .append("</a>\n");
// "<a href=\"/jobs.jsp\" target=\"_top\" title=\"") // "<a href=\"/jobs.jsp\" target=\"_top\" title=\"")
// .append(_("Show the router's workload, and how it's performing")) // .append(_("Show the router's workload, and how it's performing"))
// .append("\">") // .append("\">")
// .append(_("Jobs")) // .append(_("Jobs"))
// .append("</a>\n" + // .append("</a>\n" +
if (!StatSummarizer.isDisabled()) { if (!StatSummarizer.isDisabled()) {
buf.append("<a href=\"/graphs\" target=\"_top\" title=\"") buf.append("<a href=\"/graphs\" target=\"_top\" title=\"")
.append(_("Graph router performance")) .append(_("Graph router performance"))
.append("\">") .append("\">")
.append(_("Graphs")) .append(_("Graphs"))
.append("</a>\n"); .append("</a>\n");
}
buf.append("<a href=\"/stats\" target=\"_top\" title=\"")
.append(_("Textual router performance statistics"))
.append("\">")
.append(_("Stats"))
.append("</a>\n" +
"<a href=\"/i2ptunnel/\" target=\"_blank\" title=\"")
.append(_("Local Destinations"))
.append("\">")
.append(_("I2PTunnel"))
.append("</a>\n" +
"<a href=\"/susidns/index\" target=\"_blank\" title=\"")
.append(_("Manage your I2P hosts file here (I2P domain name resolution)"))
.append("\">")
.append(_("Addressbook"))
.append("</a>\n");
File javadoc = new File(_context.getBaseDir(), "docs/javadoc/index.html");
if (javadoc.exists())
buf.append("<a href=\"/javadoc/index.html\" target=\"_blank\">Javadoc</a>\n");
buf.append("</td></tr></table>\n");
out.write(buf.toString());
buf.setLength(0);
} }
buf.append("<a href=\"/stats\" target=\"_top\" title=\"")
.append(_("Textual router performance statistics"))
.append("\">")
.append(_("Stats"))
.append("</a>\n" +
"<a href=\"/i2ptunnel/\" target=\"_blank\" title=\"")
.append(_("Local Destinations"))
.append("\">")
.append(_("I2PTunnel"))
.append("</a>\n" +
buf.append("<hr><h3><a href=\"/help\" target=\"_top\" title=\"") "<a href=\"/susidns/index\" target=\"_blank\" title=\"")
.append(_("Manage your I2P hosts file here (I2P domain name resolution)"))
.append("\">")
.append(_("Addressbook"))
.append("</a>\n");
File javadoc = new File(_context.getBaseDir(), "docs/javadoc/index.html");
if (javadoc.exists())
buf.append("<a href=\"/javadoc/index.html\" target=\"_blank\">Javadoc</a>\n");
buf.append("</td></tr></table>\n");
return buf.toString();
}
public String renderGeneralHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/help\" target=\"_top\" title=\"")
.append(_("I2P Router Help")) .append(_("I2P Router Help"))
.append("\">") .append("\">")
.append(_("General")) .append(_("General"))
@ -202,24 +272,64 @@ public class SummaryBarRenderer {
.append(":</b></td>" + .append(":</b></td>" +
"<td align=\"right\">") "<td align=\"right\">")
.append(_helper.getUptime()) .append(_helper.getUptime())
.append("</td></tr></table>\n" + .append("</td></tr></table>\n");
return buf.toString();
}
"<hr><h4><a href=\"/confignet#help\" target=\"_top\" title=\"") public String renderShortGeneralHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<table>" +
"<tr><td align=\"left\"><b>")
.append(_("Version"))
.append(":</b></td>" +
"<td align=\"right\">")
.append(_helper.getVersion())
.append("</td></tr>\n" +
"<tr title=\"")
.append(_("How long we've been running for this session"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Uptime"))
.append(":</b></td>" +
"<td align=\"right\">")
.append(_helper.getUptime())
.append("</td></tr></table>\n");
return buf.toString();
}
public String renderNetworkReachabilityHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<h4><a href=\"/confignet#help\" target=\"_top\" title=\"")
.append(_("Help with configuring your firewall and router for optimal I2P performance")) .append(_("Help with configuring your firewall and router for optimal I2P performance"))
.append("\">") .append("\">")
.append(_("Network")) .append(_("Network"))
.append(": ") .append(": ")
.append(_helper.getReachability()) .append(_helper.getReachability())
.append("</a></h4><hr>\n") .append("</a></h4>\n");
return buf.toString();
}
public String renderUpdateStatusHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append(_helper.getUpdateStatus());
return buf.toString();
}
.append(_helper.getUpdateStatus()) public String renderRestartStatusHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append(_helper.getRestartStatus());
return buf.toString();
}
public String renderPeersHTML() {
.append(_helper.getRestartStatus()) if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/peers\" target=\"_top\" title=\"")
.append("<hr><h3><a href=\"/peers\" target=\"_top\" title=\"")
.append(_("Show all current peer connections")) .append(_("Show all current peer connections"))
.append("\">") .append("\">")
.append(_("Peers")) .append(_("Peers"))
@ -260,14 +370,20 @@ public class SummaryBarRenderer {
.append(_helper.getAllPeers()) .append(_helper.getAllPeers())
.append("</td></tr>\n" + .append("</td></tr>\n" +
"</table><hr>\n"); "</table>\n");
return buf.toString();
}
out.write(buf.toString());
buf.setLength(0);
public String renderFirewallAndReseedStatusHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append(_helper.getFirewallAndReseedStatus()); buf.append(_helper.getFirewallAndReseedStatus());
return buf.toString();
}
public String renderBandwidthHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/config\" title=\"") buf.append("<h3><a href=\"/config\" title=\"")
.append(_("Configure router bandwidth allocation")) .append(_("Configure router bandwidth allocation"))
.append("\" target=\"_top\">") .append("\" target=\"_top\">")
@ -303,9 +419,16 @@ public class SummaryBarRenderer {
.append(_helper.getInboundTransferred()) .append(_helper.getInboundTransferred())
.append(SummaryHelper.THINSP) .append(SummaryHelper.THINSP)
.append(_helper.getOutboundTransferred()) .append(_helper.getOutboundTransferred())
.append("</td></tr></table>\n" + .append("</td></tr>\n" +
"<hr><h3><a href=\"/tunnels\" target=\"_top\" title=\"") "</table>\n");
return buf.toString();
}
public String renderTunnelsHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/tunnels\" target=\"_top\" title=\"")
.append(_("View existing tunnels and tunnel build status")) .append(_("View existing tunnels and tunnel build status"))
.append("\">") .append("\">")
.append(_("Tunnels")) .append(_("Tunnels"))
@ -336,7 +459,14 @@ public class SummaryBarRenderer {
.append(_helper.getShareRatio()) .append(_helper.getShareRatio())
.append("</td></tr>\n" + .append("</td></tr>\n" +
"</table><hr><h3><a href=\"/jobs\" target=\"_top\" title=\"") "</table>\n");
return buf.toString();
}
public String renderCongestionHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/jobs\" target=\"_top\" title=\"")
.append(_("What's in the router's job queue?")) .append(_("What's in the router's job queue?"))
.append("\">") .append("\">")
.append(_("Congestion")) .append(_("Congestion"))
@ -369,16 +499,74 @@ public class SummaryBarRenderer {
.append(_helper.getInboundBacklog()) .append(_helper.getInboundBacklog())
.append("</td></tr>\n" + .append("</td></tr>\n" +
"</table><hr><h4>") "</table>\n");
return buf.toString();
}
public String renderTunnelStatusHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(50);
buf.append("<h4>")
.append(_(_helper.getTunnelStatus())) .append(_(_helper.getTunnelStatus()))
.append("</h4><hr>\n") .append("</h4>\n");
return buf.toString();
}
.append(_helper.getDestinations()) public String renderDestinationsHTML() {
.append("<hr>\n"); if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append(_helper.getDestinations());
return buf.toString();
}
/** @since 0.9.1 */
public String renderNewsHeadingsHTML() {
out.write(buf.toString()); if (_helper == null) return "";
NewsHelper newshelper = _helper.getNewsHelper();
if (newshelper == null || newshelper.shouldShowNews()) return "";
StringBuilder buf = new StringBuilder(512);
String consoleNonce = System.getProperty("router.consoleNonce");
if (consoleNonce != null) {
// Set up title and pre-headings stuff.
buf.append("<h3><a href=\"/configupdate\">")
.append(_("News & Updates"))
.append("</a></h3><hr class=\"b\"><div class=\"newsheadings\">\n");
// Get news content.
String newsContent = newshelper.getContent();
if (newsContent != "") {
buf.append("<ul>\n");
// Parse news content for headings.
int start = newsContent.indexOf("<h3>");
while (start >= 0) {
// Add offset to start:
// 4 - gets rid of <h3>
// 16 - gets rid of the date as well (assuming form "<h3>yyyy-mm-dd: Foobarbaz...")
newsContent = newsContent.substring(start+16, newsContent.length());
int end = newsContent.indexOf("</h3>");
if (end >= 0) {
String heading = newsContent.substring(0, end);
buf.append("<li>")
.append(heading)
.append("</li>\n");
}
start = newsContent.indexOf("<h3>");
}
buf.append("</ul>\n");
// Set up string containing <a> to show news.
buf.append("<a href=\"/?news=1&amp;consoleNonce=")
.append(consoleNonce)
.append("\">")
.append(_("Show news"))
.append("</a>\n");
} else {
buf.append("<center><i>")
.append(_("none"))
.append("</i></center>");
}
// Add post-headings stuff.
buf.append("</div>\n");
}
return buf.toString();
} }
/** translate a string */ /** translate a string */

View File

@ -35,6 +35,35 @@ public class SummaryHelper extends HelperBase {
// Opera 10.63 doesn't have the char, TODO check UA // Opera 10.63 doesn't have the char, TODO check UA
//static final String THINSP = "&thinsp;/&thinsp;"; //static final String THINSP = "&thinsp;/&thinsp;";
static final String THINSP = " / "; static final String THINSP = " / ";
private static final char S = ',';
static final String PROP_SUMMARYBAR = "routerconsole.summaryBar";
static final String PRESET_FULL =
"HelpAndFAQ" + S +
"I2PServices" + S +
"I2PInternals" + S +
"General" + S +
"NetworkReachability" + S +
"UpdateStatus" + S +
"RestartStatus" + S +
"Peers" + S +
"FirewallAndReseedStatus" + S +
"Bandwidth" + S +
"Tunnels" + S +
"Congestion" + S +
"TunnelStatus" + S +
"Destinations" + S +
"";
static final String PRESET_SHORT =
"ShortGeneral" + S +
"NewsHeadings" + S +
"UpdateStatus" + S +
"NetworkReachability" + S +
"FirewallAndReseedStatus" + S +
"Destinations" + S +
"RestartStatus" + S +
"";
/** /**
* Retrieve the shortened 4 character ident for the router located within * Retrieve the shortened 4 character ident for the router located within
@ -651,7 +680,7 @@ public class SummaryHelper extends HelperBase {
.append(_("Download Unsigned<br>Update {0}", getUnsignedUpdateVersion())) .append(_("Download Unsigned<br>Update {0}", getUnsignedUpdateVersion()))
.append("</button><br>\n"); .append("</button><br>\n");
} }
buf.append("</form>\n"); buf.append("</form><hr>\n");
} }
} }
return buf.toString(); return buf.toString();
@ -710,6 +739,22 @@ public class SummaryHelper extends HelperBase {
return buf.toString(); return buf.toString();
} }
private NewsHelper _newshelper;
public void storeNewsHelper(NewsHelper n) { _newshelper = n; }
public NewsHelper getNewsHelper() { return _newshelper; }
public String[] getSummaryBarSections() {
String config = _context.getProperty(PROP_SUMMARYBAR, PRESET_FULL);
return config.split("" + S);
}
public void saveSummaryBarSections(String[] sections) {
StringBuilder buf = new StringBuilder(512);
for(int i = 0; i < sections.length; i++)
buf.append(sections[i]).append(S);
_context.router().saveConfig(PROP_SUMMARYBAR, buf.toString());
}
/** output the summary bar to _out */ /** output the summary bar to _out */
public void renderSummaryBar() throws IOException { public void renderSummaryBar() throws IOException {
SummaryBarRenderer renderer = new SummaryBarRenderer(_context, this); SummaryBarRenderer renderer = new SummaryBarRenderer(_context, this);

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("configure bandwidth")%> <%=intl.title("configure bandwidth")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config advanced")%> <%=intl.title("config advanced")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>

View File

@ -10,7 +10,14 @@ button span.hide{
display:none; display:none;
} }
input.default { width: 1px; height: 1px; visibility: hidden; } input.default { width: 1px; height: 1px; visibility: hidden; }
</style></head><body> </style>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>

View File

@ -12,7 +12,13 @@ input.default {
visibility: hidden; visibility: hidden;
} }
</style> </style>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Home Page Configuration")%></h1> <h1><%=intl._("I2P Home Page Configuration")%></h1>

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config keyring")%> <%=intl.title("config keyring")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Keyring Configuration")%></h1> <h1><%=intl._("I2P Keyring Configuration")%></h1>

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config logging")%> <%=intl.title("config logging")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<jsp:useBean class="net.i2p.router.web.ConfigLoggingHelper" id="logginghelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.ConfigLoggingHelper" id="logginghelper" scope="request" />
<jsp:setProperty name="logginghelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" /> <jsp:setProperty name="logginghelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config networking")%> <%=intl.title("config networking")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config peers")%> <%=intl.title("config peers")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Peer Configuration")%></h1> <h1><%=intl._("I2P Peer Configuration")%></h1>

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config reseeding")%> <%=intl.title("config reseeding")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config service")%> <%=intl.title("config service")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Service Configuration")%></h1> <h1><%=intl._("I2P Service Configuration")%></h1>

View File

@ -6,10 +6,17 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config stats")%> <%=intl.title("config stats")%>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
<script type="text/javascript"> <script type="text/javascript">
function init() function init()
{ {
checkAll = false; checkAll = false;
initAjax();
} }
function toggleAll(category) function toggleAll(category)
{ {

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config tunnels")%> <%=intl.title("config tunnels")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config UI")%> <%=intl.title("config UI")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config update")%> <%=intl.title("config update")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Update Configuration")%></h1> <h1><%=intl._("I2P Update Configuration")%></h1>

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("home")%> <%=intl.title("home")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<% <%
String consoleNonce = System.getProperty("router.consoleNonce"); String consoleNonce = System.getProperty("router.consoleNonce");
if (consoleNonce == null) { if (consoleNonce == null) {
@ -15,16 +21,13 @@
} }
%> %>
<%@include file="summary.jsi" %><h1><%=intl._("I2P Router Console")%></h1> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Router Console")%></h1>
<div class="news" id="news"> <div class="news" id="news">
<jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" />
<jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<% <%
if (newshelper.shouldShowNews()) { if (newshelper.shouldShowNews()) {
java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
%> %>
<jsp:setProperty name="newshelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
<jsp:getProperty name="newshelper" property="content" /> <jsp:getProperty name="newshelper" property="content" />
<hr> <hr>
<% <%

View File

@ -9,7 +9,13 @@
%> %>
<html><head><title>I2P Router Console - Debug</title> <html><head><title>I2P Router Console - Debug</title>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1>Router SKM</h1> <h1>Router SKM</h1>
<div class="main" id="main"> <div class="main" id="main">

View File

@ -16,7 +16,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("Page Not Found")%> <%=intl.title("Page Not Found")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1><%=ERROR_CODE%> <%=ERROR_MESSAGE%></h1> <h1><%=ERROR_CODE%> <%=ERROR_MESSAGE%></h1>
<div class="sorry" id="warning"> <div class="sorry" id="warning">

View File

@ -12,7 +12,13 @@
<% <%
graphHelper.storeWriter(out); graphHelper.storeWriter(out);
%> %>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Performance Graphs")%></h1> <h1><%=intl._("I2P Performance Graphs")%></h1>
<div class="main" id="main"> <div class="main" id="main">

View File

@ -19,7 +19,13 @@
out.print(graphHelper.getRefreshMeta()); out.print(graphHelper.getRefreshMeta());
} }
%> %>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Performance Graphs")%></h1> <h1><%=intl._("I2P Performance Graphs")%></h1>
<div class="main" id="main"> <div class="main" id="main">

View File

@ -9,7 +9,13 @@
%> %>
<html><head><title>I2P Router Console - help</title> <html><head><title>I2P Router Console - help</title>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1>I2P Router Help &amp; Support</h1> <h1>I2P Router Help &amp; Support</h1>
<div class="main" id="main"><p> <div class="main" id="main"><p>

View File

@ -9,7 +9,13 @@
%> %>
<html><head><title>I2P مساعدة لوحة التحكم</title> <html><head><title>I2P مساعدة لوحة التحكم</title>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1>I2P مساعدة لوحة التحكم</h1> <h1>I2P مساعدة لوحة التحكم</h1>
<div class="main" id="main" dir="rtl" lang="ar"><p> <div class="main" id="main" dir="rtl" lang="ar"><p>

View File

@ -9,7 +9,13 @@
%> %>
<html><head><title>Console du routeur I2P - Aide</title> <html><head><title>Console du routeur I2P - Aide</title>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
Traduction de mars 2011 (magma@mail.i2p) Traduction de mars 2011 (magma@mail.i2p)
<h1>Aide et assistance du routeur I2P</h1> <h1>Aide et assistance du routeur I2P</h1>

View File

@ -9,7 +9,13 @@
%> %>
<html><head><title>I2P Router Console - help</title> <html><head><title>I2P Router Console - help</title>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1>I2P Router Help &amp; Support</h1> <h1>I2P Router Help &amp; Support</h1>
<div class="main" id="main"><p> <div class="main" id="main"><p>

View File

@ -9,7 +9,13 @@
%> %>
<html><head><title>Консоль маршрутизатора I2P - справка</title> <html><head><title>Консоль маршрутизатора I2P - справка</title>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1>Справка маршрутизатора I2P</h1> <h1>Справка маршрутизатора I2P</h1>

View File

@ -6,9 +6,9 @@
<%=intl.title("home")%> <%=intl.title("home")%>
<script src="/js/ajax.js" type="text/javascript"></script> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript"> <script type="text/javascript">
var failMessage = "<b><%=intl._("Router is down")%><\/b>"; var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", 15000); } function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, 15000); } function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script> </script>
</head><body onload="initAjax()"> </head><body onload="initAjax()">
<% <%
@ -20,6 +20,11 @@
%> %>
<jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" />
<jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" /> <jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
%>
<jsp:setProperty name="newshelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
<jsp:useBean class="net.i2p.router.web.ConfigUpdateHelper" id="updatehelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.ConfigUpdateHelper" id="updatehelper" scope="request" />
<jsp:setProperty name="updatehelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" /> <jsp:setProperty name="updatehelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
@ -28,19 +33,10 @@
<div style="height: 36px;"> <div style="height: 36px;">
<a href="/console"><img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/i2plogo.png" alt="<%=intl._("I2P Router Console")%>" title="<%=intl._("I2P Router Console")%>"></a> <a href="/console"><img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/i2plogo.png" alt="<%=intl._("I2P Router Console")%>" title="<%=intl._("I2P Router Console")%>"></a>
</div> </div>
<hr>
<div id="xhr"> <div id="xhr">
<!-- for non-script --> <!-- for non-script -->
<%@include file="xhr1.jsi" %> <%@include file="xhr1.jsi" %>
</div> </div>
<%
if (!newshelper.shouldShowNews()) {
%>
<hr><h3><%=intl._("News")%></h3><hr class="b">
<jsp:getProperty name="updatehelper" property="newsStatus" />
<%
} // !shouldShowNews()
%>
</div> </div>
</div> </div>
@ -48,11 +44,8 @@
<% <%
if (newshelper.shouldShowNews()) { if (newshelper.shouldShowNews()) {
java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
%> %>
<div class="news" id="news"> <div class="news" id="news">
<jsp:setProperty name="newshelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
<jsp:getProperty name="newshelper" property="content" /> <jsp:getProperty name="newshelper" property="content" />
<hr> <hr>
<jsp:getProperty name="updatehelper" property="newsStatus" /><br> <jsp:getProperty name="updatehelper" property="newsStatus" /><br>

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("Jar File Dump")%> <%=intl.title("Jar File Dump")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %><h1>Jar File Dump</h1> <%@include file="summary.jsi" %><h1>Jar File Dump</h1>
<div class="main" id="main"> <div class="main" id="main">
<jsp:useBean class="net.i2p.router.web.FileDumpHelper" id="dumpHelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.FileDumpHelper" id="dumpHelper" scope="request" />

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("job queue")%> <%=intl.title("job queue")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %><h1><%=intl._("I2P Router Job Queue")%></h1> <%@include file="summary.jsi" %><h1><%=intl._("I2P Router Job Queue")%></h1>
<div class="main" id="main"> <div class="main" id="main">
<jsp:useBean class="net.i2p.router.web.JobQueueHelper" id="jobQueueHelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.JobQueueHelper" id="jobQueueHelper" scope="request" />

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("logs")%> <%=intl.title("logs")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Router Logs")%></h1> <h1><%=intl._("I2P Router Logs")%></h1>
<div class="main" id="main"> <div class="main" id="main">
@ -33,8 +39,10 @@
<p><%=intl._("Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report.")%></p> <p><%=intl._("Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report.")%></p>
<h3><%=intl._("Critical Logs")%></h3><a name="criticallogs"> </a> <h3><%=intl._("Critical Logs")%></h3><a name="criticallogs"> </a>
<jsp:getProperty name="logsHelper" property="criticalLogs" /> <jsp:getProperty name="logsHelper" property="criticalLogs" />
<hr>
<h3><%=intl._("Router Logs")%> (<a href="configlogging"><%=intl._("configure")%></a>)</h3> <h3><%=intl._("Router Logs")%> (<a href="configlogging"><%=intl._("configure")%></a>)</h3>
<jsp:getProperty name="logsHelper" property="logs" /> <jsp:getProperty name="logsHelper" property="logs" />
<hr>
<h3><%=intl._("Service (Wrapper) Logs")%></h3><a name="servicelogs"> </a> <h3><%=intl._("Service (Wrapper) Logs")%></h3><a name="servicelogs"> </a>
<jsp:getProperty name="logsHelper" property="serviceLogs" /> <jsp:getProperty name="logsHelper" property="serviceLogs" />
</div><hr></div></body></html> </div><hr></div></body></html>

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("network database")%> <%=intl.title("network database")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Network Database")%></h1> <h1><%=intl._("I2P Network Database")%></h1>
<div class="main" id="main"> <div class="main" id="main">

View File

@ -7,7 +7,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("WebApp Not Found")%> <%=intl.title("WebApp Not Found")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1><%=intl._("Web Application Not Running")%></h1> <h1><%=intl._("Web Application Not Running")%></h1>
<div class="sorry" id="warning"> <div class="sorry" id="warning">

View File

@ -9,7 +9,13 @@
%> %>
<html><head><title>I2P Router Console - internals</title> <html><head><title>I2P Router Console - internals</title>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<jsp:useBean class="net.i2p.router.web.OldConsoleHelper" id="conhelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.OldConsoleHelper" id="conhelper" scope="request" />
<jsp:setProperty name="conhelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" /> <jsp:setProperty name="conhelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("peer connections")%> <%=intl.title("peer connections")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Network Peers")%></h1> <h1><%=intl._("I2P Network Peers")%></h1>
<div class="main" id="main"><div class="wideload"> <div class="main" id="main"><div class="wideload">

View File

@ -6,7 +6,14 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("peer profiles")%> <%=intl.title("peer profiles")%>
</head><body><%@include file="summary.jsi" %> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Network Peer Profiles")%></h1> <h1><%=intl._("I2P Network Peer Profiles")%></h1>
<div class="main" id="main"><div class="wideload"> <div class="main" id="main"><div class="wideload">
<jsp:useBean class="net.i2p.router.web.ProfilesHelper" id="profilesHelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.ProfilesHelper" id="profilesHelper" scope="request" />

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("statistics")%> <%=intl.title("statistics")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<jsp:useBean class="net.i2p.router.web.OldConsoleHelper" id="oldhelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.OldConsoleHelper" id="oldhelper" scope="request" />
<jsp:setProperty name="oldhelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" /> <jsp:setProperty name="oldhelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />

View File

@ -1,3 +1,10 @@
<jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" />
<jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
java.io.File newspath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
%>
<jsp:setProperty name="newshelper" property="page" value="<%=newspath.getAbsolutePath()%>" />
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
<div class="routersummaryouter"> <div class="routersummaryouter">
<% <%
// The refresh delay, 0 to disable // The refresh delay, 0 to disable
@ -15,7 +22,7 @@
newDelay = "?refresh=" + d; newDelay = "?refresh=" + d;
} }
if (!"0".equals(d)) if (!"0".equals(d))
out.print("<iframe src=\"/summaryframe.jsp" + newDelay + "\" height=\"1500\" width=\"200\" scrolling=\"auto\" frameborder=\"0\" title=\"sidepanel\">\n"); out.print("<noscript><iframe src=\"/summaryframe.jsp" + newDelay + "\" height=\"1500\" width=\"200\" scrolling=\"auto\" frameborder=\"0\" title=\"sidepanel\"></noscript>\n");
} }
%> %>
<div class="routersummary"> <div class="routersummary">
@ -34,11 +41,11 @@
// d and allowIFrame defined above // d and allowIFrame defined above
if (!"0".equals(d)) { if (!"0".equals(d)) {
out.print("</div></iframe>\n"); out.print("</div><noscript></iframe></noscript>\n");
} else if (allowIFrame) { } else if (allowIFrame) {
// since we don't have an iframe this will reload the base page, and // since we don't have an iframe this will reload the base page, and
// the new delay will be passed to the iframe above // the new delay will be passed to the iframe above
out.print("<div class=\"refresh\"><form action=\"" + request.getRequestURI() + "\" method=\"POST\">\n" + out.print("<noscript><div class=\"refresh\"><form action=\"" + request.getRequestURI() + "\" method=\"POST\">\n" +
"<b>"); "<b>");
// We have intl defined when this is included, but not when compiled standalone. // We have intl defined when this is included, but not when compiled standalone.
out.print(intl._("Refresh (s)")); out.print(intl._("Refresh (s)"));
@ -47,7 +54,7 @@
// ditto // ditto
out.print(intl._("Enable")); out.print(intl._("Enable"));
out.print("</button>\n" + out.print("</button>\n" +
"</form></div></div>\n"); "</form></div></noscript></div>\n");
} else { } else {
out.print("</div>\n"); out.print("</div>\n");
} }

View File

@ -52,11 +52,18 @@
} }
%> %>
</head><body style="margin: 0;"><div class="routersummary"> </head><body style="margin: 0;"><div class="routersummary">
<jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" />
<jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
java.io.File newspath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
%>
<jsp:setProperty name="newshelper" property="page" value="<%=newspath.getAbsolutePath()%>" />
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
<%@include file="summarynoframe.jsi" %> <%@include file="summarynoframe.jsi" %>
<% <%
// d and shutdownSoon defined above // d and shutdownSoon defined above
if (!shutdownSoon) { if (!shutdownSoon) {
out.print("<div class=\"refresh\"><form action=\"summaryframe.jsp\" method=\"POST\">\n"); out.print("<hr>\n<div class=\"refresh\"><form action=\"summaryframe.jsp\" method=\"POST\">\n");
if ("0".equals(d)) { if ("0".equals(d)) {
out.print("<b>"); out.print("<b>");
out.print(intl._("Refresh (s)")); out.print(intl._("Refresh (s)"));

View File

@ -1,35 +1,17 @@
<%@page import="net.i2p.router.web.SummaryHelper" %>
<% <%
/* /*
* Note: * TODO - the bar would render more cleanly if we specified the img height and width here,
* This is included almost 30 times, so keep whitespace etc. to a minimum. * but unfortunately the images in the different themes are different sizes.
* They range in height from 37 to 43 px. But there's a -2 bottom margin...
* So put it in a div.
*/ */
%> %>
<jsp:useBean class="net.i2p.router.web.SummaryHelper" id="helper" scope="request" /> <div style="height: 36px;">
<jsp:setProperty name="helper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" /> <a href="/" target="_top">
<jsp:setProperty name="helper" property="action" value="<%=request.getParameter(\"action\")%>" /> <img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/i2plogo.png" alt="<%=intl._("I2P Router Console")%>" title="<%=intl._("I2P Router Console")%>">
<jsp:setProperty name="helper" property="updateNonce" value="<%=request.getParameter(\"updateNonce\")%>" /> </a>
<jsp:setProperty name="helper" property="consoleNonce" value="<%=request.getParameter(\"consoleNonce\")%>" /> </div>
<jsp:setProperty name="helper" property="requestURI" value="<%=request.getRequestURI()%>" /> <div id="xhr">
<% helper.storeWriter(out); %> <!-- for non-script -->
<% <%@include file="xhr1.jsi" %>
/* </div>
* The following is required for the reseed button to work, although we probably
* only need the reseedNonce property.
*/
%>
<jsp:useBean class="net.i2p.router.web.ReseedHandler" id="reseed" scope="request" />
<jsp:setProperty name="reseed" property="*" />
<%
/*
* The following is required for the update buttons to work, although we probably
* only need the updateNonce property.
*/
%>
<jsp:useBean class="net.i2p.router.web.UpdateHandler" id="update" scope="request" />
<jsp:setProperty name="update" property="*" />
<jsp:setProperty name="update" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
// moved to java for ease of translation and to avoid 30 copies
helper.renderSummaryBar();
%>

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("tunnel summary")%> <%=intl.title("tunnel summary")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %><h1><%=intl._("I2P Tunnel Summary")%></h1> <%@include file="summary.jsi" %><h1><%=intl._("I2P Tunnel Summary")%></h1>
<div class="main" id="main"> <div class="main" id="main">
<jsp:useBean class="net.i2p.router.web.TunnelHelper" id="tunnelHelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.TunnelHelper" id="tunnelHelper" scope="request" />

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("Peer Profile")%> <%=intl.title("Peer Profile")%>
</head><body> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %> <%@include file="summary.jsi" %>
<h1><%=intl._("Peer Profile")%></h1> <h1><%=intl._("Peer Profile")%></h1>
<div class="main" id="main"><div class="wideload"> <div class="main" id="main"><div class="wideload">

View File

@ -1,24 +1,41 @@
<%@page import="net.i2p.router.web.SummaryHelper" %>
<%
/*
* Note:
* This is included on every refresh, so keep whitespace etc. to a minimum.
*/
%>
<jsp:useBean class="net.i2p.router.web.SummaryHelper" id="helper" scope="request" /> <jsp:useBean class="net.i2p.router.web.SummaryHelper" id="helper" scope="request" />
<jsp:setProperty name="helper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" /> <jsp:setProperty name="helper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<jsp:setProperty name="helper" property="action" value="<%=request.getParameter(\"action\")%>" /> <jsp:setProperty name="helper" property="action" value="<%=request.getParameter(\"action\")%>" />
<table><tr><td align="left"><b><%=intl._("Version")%>:</b></td><td align="right">
<jsp:getProperty name="helper" property="version" />
</td></tr><tr><td align="left"><b><%=intl._("Uptime")%>:</b></td><td align="right">
<jsp:getProperty name="helper" property="uptime" />
</td></tr></table><hr>
<jsp:setProperty name="helper" property="updateNonce" value="<%=request.getParameter(\"updateNonce\")%>" /> <jsp:setProperty name="helper" property="updateNonce" value="<%=request.getParameter(\"updateNonce\")%>" />
<jsp:setProperty name="helper" property="consoleNonce" value="<%=request.getParameter(\"consoleNonce\")%>" /> <jsp:setProperty name="helper" property="consoleNonce" value="<%=request.getParameter(\"consoleNonce\")%>" />
<% <%
String reqURI = request.getRequestURI(); String reqURI = request.getRequestURI();
if (reqURI != null) if (reqURI != null)
reqURI = reqURI.replace("/xhr1.jsp", "/home"); reqURI = reqURI.replace("/xhr1.jsp", "/");
helper.setRequestURI(reqURI); helper.setRequestURI(reqURI);
%> %>
<h4><a href="/confignet#help" title="<%=intl._("Help with configuring your firewall and router for optimal I2P performance")%>"><%=intl._("Network")%>: <% helper.storeWriter(out); %>
<jsp:getProperty name="helper" property="reachability" /></a></h4> <% helper.storeNewsHelper(newshelper); %>
<hr> <%
<jsp:getProperty name="helper" property="updateStatus" /> /*
<jsp:getProperty name="helper" property="restartStatus" /> * The following is required for the reseed button to work, although we probably
<hr> * only need the reseedNonce property.
<jsp:getProperty name="helper" property="firewallAndReseedStatus" /> */
<jsp:getProperty name="helper" property="destinations" /> %>
<jsp:useBean class="net.i2p.router.web.ReseedHandler" id="reseed" scope="request" />
<jsp:setProperty name="reseed" property="*" />
<%
/*
* The following is required for the update buttons to work, although we probably
* only need the updateNonce property.
*/
%>
<jsp:useBean class="net.i2p.router.web.UpdateHandler" id="update" scope="request" />
<jsp:setProperty name="update" property="*" />
<jsp:setProperty name="update" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
// moved to java for ease of translation
helper.renderSummaryBar();
%>

View File

@ -11,4 +11,11 @@
%> %>
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="intl" scope="request" /> <jsp:useBean class="net.i2p.router.web.CSSHelper" id="intl" scope="request" />
<jsp:setProperty name="intl" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" /> <jsp:setProperty name="intl" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" />
<jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
%>
<jsp:setProperty name="newshelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
<%@include file="xhr1.jsi" %> <%@include file="xhr1.jsi" %>

View File

@ -170,6 +170,10 @@ div.routersummary h4 {
line-height: 100%; line-height: 100%;
} }
div.routersummary ul {
text-align: left !important;
}
div.routersummary table { div.routersummary table {
border: 0; border: 0;
text-align: center !important; text-align: center !important;
@ -227,6 +231,11 @@ div routersummary hr:last-child {
margin-bottom: -5px !important; margin-bottom: -5px !important;
} }
div.newsheadings {
text-align: right;
margin: 0 0 0 10px;
}
div.tunnels { div.tunnels {
padding-top: 3px !important; padding-top: 3px !important;
margin-left: -4px; margin-left: -4px;