diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java
index e2f0d4104e..8eba139956 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java
@@ -154,9 +154,23 @@ class SybilRenderer {
StringBuilder buf = new StringBuilder(4*1024);
buf.append("
This is an experimental network database tool for debugging and analysis. Do not panic even if you see warnings below. " +
"Possible \"threats\" are summarized at the bottom, however these are unlikely to be real threats. " +
- "If you see anything you would like to discuss with the devs, contact us on IRC #i2p-dev.
");
+ "If you see anything you would like to discuss with the devs, contact us on IRC #i2p-dev." +
+ "");
+
renderRouterInfo(buf, _context.router().getRouterInfo(), null, true, false);
- buf.append("Known Floodfills: ").append(ris.size()).append("
");
+ buf.append("Known Floodfills: ").append(ris.size()).append("
");
double tot = 0;
int count = 200;
@@ -188,17 +202,18 @@ class SybilRenderer {
renderPairDistance(out, buf, ris, points);
// Distance to our router analysis
- buf.append("Closest Floodfills to Our Routing Key (Where we Store our RI)
");
+ buf.append("Closest Floodfills to Our Routing Key (Where we Store our RI)
");
renderRouterInfoHTML(out, buf, ourRKey, avgMinDist, ris, points);
RouterKeyGenerator rkgen = _context.routerKeyGenerator();
Hash nkey = rkgen.getNextRoutingKey(us);
- buf.append("Closest Floodfills to Tomorrow's Routing Key (Where we will Store our RI)
");
+ buf.append("Closest Floodfills to Tomorrow's Routing Key (Where we will Store our RI)
");
renderRouterInfoHTML(out, buf, nkey, avgMinDist, ris, points);
- buf.append("Closest Floodfills to Our Router Hash (DHT Neighbors if we are Floodfill)
");
+ buf.append("Closest Floodfills to Our Router Hash (DHT Neighbors if we are Floodfill)
");
renderRouterInfoHTML(out, buf, us, avgMinDist, ris, points);
// Distance to our published destinations analysis
+ buf.append("Floodfills Close to Our Destinations
");
Map clientInboundPools = _context.tunnelManager().getInboundClientPools();
List destinations = new ArrayList(clientInboundPools.keySet());
boolean debug = _context.getBooleanProperty(HelperBase.PROP_ADVANCED);
@@ -227,7 +242,7 @@ class SybilRenderer {
if (!points.isEmpty()) {
List warns = new ArrayList(points.keySet());
Collections.sort(warns, new PointsComparator(points));
- buf.append("Routers with Most Threat Points
");
+ buf.append("Routers with Most Threat Points
");
for (Hash h : warns) {
RouterInfo ri = _context.netDb().lookupRouterInfoLocally(h);
if (h == null)
@@ -286,7 +301,7 @@ class SybilRenderer {
double avg = total / (sz * sz / 2);
buf.append("Average Floodfill Distance is ").append(fmt.format(avg)).append("
");
- buf.append("Closest Floodfill Pairs by Hash
");
+ buf.append("Closest Floodfill Pairs by Hash
");
for (Pair p : pairs) {
double distance = biLog2(p.dist);
double point = MIN_CLOSE - distance;
@@ -363,7 +378,7 @@ class SybilRenderer {
byte[] ourIP = getIP(us);
if (ourIP == null)
return;
- buf.append("Floodfills close to Our IP
");
+ buf.append("Floodfills close to Our IP
");
boolean found = false;
for (RouterInfo info : ris) {
byte[] ip = getIP(info);
@@ -396,7 +411,7 @@ class SybilRenderer {
}
private void renderIPGroups32(Writer out, StringBuilder buf, List ris, Map points) throws IOException {
- buf.append("Floodfills with the Same IP
");
+ buf.append("Floodfills with the Same IP
");
ObjectCounter oc = new ObjectCounter();
for (RouterInfo info : ris) {
byte[] ip = getIP(info);
@@ -449,7 +464,7 @@ class SybilRenderer {
}
private void renderIPGroups24(Writer out, StringBuilder buf, List ris, Map points) throws IOException {
- buf.append("Floodfills in the Same /24 (2 minimum)
");
+ buf.append("Floodfills in the Same /24 (2 minimum)
");
ObjectCounter oc = new ObjectCounter();
for (RouterInfo info : ris) {
byte[] ip = getIP(info);
@@ -498,7 +513,7 @@ class SybilRenderer {
}
private void renderIPGroups16(Writer out, StringBuilder buf, List ris, Map points) throws IOException {
- buf.append("Floodfills in the Same /16 (4 minimum)
");
+ buf.append("Floodfills in the Same /16 (4 minimum)
");
ObjectCounter oc = new ObjectCounter();
for (RouterInfo info : ris) {
byte[] ip = getIP(info);
@@ -594,9 +609,9 @@ class SybilRenderer {
long heard = prof.getFirstHeardAbout();
if (heard > 0) {
long age = Math.max(now - heard, 1);
- if (age < DAY) {
- // .125 point for every hour under 24, max 3 points
- double point = Math.min(3.0d, (DAY - age) / (DAY / 3.0d));
+ if (age < 2 * DAY) {
+ // .125 point for every hour under 48, max 6 points
+ double point = Math.min(6.0d, (2 * DAY - age) / (2 * DAY / 6.0d));
addPoints(points, h, point,
"First heard about: " + _t("{0} ago", DataHelper.formatDuration2(age)));
}