diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHandler.java new file mode 100644 index 000000000..68f46d204 --- /dev/null +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHandler.java @@ -0,0 +1,80 @@ +package net.i2p.router.web; + +import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; +import net.i2p.data.Hash; +import net.i2p.data.Base64; +import net.i2p.router.Router; +import net.i2p.router.peermanager.PeerProfile; +import net.i2p.util.Log; + +/** + * + */ +public class ConfigPeerHandler extends FormHandler { + private String _peer; + private String _speed; + private String _capacity; + + protected void processForm() { + if ("Save Configuration".equals(_action)) { + _context.router().saveConfig(); + addFormNotice("Settings saved - not really!!!!!"); + } else if (_action.startsWith("Shitlist")) { + Hash h = getHash(); + if (h != null) { + _context.shitlist().shitlistRouterForever(h, "Manually shitlisted via configpeer.jsp"); + addFormNotice("Peer " + _peer + " shitlisted forever"); + return; + } + addFormError("Invalid peer"); + } else if (_action.startsWith("Unshitlist")) { + Hash h = getHash(); + if (h != null) { + if (_context.shitlist().isShitlisted(h)) { + _context.shitlist().unshitlistRouter(h); + addFormNotice("Peer " + _peer + " unshitlisted"); + } else + addFormNotice("Peer " + _peer + " is not currently shitlisted"); + return; + } + addFormError("Invalid peer"); + } else if (_action.startsWith("Adjust")) { + Hash h = getHash(); + if (h != null) { + PeerProfile prof = _context.profileOrganizer().getProfile(h); + if (prof != null) { + try { + prof.setSpeedBonus(Long.parseLong(_speed)); + } catch (NumberFormatException nfe) { + addFormError("Bad speed value"); + } + try { + prof.setCapacityBonus(Long.parseLong(_capacity)); + } catch (NumberFormatException nfe) { + addFormError("Bad capacity value"); + } + addFormNotice("Bonuses adjusted for " + _peer); + } else + addFormError("No profile exists for " + _peer); + return; + } + addFormError("Invalid peer"); + } else if (_action.startsWith("Check")) { + addFormError("Unsupported"); + } + } + + private Hash getHash() { + if (_peer != null && _peer.length() == 44) { + byte[] b = Base64.decode(_peer); + if (b != null) + return new Hash(b); + } + return null; + } + + public void setPeer(String peer) { _peer = peer; } + public void setSpeed(String bonus) { _speed = bonus; } + public void setCapacity(String bonus) { _capacity = bonus; } +} diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHelper.java new file mode 100644 index 000000000..647aaa3df --- /dev/null +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHelper.java @@ -0,0 +1,24 @@ +package net.i2p.router.web; + +import net.i2p.data.DataHelper; +import net.i2p.router.RouterContext; + +public class ConfigPeerHelper { + private RouterContext _context; + /** + * Configure this bean to query a particular router context + * + * @param contextId begging few characters of the routerHash, or null to pick + * the first one we come across. + */ + public void setContextId(String contextId) { + try { + _context = ContextHelper.getContext(contextId); + } catch (Throwable t) { + t.printStackTrace(); + } + } + + public ConfigPeerHelper() {} + +} diff --git a/apps/routerconsole/jsp/confignav.jsp b/apps/routerconsole/jsp/confignav.jsp index 7ab47f76b..b6a5ce6df 100644 --- a/apps/routerconsole/jsp/confignav.jsp +++ b/apps/routerconsole/jsp/confignav.jsp @@ -8,6 +8,8 @@ %>Tunnels | <% } else { %>Tunnels | <% } if (request.getRequestURI().indexOf("configclients.jsp") != -1) { %>Clients | <% } else { %>Clients | <% } + if (request.getRequestURI().indexOf("configpeer.jsp") != -1) { + %>Peers | <% } else { %>Peers | <% } if (request.getRequestURI().indexOf("configlogging.jsp") != -1) { %>Logging | <% } else { %>Logging | <% } if (request.getRequestURI().indexOf("configstats.jsp") != -1) { diff --git a/apps/routerconsole/jsp/configpeer.jsp b/apps/routerconsole/jsp/configpeer.jsp new file mode 100644 index 000000000..16e624e5f --- /dev/null +++ b/apps/routerconsole/jsp/configpeer.jsp @@ -0,0 +1,83 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + + + +I2P Router Console - config peers + + + +<%@include file="nav.jsp" %> +<%@include file="summary.jsp" %> + +
+ <%@include file="confignav.jsp" %> + + + + " /> + + + + + + + " /> + + <% String peer = ""; + if (request.getParameter("peer") != null) + peer = request.getParameter("peer"); + %> + +
+ <% String prev = System.getProperty("net.i2p.router.web.ConfigPeerHandler.nonce"); + if (prev != null) System.setProperty("net.i2p.router.web.ConfigPeerHandler.noncePrev", prev); + System.setProperty("net.i2p.router.web.ConfigPeerHandler.nonce", new java.util.Random().nextLong()+""); %> + " /> +
+

+ + + +

Manual Peer Controls

+ Router Hash: + +

Manually Shitlist / Unshitlist a Router

+ Shitlisting will prevent the participation of this peer in tunnels you create. +

+ + + <% if (! "".equals(peer)) { %> + <---- click to verify action + <% } %> +

+ +

Adjust Profile Bonuses

+ 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 Capacity peers are used for some exploratory tunnels. + Current bonuses are displayed on the profiles page. +

+ <% long speed = 0; long capacity = 0; + if (! "".equals(peer)) { + // get existing bonus values? + } + %> + Speed: + + Capacity: + + +

+
+ +
+ + + " /> + + + +
+ + + diff --git a/router/java/src/net/i2p/router/Shitlist.java b/router/java/src/net/i2p/router/Shitlist.java index 09a3562fd..1a47a94be 100644 --- a/router/java/src/net/i2p/router/Shitlist.java +++ b/router/java/src/net/i2p/router/Shitlist.java @@ -289,8 +289,7 @@ public class Shitlist { buf.append("
\n"); buf.append(entry.cause); } - // future - // buf.append(" (unshitlist now)"); + buf.append(" (unshitlist now)"); buf.append("\n"); } buf.append("\n"); diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java index 38590570d..eb29b374e 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java +++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java @@ -130,11 +130,25 @@ class ProfileOrganizerRenderer { } buf.append("").append(num(prof.getSpeedValue())); - //buf.append('/').append(num(prof.getOldSpeedValue())); - buf.append(""); - buf.append("").append(num(prof.getCapacityValue())).append(""); - buf.append("").append(num(prof.getIntegrationValue())).append(""); - buf.append(""); + long bonus = prof.getSpeedBonus(); + if (bonus != 0) { + if (bonus > 0) + buf.append(" (+"); + else + buf.append(" ("); + buf.append(bonus).append(')'); + } + buf.append("").append(num(prof.getCapacityValue())); + bonus = prof.getCapacityBonus(); + if (bonus != 0) { + if (bonus > 0) + buf.append(" (+"); + else + buf.append(" ("); + buf.append(bonus).append(')'); + } + buf.append("").append(num(prof.getIntegrationValue())); + buf.append(""); if (_context.shitlist().isShitlisted(peer)) buf.append("Shitlist"); if (prof.getIsFailing()) buf.append(" Failing"); if (_context.commSystem().wasUnreachable(peer)) buf.append(" Unreachable"); @@ -150,7 +164,8 @@ class ProfileOrganizerRenderer { //buf.append("profile.txt "); //buf.append(" netDb"); buf.append("netDb"); - buf.append("/profile\n"); + buf.append("/profile"); + buf.append("/+-\n"); buf.append(""); } buf.append("");