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;


Reply via email to