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 };
+ }
+ }
}