Author: toad
Date: 2007-11-20 19:02:11 +0000 (Tue, 20 Nov 2007)
New Revision: 15879

Added:
   trunk/freenet/src/freenet/clients/http/ConnectivityToadlet.java
Modified:
   trunk/freenet/src/freenet/clients/http/FProxyToadlet.java
   trunk/freenet/src/freenet/io/AddressTracker.java
   trunk/freenet/src/freenet/io/AddressTrackerItem.java
   trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java
   trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
   trunk/freenet/src/freenet/node/Node.java
Log:
Beginnings of Connectivity Toadlet.
Eventually this will have the NAT status warnings etc.
For now it's just a dump of the AddressTracker for each node.

Added: trunk/freenet/src/freenet/clients/http/ConnectivityToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/ConnectivityToadlet.java             
                (rev 0)
+++ trunk/freenet/src/freenet/clients/http/ConnectivityToadlet.java     
2007-11-20 19:02:11 UTC (rev 15879)
@@ -0,0 +1,109 @@
+/* Copyright 2007 Freenet Project Inc.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+package freenet.clients.http;
+
+import java.io.IOException;
+import java.net.URI;
+
+import freenet.client.HighLevelSimpleClient;
+import freenet.io.AddressTracker;
+import freenet.io.PeerAddressTrackerItem;
+import freenet.io.comm.UdpSocketHandler;
+import freenet.l10n.L10n;
+import freenet.node.Node;
+import freenet.node.NodeClientCore;
+import freenet.support.HTMLNode;
+import freenet.support.TimeUtil;
+import freenet.support.api.HTTPRequest;
+
+/**
+ * Toadlet displaying information on the node's connectivity status.
+ * Eventually this will include all information gathered by the node on its
+ * connectivity from plugins, local IP detection, packet monitoring etc.
+ * For the moment it's just a dump of the AddressTracker.
+ * @author toad
+ */
+public class ConnectivityToadlet extends Toadlet {
+       
+       private final Node node;
+       private final NodeClientCore core;
+
+       protected ConnectivityToadlet(HighLevelSimpleClient client, Node node, 
NodeClientCore core) {
+               super(client);
+               this.node = node;
+               this.core = core;
+       }
+
+       public String supportedMethods() {
+               return "GET";
+       }
+
+       public void handleGet(URI uri, final HTTPRequest request, 
ToadletContext ctx) throws ToadletContextClosedException, IOException {
+               PageMaker pageMaker = ctx.getPageMaker();
+               
+               HTMLNode pageNode = 
pageMaker.getPageNode(L10n.getString("ConnectivityToadlet.title", new String[]{ 
"nodeName" }, new String[]{ core.getMyName() }), ctx);
+               HTMLNode contentNode = pageMaker.getContentNode(pageNode);
+
+               /* add alert summary box */
+               if(ctx.isAllowedFullAccess())
+                       contentNode.addChild(core.alerts.createSummary());
+
+               // One box per port
+               
+               UdpSocketHandler[] handlers = node.getPacketSocketHandlers();
+               
+               String noreply = l10n("noreply");
+               String local = l10n("local");
+               String remote = l10n("remote");
+               
+               for(int i=0;i<handlers.length;i++) {
+                       HTMLNode portsBox = 
pageMaker.getInfobox(L10n.getString("ConnectivityToadlet.byPortTitle", "port", 
handlers[i].getName()));
+                       contentNode.addChild(portsBox);
+                       HTMLNode portsContent = 
pageMaker.getContentNode(portsBox);
+                       AddressTracker tracker = 
handlers[i].getAddressTracker();
+                       PeerAddressTrackerItem[] items = 
tracker.getPeerAddressTrackerItems();
+                       HTMLNode table = portsContent.addChild("table");
+                       HTMLNode row = table.addChild("tr");
+                       row.addChild("th", l10n("addressTitle"));
+                       row.addChild("th", l10n("sentReceivedTitle"));
+                       row.addChild("th", l10n("localRemoteTitle"));
+                       row.addChild("th", l10n("firstSendLeadTime"));
+                       row.addChild("th", l10n("firstReceiveLeadTime"));
+                       for(int j=0;j<items.length;j++) {
+                               row = table.addChild("tr");
+                               PeerAddressTrackerItem item = items[j];
+                               // Address
+                               row.addChild("td", item.peer.toString());
+                               // Sent/received packets
+                               row.addChild("td", item.packetsSent() + "/ " + 
item.packetsReceived());
+                               // Initiator: local/remote FIXME something more 
graphical e.g. colored cells
+                               row.addChild("td", item.packetsReceived() == 0 
? noreply :
+                                               (item.weSentFirst() ? local : 
remote));
+                               // Lead in time to first packet sent
+                               row.addChild("td", 
TimeUtil.formatTime(item.timeFromStartupToFirstSentPacket()));
+                               // Lead in time to first packet received
+                               row.addChild("td", 
TimeUtil.formatTime(item.timeFromStartupToFirstReceivedPacket()));
+                       }
+                       // FIXME IP addresses too
+               }
+               
+               writeHTMLReply(ctx, 200, "OK", pageNode.generate());
+       }
+       
+       private String l10n(String key) {
+               return L10n.getString("ConnectivityToadlet."+key);
+       }
+}

Modified: trunk/freenet/src/freenet/clients/http/FProxyToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/FProxyToadlet.java   2007-11-20 
18:24:14 UTC (rev 15878)
+++ trunk/freenet/src/freenet/clients/http/FProxyToadlet.java   2007-11-20 
19:02:11 UTC (rev 15879)
@@ -628,6 +628,9 @@
                        BrowserTestToadlet browsertTestToadlet = new 
