diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java index 41f0ad90c578a73f11976116e10dabc1f0d52493..114579a27c854690343ae8ba66bdb42e0552bc81 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java @@ -11,6 +11,7 @@ public class NetDbHelper { private RouterContext _context; private Writer _out; private String _routerPrefix; + private boolean _full = false; /** * Configure this bean to query a particular router context @@ -30,6 +31,7 @@ public class NetDbHelper { public void setWriter(Writer writer) { _out = writer; } public void setRouter(String r) { _routerPrefix = r; } + public void setFull(String f) { _full = "1".equals(f); }; public String getNetDbSummary() { try { @@ -37,14 +39,14 @@ public class NetDbHelper { if (_routerPrefix != null) _context.netDb().renderRouterInfoHTML(_out, _routerPrefix); else - _context.netDb().renderStatusHTML(_out); + _context.netDb().renderStatusHTML(_out, _full); return ""; } else { ByteArrayOutputStream baos = new ByteArrayOutputStream(32*1024); if (_routerPrefix != null) _context.netDb().renderRouterInfoHTML(new OutputStreamWriter(baos), _routerPrefix); else - _context.netDb().renderStatusHTML(new OutputStreamWriter(baos)); + _context.netDb().renderStatusHTML(new OutputStreamWriter(baos), _full); return new String(baos.toByteArray()); } } catch (IOException ioe) { diff --git a/apps/routerconsole/jsp/netdb.jsp b/apps/routerconsole/jsp/netdb.jsp index 89c2bdec20d5a954e4511bdd07fb69af0f42e7dd..08a1377d37ff35a188da0076466dc0cc95e9b519 100644 --- a/apps/routerconsole/jsp/netdb.jsp +++ b/apps/routerconsole/jsp/netdb.jsp @@ -14,6 +14,7 @@ <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%>" /> + <jsp:setProperty name="netdbHelper" property="full" value="<%=request.getParameter("f")%>" /> <jsp:setProperty name="netdbHelper" property="router" value="<%=request.getParameter("r")%>" /> <jsp:getProperty name="netdbHelper" property="netDbSummary" /> </div> diff --git a/router/java/src/net/i2p/router/NetworkDatabaseFacade.java b/router/java/src/net/i2p/router/NetworkDatabaseFacade.java index ed4fe155502df3ef50f7025ade8e5bc58e099fef..e4a5ce08b663a7da1c9fc9752104dc33875bae0a 100644 --- a/router/java/src/net/i2p/router/NetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/NetworkDatabaseFacade.java @@ -62,4 +62,5 @@ public abstract class NetworkDatabaseFacade implements Service { public int getKnownRouters() { return 0; } public int getKnownLeaseSets() { return 0; } public void renderRouterInfoHTML(Writer out, String s) throws IOException {} + public void renderStatusHTML(Writer out, boolean b) throws IOException {} } diff --git a/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java b/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java index 96dbadd6cf2472a6b95dd24c4a157ced36e88a58..8fa729d63763dae195aa1321c2895fa8595478ce 100644 --- a/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java +++ b/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java @@ -20,12 +20,12 @@ import net.i2p.router.RouterContext; import net.i2p.util.Log; /** - * Publish the local router's RouterInfo every 5 to 10 minutes + * Publish the local router's RouterInfo periodically * */ public class PublishLocalRouterInfoJob extends JobImpl { private Log _log; - final static long PUBLISH_DELAY = 5*60*1000; // every 5 to 10 minutes (since we randomize) + final static long PUBLISH_DELAY = 20*60*1000; public PublishLocalRouterInfoJob(RouterContext ctx) { super(ctx); @@ -67,6 +67,6 @@ public class PublishLocalRouterInfoJob extends JobImpl { } catch (DataFormatException dfe) { _log.error("Error signing the updated local router info!", dfe); } - requeue(PUBLISH_DELAY + getContext().random().nextInt((int)PUBLISH_DELAY)); + requeue((PUBLISH_DELAY/2) + getContext().random().nextInt((int)PUBLISH_DELAY)); } } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java index c74499f957e62a3031c992d8eac374047342484d..23ef78d86956961261ff24e9013978ee01a43bf4 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java @@ -125,6 +125,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { private final static long ROUTER_INFO_EXPIRATION_SHORT = 90*60*1000l; private final static long EXPLORE_JOB_DELAY = 10*60*1000l; + private final static long PUBLISH_JOB_DELAY = 5*60*1000l; public KademliaNetworkDatabaseFacade(RouterContext context) { _context = context; @@ -326,7 +327,9 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { } // periodically update and resign the router's 'published date', which basically // serves as a version - _context.jobQueue().addJob(new PublishLocalRouterInfoJob(_context)); + Job plrij = new PublishLocalRouterInfoJob(_context); + plrij.getTiming().setStartAfter(_context.clock().now() + PUBLISH_JOB_DELAY); + _context.jobQueue().addJob(plrij); try { publish(ri); } catch (IllegalArgumentException iae) { @@ -970,7 +973,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { StringBuffer buf = new StringBuffer(4*1024); buf.append("<h2>Network Database RouterInfo Lookup</h2>\n"); if (".".equals(routerPrefix)) { - renderRouterInfo(buf, _context.router().getRouterInfo(), true); + renderRouterInfo(buf, _context.router().getRouterInfo(), true, true); } else { boolean notFound = true; Set routers = getRouters(); @@ -978,7 +981,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { RouterInfo ri = (RouterInfo)iter.next(); Hash key = ri.getIdentity().getHash(); if (key.toBase64().startsWith(routerPrefix)) { - renderRouterInfo(buf, ri, false); + renderRouterInfo(buf, ri, false, true); notFound = false; } } @@ -990,7 +993,14 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { } public void renderStatusHTML(Writer out) throws IOException { - StringBuffer buf = new StringBuffer(getKnownRouters() * 2048); + renderStatusHTML(out, true); + } + + public void renderStatusHTML(Writer out, boolean full) throws IOException { + int size = getKnownRouters() * 512; + if (full) + size *= 4; + StringBuffer buf = new StringBuffer(size); buf.append("<h2>Network Database Contents</h2>\n"); if (!_initialized) { buf.append("<i>Not initialized</i>\n"); @@ -1044,10 +1054,15 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { } Hash us = _context.routerHash(); - out.write("<h3>Routers</h3>\n"); + out.write("<a name=\"routers\" /><h3>Routers (<a href=\"netdb.jsp"); + if (full) + out.write("#routers\" >view without"); + else + out.write("?f=1#routers\" >view with"); + out.write(" stats</a>)</h3>\n"); RouterInfo ourInfo = _context.router().getRouterInfo(); - renderRouterInfo(buf, ourInfo, true); + renderRouterInfo(buf, ourInfo, true, true); out.write(buf.toString()); buf.setLength(0); @@ -1061,7 +1076,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { Hash key = ri.getIdentity().getHash(); boolean isUs = key.equals(us); if (!isUs) { - renderRouterInfo(buf, ri, false); + renderRouterInfo(buf, ri, false, full); out.write(buf.toString()); buf.setLength(0); String coreVersion = ri.getOption("coreVersion"); @@ -1102,7 +1117,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { out.flush(); } - private void renderRouterInfo(StringBuffer buf, RouterInfo info, boolean isUs) { + private void renderRouterInfo(StringBuffer buf, RouterInfo info, boolean isUs, boolean full) { String hash = info.getIdentity().getHash().toBase64(); buf.append("<a name=\"").append(hash.substring(0, 6)).append("\" />"); if (isUs) { @@ -1129,13 +1144,18 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { } } buf.append("</i><br />\n"); - buf.append("Stats: <br /><i><code>\n"); - for (Iterator iter = info.getOptions().keySet().iterator(); iter.hasNext(); ) { - String key = (String)iter.next(); - String val = info.getOption(key); - buf.append(DataHelper.stripHTML(key)).append(" = ").append(DataHelper.stripHTML(val)).append("<br />\n"); + if (full) { + buf.append("Stats: <br /><i><code>\n"); + for (Iterator iter = info.getOptions().keySet().iterator(); iter.hasNext(); ) { + String key = (String)iter.next(); + String val = info.getOption(key); + buf.append(DataHelper.stripHTML(key)).append(" = ").append(DataHelper.stripHTML(val)).append("<br />\n"); + } + buf.append("</code></i>\n"); + } else { + buf.append("<a href=\"netdb.jsp?r=").append(hash.substring(0, 6)).append("\" >Full entry</a>\n"); } - buf.append("</code></i><hr />\n"); + buf.append("<hr />\n"); } } diff --git a/router/java/src/net/i2p/router/startup/RebuildRouterInfoJob.java b/router/java/src/net/i2p/router/startup/RebuildRouterInfoJob.java index a43fc631195dce3c82986f26a6e469959238247b..967bc7a797bc7e175261b4f6539e5af88e722d87 100644 --- a/router/java/src/net/i2p/router/startup/RebuildRouterInfoJob.java +++ b/router/java/src/net/i2p/router/startup/RebuildRouterInfoJob.java @@ -28,6 +28,13 @@ import net.i2p.router.RouterContext; import net.i2p.util.Log; /** + * This used be called from StartAcceptingClientsJob but is now disabled. + * It is still called once from LoadRouterInfoJob (but not run as a Job). + * + * The following comments appear to be incorrect... + * it rebuilds if the router.info file does not exist. + * There is no check for a router.info.rebuild file. + * * If the file router.info.rebuild exists, rebuild the router info and republish. * This is useful for dhcp or other situations where the router addresses change - * simply create the router.info.rebuild file after modifying router.config and within diff --git a/router/java/src/net/i2p/router/startup/StartAcceptingClientsJob.java b/router/java/src/net/i2p/router/startup/StartAcceptingClientsJob.java index 7ad54299fb9f00847b6db258e601fdad02edb5f2..727d06ac6c1cd3a4c05815bcdc553ba7ca4f20e2 100644 --- a/router/java/src/net/i2p/router/startup/StartAcceptingClientsJob.java +++ b/router/java/src/net/i2p/router/startup/StartAcceptingClientsJob.java @@ -28,7 +28,8 @@ public class StartAcceptingClientsJob extends JobImpl { getContext().clientManager().startup(); getContext().jobQueue().addJob(new ReadConfigJob(getContext())); - getContext().jobQueue().addJob(new RebuildRouterInfoJob(getContext())); + // pointless + //getContext().jobQueue().addJob(new RebuildRouterInfoJob(getContext())); getContext().jobQueue().allowParallelOperation(); } }