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 0000000000000000000000000000000000000000..68f46d204c62400dfb8d927643e878491ca55e6a --- /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 <a href=\"configpeer.jsp\">configpeer.jsp</a>"); + 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 0000000000000000000000000000000000000000..647aaa3df7827218e710fe6e2e8e93634d9bb04d --- /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 7ab47f76be1956ccd754f6c1281e9fe5c37eefc7..b6a5ce6df3b5b317799bfa69dc7ef542a0f97bd9 100644 --- a/apps/routerconsole/jsp/confignav.jsp +++ b/apps/routerconsole/jsp/confignav.jsp @@ -8,6 +8,8 @@ %>Tunnels | <% } else { %><a href="configtunnels.jsp">Tunnels</a> | <% } if (request.getRequestURI().indexOf("configclients.jsp") != -1) { %>Clients | <% } else { %><a href="configclients.jsp">Clients</a> | <% } + if (request.getRequestURI().indexOf("configpeer.jsp") != -1) { + %>Peers | <% } else { %><a href="configpeer.jsp">Peers</a> | <% } if (request.getRequestURI().indexOf("configlogging.jsp") != -1) { %>Logging | <% } else { %><a href="configlogging.jsp">Logging</a> | <% } 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 0000000000000000000000000000000000000000..16e624e5f2e10c360da940756e4d0b8eb3ced0bf --- /dev/null +++ b/apps/routerconsole/jsp/configpeer.jsp @@ -0,0 +1,83 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> + +<html><head> +<title>I2P Router Console - config peers</title> +<link rel="stylesheet" href="default.css" type="text/css" /> +</head><body> + +<%@include file="nav.jsp" %> +<%@include file="summary.jsp" %> + +<div class="main" id="main"> + <%@include file="confignav.jsp" %> + + <jsp:useBean class="net.i2p.router.web.ConfigPeerHandler" id="formhandler" scope="request" /> + <jsp:setProperty name="formhandler" property="*" /> + <jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> + <font color="red"><jsp:getProperty name="formhandler" property="errors" /></font> + <i><jsp:getProperty name="formhandler" property="notices" /></i> + + + + <jsp:useBean class="net.i2p.router.web.ConfigPeerHelper" id="peerhelper" scope="request" /> + <jsp:setProperty name="peerhelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> + + <% String peer = ""; + if (request.getParameter("peer") != null) + peer = request.getParameter("peer"); + %> + + <form action="configpeer.jsp" method="POST"> + <% 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()+""); %> + <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigPeerHandler.nonce")%>" /> + <hr /> + <p> + <a name="sh"> </a> + <a name="unsh"> </a> + <a name="bonus"> </a> + <h2>Manual Peer Controls</h2> + Router Hash: + <input type="text" size="55" name="peer" value="<%=peer%>" /> + <h3>Manually Shitlist / Unshitlist a Router</h3> + Shitlisting will prevent the participation of this peer in tunnels you create. + <p> + <input type="submit" name="action" value="Shitlist peer until restart" /> + <input type="submit" name="action" value="Unshitlist peer" /> + <% if (! "".equals(peer)) { %> + <font color="blue"><---- click to verify action</font> + <% } %> + </p> + + <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 Capacity peers are used for some exploratory tunnels. + Current bonuses are displayed on the <a href="profiles.jsp">profiles page</a>. + <p> + <% long speed = 0; long capacity = 0; + if (! "".equals(peer)) { + // get existing bonus values? + } + %> + 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" /> + </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" /> + + +</div> + +</body> +</html> diff --git a/router/java/src/net/i2p/router/Shitlist.java b/router/java/src/net/i2p/router/Shitlist.java index 09a3562fd8bff4c20f4046c78f87523e324cf1bb..1a47a94be8a59306945deb488a9da59f50786751 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("<br />\n"); buf.append(entry.cause); } - // future - // buf.append(" (<a href=\"configblock.jsp?peer=").append(key.toBase64()).append("#unsh\">unshitlist now</a>)"); + buf.append(" (<a href=\"configpeer.jsp?peer=").append(key.toBase64()).append("#unsh\">unshitlist now</a>)"); buf.append("</li>\n"); } buf.append("</ul>\n"); diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java index 38590570d3d1baa828921d8193aa985cb4ba9613..eb29b374ea2c741e12c782d6c863b831403f1066 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("<td align=\"right\">").append(num(prof.getSpeedValue())); - //buf.append('/').append(num(prof.getOldSpeedValue())); - buf.append("</td>"); - buf.append("<td align=\"right\">").append(num(prof.getCapacityValue())).append("</td>"); - buf.append("<td align=\"right\">").append(num(prof.getIntegrationValue())).append("</td>"); - buf.append("<td>"); + long bonus = prof.getSpeedBonus(); + if (bonus != 0) { + if (bonus > 0) + buf.append(" (+"); + else + buf.append(" ("); + buf.append(bonus).append(')'); + } + buf.append("</td><td align=\"right\">").append(num(prof.getCapacityValue())); + bonus = prof.getCapacityBonus(); + if (bonus != 0) { + if (bonus > 0) + buf.append(" (+"); + else + buf.append(" ("); + buf.append(bonus).append(')'); + } + buf.append("</td><td align=\"right\">").append(num(prof.getIntegrationValue())); + buf.append("</td><td>"); 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("<td><a href=\"/profile/").append(prof.getPeer().toBase64().substring(0, 32)).append("\">profile.txt</a> "); //buf.append(" <a href=\"#").append(prof.getPeer().toBase64().substring(0, 32)).append("\">netDb</a></td>"); buf.append("<td nowrap><a href=\"netdb.jsp#").append(peer.toBase64().substring(0,6)).append("\">netDb</a>"); - buf.append("/<a href=\"dumpprofile.jsp?peer=").append(peer.toBase64().substring(0,6)).append("\">profile</a></td>\n"); + buf.append("/<a href=\"dumpprofile.jsp?peer=").append(peer.toBase64().substring(0,6)).append("\">profile</a>"); + buf.append("/<a href=\"configpeer.jsp?peer=").append(peer.toBase64()).append("\">+-</a></td>\n"); buf.append("</tr>"); } buf.append("</table>");