BrowserTestToadlet(client, core);
                        server.register(browsertTestToadlet, "/test/", true, 
false);

+                       ConnectivityToadlet connectivityToadlet = new 
ConnectivityToadlet(client, node, core);
+                       server.register(connectivityToadlet, "/connectivity/", 
true, "ConnectivityToadlet.connectivityTitle", 
"ConnectivityToadlet.connectivity", true, null);
+                       
                        TranslationToadlet translationToadlet = new 
TranslationToadlet(client, core);
                        server.register(translationToadlet, 
TranslationToadlet.TOADLET_URL, true, true);


Modified: trunk/freenet/src/freenet/io/AddressTracker.java
===================================================================
--- trunk/freenet/src/freenet/io/AddressTracker.java    2007-11-20 18:24:14 UTC 
(rev 15878)
+++ trunk/freenet/src/freenet/io/AddressTracker.java    2007-11-20 19:02:11 UTC 
(rev 15879)
@@ -100,4 +100,9 @@
        public synchronized void startSend(long now) {
                timeDefinitelyNoPacketsSent = now;
        }
+
+       public synchronized PeerAddressTrackerItem[] 
getPeerAddressTrackerItems() {
+               PeerAddressTrackerItem[] items = new 
PeerAddressTrackerItem[peerTrackers.size()];
+               return (PeerAddressTrackerItem[]) 
peerTrackers.values().toArray(items);
+       }
 }

Modified: trunk/freenet/src/freenet/io/AddressTrackerItem.java
===================================================================
--- trunk/freenet/src/freenet/io/AddressTrackerItem.java        2007-11-20 
18:24:14 UTC (rev 15878)
+++ trunk/freenet/src/freenet/io/AddressTrackerItem.java        2007-11-20 
19:02:11 UTC (rev 15879)
@@ -100,4 +100,21 @@
        public synchronized long packetsReceived() {
                return packetsReceived;
        }
+       
+       public synchronized boolean weSentFirst() {
+               if(timeFirstReceivedPacket == -1) return true;
+               if(timeFirstSentPacket == -1) return false;
+               return timeFirstSentPacket < timeFirstReceivedPacket; 
+       }
+       
+       public long timeFromStartupToFirstSentPacket() {
+               if(packetsSent == 0) return -1;
+               return timeFirstSentPacket - timeDefinitelyNoPacketsSent;
+       }
+
+       public long timeFromStartupToFirstReceivedPacket() {
+               if(packetsReceived == 0) return -1;
+               return timeFirstReceivedPacket - 
timeDefinitelyNoPacketsReceived;
+       }
+
 }

Modified: trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java     2007-11-20 
18:24:14 UTC (rev 15878)
+++ trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java     2007-11-20 
19:02:11 UTC (rev 15879)
@@ -384,4 +384,8 @@
                return UDP_HEADERS_LENGTH;
        }

+       public AddressTracker getAddressTracker() {
+               return tracker;
+       }
+
 }

Modified: trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
===================================================================
--- trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties   2007-11-20 
18:24:14 UTC (rev 15878)
+++ trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties   2007-11-20 
19:02:11 UTC (rev 15879)
@@ -86,6 +86,18 @@
 ConfigToadlet.true=true
 ConfigurablePersister.doesNotExistCannotCreate=File does not exist and cannot 
be created
 ConfigurablePersister.existsCannotReadWrite=File exists and cannot read/write 
it
+ConnectivityToadlet.title=Internet connectivity for ${nodeName}
+ConnectivityToadlet.connectivity=Internet Connectivity
+ConnectivityToadlet.connectivityTitle=Connectivity
+ConnectivityToadlet.firstSendLeadTime=Startup to first send
+ConnectivityToadlet.firstReceiveLeadTime=Online to first receive
+ConnectivityToadlet.localRemoteTitle=Local/remote
+ConnectivityToadlet.addressTitle=Address
+ConnectivityToadlet.sentReceivedTitle=Sent/received packets
+ConnectivityToadlet.byPortTitle=Packets for ${port}
+ConnectivityToadlet.local=LOCAL
+ConnectivityToadlet.remote=REMOTE
+ConnectivityToadlet.noreply=NO REPLY
 ConnectionsToadlet.nodeStatus.CONNECTED=CONNECTED
 ConnectionsToadlet.nodeStatus.BACKED OFF=BACKEDOFF
 ConnectionsToadlet.nodeStatus.TOO NEW=TOO NEW

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2007-11-20 18:24:14 UTC (rev 
15878)
+++ trunk/freenet/src/freenet/node/Node.java    2007-11-20 19:02:11 UTC (rev 
15879)
@@ -58,6 +58,7 @@
 import freenet.io.comm.Peer;
 import freenet.io.comm.PeerParseException;
 import freenet.io.comm.ReferenceSignatureVerificationException;
+import freenet.io.comm.UdpSocketHandler;
 import freenet.io.xfer.PartiallyReceivedBlock;
 import freenet.keys.CHKBlock;
 import freenet.keys.CHKVerifyException;
@@ -2759,4 +2760,14 @@
             // Give it a chance to be GCed
             startupPageHolder = null;
         }
+
+               public synchronized UdpSocketHandler[] 
getPacketSocketHandlers() {
+                       // FIXME better way to get these!
+                       if(opennet != null) {
+                               return new UdpSocketHandler[] { 
darknetCrypto.socket, opennet.crypto.socket };
+                               // TODO Auto-generated method stub
+                       } else {
+                               return new UdpSocketHandler[] { 
darknetCrypto.socket };
+                       }
+               }
 }


Reply via email to