Author: toad
Date: 2006-03-16 01:23:06 +0000 (Thu, 16 Mar 2006)
New Revision: 8260
Added:
trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
Modified:
trunk/freenet/src/freenet/clients/http/FproxyToadlet.java
trunk/freenet/src/freenet/clients/http/PageMaker.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/PeerNode.java
trunk/freenet/src/freenet/node/Version.java
Log:
540:
Darknet connections page.
Doesn't support adding or removing nodes yet.
Added: trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2006-03-15 22:13:17 UTC (rev 8259)
+++ trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2006-03-16 01:23:06 UTC (rev 8260)
@@ -0,0 +1,127 @@
+package freenet.clients.http;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Comparator;
+
+import freenet.client.HighLevelSimpleClient;
+import freenet.node.Node;
+import freenet.node.PeerNode;
+import freenet.node.Version;
+import freenet.pluginmanager.HTTPRequest;
+import freenet.support.HTMLEncoder;
+
+public class DarknetConnectionsToadlet extends Toadlet {
+
+ public class MyComparator implements Comparator {
+
+ public int compare(Object arg0, Object arg1) {
+ Object[] row0 = (Object[])arg0;
+ Object[] row1 = (Object[])arg1;
+ Integer stat0 = (Integer) row0[0];
+ Integer stat1 = (Integer) row1[0];
+ int x = stat0.compareTo(stat1);
+ if(x != 0) return x;
+ String name0 = (String) row0[1];
+ String name1 = (String) row1[1];
+ return
name0.toLowerCase().compareTo(name1.toLowerCase());
+ }
+
+ }
+
+ Node node;
+
+ protected DarknetConnectionsToadlet(Node n, HighLevelSimpleClient
client, CSSNameCallback cb) {
+ super(client, cb);
+ this.node = n;
+ }
+
+ public String supportedMethods() {
+ return "GET, POST";
+ }
+
+ public void handleGet(URI uri, ToadletContext ctx) throws
ToadletContextClosedException, IOException, RedirectException {
+ StringBuffer buf = new StringBuffer();
+
+ HTTPRequest request = new HTTPRequest(uri);
+ ctx.getPageMaker().makeHead(buf, "Darknet Connections",
getCSSName());
+ buf.append("<h1 class=\"title\">Darknet Connections</h1>\n");
+ // FIXME! 1) Probably would be better to use CSS
+ // FIXME! 2) We need some nice images
+ PeerNode[] peerNodes = node.getDarknetConnections();
+
+ long now = System.currentTimeMillis();
+
+ buf.append("<table border=\"0\">\n");
+
buf.append("<tr><th>Status</th><th>Name</th><th>Address</th><th>Version</th><th>Location</th><th>Backoff</th><th>Backoff
length</th></tr>\n");
+
+ final Integer CONNECTED = new Integer(0);
+ final Integer BACKED_OFF = new Integer(1);
+ final Integer INCOMPATIBLE = new Integer(2);
+ final Integer DISCONNECTED = new Integer(3);
+
+ // Create array
+ Object[][] rows = new Object[peerNodes.length][];
+ for(int i=0;i<peerNodes.length;i++) {
+ PeerNode pn = peerNodes[i];
+ long backedOffUntil = pn.getBackedOffUntil();
+ int backoffLength = pn.getBackoffLength();
+ boolean backedOffNow = (now < backedOffUntil);
+
+ Object[] row = new Object[7];
+ rows[i] = row;
+
+ Object status;
+ if(pn.isConnected()) {
+ status = CONNECTED;
+ if(backedOffNow) {
+ status = BACKED_OFF;
+ }
+ } else if(pn.hasCompletedHandshake() &&
!Version.checkGoodVersion(pn.getVersion())) {
+ status = INCOMPATIBLE;
+ } else {
+ status = DISCONNECTED;
+ }
+
+ row[0] = status;
+ row[1] = HTMLEncoder.encode(pn.getName());
+ row[2] = pn.getDetectedPeer().toString();
+ row[3] = pn.getVersion();
+ row[4] = new Double(pn.getLocation().getValue());
+ row[5] = new Long(Math.max(backedOffUntil - now, 0));
+ row[6] = new Long(backoffLength);
+ }
+
+ // Sort array
+ Arrays.sort(rows, new MyComparator());
+
+ // Convert status codes into status strings
+ for(int i=0;i<rows.length;i++) {
+ Object[] row = rows[i];
+ Integer x = (Integer) row[0];
+ if(x == CONNECTED) row[0] = "<font
color=\"green\">CONNECTED</font>";
+ else if(x == BACKED_OFF) row[0] = "<font
color=\"red\">BACKED OFF</font>";
+ else if(x == INCOMPATIBLE) row[0] = "<font
color=\"blue\">INCOMPATIBLE</font>";
+ else if(x == DISCONNECTED) row[0] = "<font
color=\"black\">DISCONNECTED</font>";
+ }
+
+ // Turn array into HTML
+ for(int i=0;i<rows.length;i++) {
+ Object[] row = rows[i];
+ buf.append("<tr><td>");
+ for(int j=0;j<row.length;j++) {
+ buf.append(row[j]);
+ if(j != row.length-1)
+ buf.append("</td><td>");
+ }
+ buf.append("</td></tr>");
+ }
+ buf.append("</table>");
+
+ ctx.getPageMaker().makeTail(buf);
+
+ this.writeReply(ctx, 200, "text/html", "OK", buf.toString());
+ }
+
+}
Modified: trunk/freenet/src/freenet/clients/http/FproxyToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/FproxyToadlet.java 2006-03-15
22:13:17 UTC (rev 8259)
+++ trunk/freenet/src/freenet/clients/http/FproxyToadlet.java 2006-03-16
01:23:06 UTC (rev 8260)
@@ -148,6 +148,9 @@
SymlinkerToadlet symlinkToadlet = new
SymlinkerToadlet(client, server, node);
server.register(symlinkToadlet, "/sl/", true);
+
+ DarknetConnectionsToadlet darknetToadlet = new
DarknetConnectionsToadlet(node, client, server);
+ server.register(darknetToadlet, "/darknet/", true);
} catch (IOException ioe) {
Logger.error(node,"Failed to start fproxy on
"+fproxyConfig.getString("bindTo")+":"+fproxyConfig.getInt("port"));
Modified: trunk/freenet/src/freenet/clients/http/PageMaker.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/PageMaker.java 2006-03-15
22:13:17 UTC (rev 8259)
+++ trunk/freenet/src/freenet/clients/http/PageMaker.java 2006-03-16
01:23:06 UTC (rev 8260)
@@ -81,6 +81,7 @@
+ "<li><a href=\"/\"
title=\"Homepage\">Home</a></li>\n"
+ "<li><a href=\"/plugins/\" title=\"Configure
Plugins\">Plugins</a></li>\n"
+ "<li><a href=\"/config/\" title=\"Configure
your node\">Configuration</a></li>\n"
+ + "<li><a href=\"/darknet/\" title=\"Manage
darknet connections\">Darknet</a></li>\n"
+ "</ul>\n"
+ "</div>\n");
}
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2006-03-15 22:13:17 UTC (rev
8259)
+++ trunk/freenet/src/freenet/node/Node.java 2006-03-16 01:23:06 UTC (rev
8260)
@@ -2106,4 +2106,8 @@
public void setDirectTMCI(TextModeClientInterface i) {
this.directTMCI = i;
}
+
+ public PeerNode[] getDarknetConnections() {
+ return peers.myPeers;
+ }
}
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2006-03-15 22:13:17 UTC
(rev 8259)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2006-03-16 01:23:06 UTC
(rev 8260)
@@ -48,6 +48,9 @@
*/
public class PeerNode implements PeerContext {
+ /** Set to true when we complete a handshake. */
+ private boolean completedHandshake = false;
+
private String lastGoodVersion;
/** For debugging/testing, set this to true to stop the
@@ -673,6 +676,7 @@
* @return True unless we rejected the handshake, or it failed to parse.
*/
public synchronized boolean completedHandshake(long thisBootID, byte[]
data, int offset, int length, BlockCipher encCipher, byte[] encKey, Peer
replyTo, boolean unverified) {
+ completedHandshake = true;
bogusNoderef = false;
try {
// First, the new noderef
@@ -1185,5 +1189,21 @@
public Peer getRemoteDetectedPeer() {
return remoteDetectedPeer;
}
+
+ public String getName() {
+ return myName;
+ }
+
+ public int getBackoffLength() {
+ return this.backoffLength;
+ }
+
+ public long getBackedOffUntil() {
+ return backedOffUntil;
+ }
+
+ public boolean hasCompletedHandshake() {
+ return completedHandshake;
+ }
}
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-03-15 22:13:17 UTC (rev
8259)
+++ trunk/freenet/src/freenet/node/Version.java 2006-03-16 01:23:06 UTC (rev
8260)
@@ -20,7 +20,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 539;
+ private static final int buildNumber = 540;
/** Oldest build of Fred we will talk to */
private static final int lastGoodBuild = 507;