Author: toad
Date: 2007-12-04 18:14:40 +0000 (Tue, 04 Dec 2007)
New Revision: 16270
Added:
trunk/freenet/src/freenet/node/AnnouncementCallback.java
Modified:
trunk/freenet/src/freenet/node/AnnounceSender.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/OpennetManager.java
trunk/freenet/src/freenet/node/RequestHandler.java
trunk/freenet/src/freenet/node/RequestSender.java
trunk/freenet/src/freenet/node/TextModeClientInterface.java
Log:
Ability to start an announcement from TMCI.
Modified: trunk/freenet/src/freenet/node/AnnounceSender.java
===================================================================
--- trunk/freenet/src/freenet/node/AnnounceSender.java 2007-12-04 17:46:07 UTC
(rev 16269)
+++ trunk/freenet/src/freenet/node/AnnounceSender.java 2007-12-04 18:14:40 UTC
(rev 16270)
@@ -30,6 +30,7 @@
private double nearestLoc;
private double target;
private static boolean logMINOR;
+ private final AnnouncementCallback cb;
public AnnounceSender(Message m, long uid, PeerNode source,
OpennetManager om, Node node) {
this.source = source;
@@ -40,8 +41,21 @@
htl = m.getShort(DMT.HTL);
target = m.getDouble(DMT.TARGET_LOCATION); // FIXME validate
logMINOR = Logger.shouldLog(Logger.MINOR, this);
+ cb = null;
}
+ public AnnounceSender(double target, OpennetManager om, Node node,
AnnouncementCallback cb) {
+ source = null;
+ this.uid = node.random.nextLong();
+ msg = null;
+ this.om = om;
+ this.node = node;
+ this.htl = node.maxHTL();
+ this.target = target;
+ this.cb = cb;
+ logMINOR = Logger.shouldLog(Logger.MINOR, this);
+ }
+
public void run() {
try {
realRun();
@@ -55,12 +69,12 @@
private void realRun() {
boolean hasForwarded = false;
- try {
- source.sendAsync(DMT.createFNPAccepted(uid), null, 0,
null);
- } catch (NotConnectedException e) {
- return;
- }
if(source != null) {
+ try {
+ source.sendAsync(DMT.createFNPAccepted(uid),
null, 0, null);
+ } catch (NotConnectedException e) {
+ return;
+ }
if(!transferNoderef()) return;
}
@@ -259,15 +273,32 @@
}
SimpleFieldSet fs = om.validateNoderef(noderefBuf, 0,
noderefLength, source);
if(fs == null) {
- om.rejectRef(uid, source, DMT.NODEREF_REJECTED_INVALID,
this);
+ if(cb != null) cb.bogusNoderef("invalid noderef");
return true; // Don't relay
}
- // Now relay it
- try {
- om.sendAnnouncementReply(uid, source, noderefBuf, this);
- } catch (NotConnectedException e) {
- // Hmmm...!
- return false;
+ if(source != null) {
+ // Now relay it
+ try {
+ om.sendAnnouncementReply(uid, source,
noderefBuf, this);
+ } catch (NotConnectedException e) {
+ // Hmmm...!
+ return false;
+ }
+ } else {
+ // Add it
+ try {
+ OpennetPeerNode pn = node.addNewOpennetNode(fs);
+ cb.addedNode(pn);
+ } catch (FSParseException e) {
+ Logger.normal(this, "Failed to parse reply:
"+e, e);
+ if(cb != null) cb.bogusNoderef("parse failed:
"+e);
+ } catch (PeerParseException e) {
+ Logger.normal(this, "Failed to parse reply:
"+e, e);
+ if(cb != null) cb.bogusNoderef("parse failed:
"+e);
+ } catch (ReferenceSignatureVerificationException e) {
+ Logger.normal(this, "Failed to parse reply:
"+e, e);
+ if(cb != null) cb.bogusNoderef("parse failed:
"+e);
+ }
}
return true;
}
@@ -332,7 +363,7 @@
}
// If we want it, add it and send it.
try {
- if(om.addNewOpennetNode(fs)) {
+ if(om.addNewOpennetNode(fs) != null) {
sendOurRef();
} else {
// Okay, just route it.
Added: trunk/freenet/src/freenet/node/AnnouncementCallback.java
===================================================================
--- trunk/freenet/src/freenet/node/AnnouncementCallback.java
(rev 0)
+++ trunk/freenet/src/freenet/node/AnnouncementCallback.java 2007-12-04
18:14:40 UTC (rev 16270)
@@ -0,0 +1,12 @@
+package freenet.node;
+
+/**
+ * Callback for a local announcement.
+ */
+public interface AnnouncementCallback {
+
+ public void completed();
+ public void bogusNoderef(String reason);
+ public void addedNode(PeerNode pn);
+
+}
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2007-12-04 17:46:07 UTC (rev
16269)
+++ trunk/freenet/src/freenet/node/Node.java 2007-12-04 18:14:40 UTC (rev
16270)
@@ -2737,9 +2737,9 @@
return new OpennetPeerNode(fs, this, opennet.crypto, opennet, peers,
false, opennet.crypto.packetMangler);
}
- public boolean addNewOpennetNode(SimpleFieldSet fs) throws
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
+ public OpennetPeerNode addNewOpennetNode(SimpleFieldSet fs) throws
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
// FIXME: perhaps this should throw OpennetDisabledExcemption
rather than returing false?
- if(opennet == null) return false;
+ if(opennet == null) return null;
return opennet.addNewOpennetNode(fs);
}
Modified: trunk/freenet/src/freenet/node/OpennetManager.java
===================================================================
--- trunk/freenet/src/freenet/node/OpennetManager.java 2007-12-04 17:46:07 UTC
(rev 16269)
+++ trunk/freenet/src/freenet/node/OpennetManager.java 2007-12-04 18:14:40 UTC
(rev 16270)
@@ -211,17 +211,18 @@
node.peers.removeOpennetPeers();
}
- public boolean addNewOpennetNode(SimpleFieldSet fs) throws
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
+ public OpennetPeerNode addNewOpennetNode(SimpleFieldSet fs) throws
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
OpennetPeerNode pn = new OpennetPeerNode(fs, node, crypto,
this, node.peers, false, crypto.packetMangler);
if(Arrays.equals(pn.getIdentity(), crypto.myIdentity)) {
if(logMINOR) Logger.minor(this, "Not adding self as
opennet peer");
- return false; // Equal to myself
+ return null; // Equal to myself
}
if(peersLRU.contains(pn)) {
if(logMINOR) Logger.minor(this, "Not adding
"+pn.userToString()+" to opennet list as already there");
- return false;
+ return null;
}
- return wantPeer(pn, true);
+ if(wantPeer(pn, true)) return pn;
+ else return null;
// Start at bottom. Node must prove itself.
}
@@ -639,4 +640,13 @@
return ref;
}
+ /** Do an announcement !!
+ * @param target The location to announce to. In 0.7 we don't try to
prevent nodes from choosing their
+ * announcement location, because it is easy for them to get the
location they want later on anyway,
+ * and we can do a much more effective announcement this way. */
+ public void announce(double target, AnnouncementCallback cb) {
+ AnnounceSender sender = new AnnounceSender(target, this, node,
cb);
+ node.executor.execute(sender, "Announcement to "+target);
+ }
+
}
Modified: trunk/freenet/src/freenet/node/RequestHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestHandler.java 2007-12-04 17:46:07 UTC
(rev 16269)
+++ trunk/freenet/src/freenet/node/RequestHandler.java 2007-12-04 18:14:40 UTC
(rev 16270)
@@ -347,7 +347,7 @@
return false;
try {
- if(!node.addNewOpennetNode(ref)) {
+ if(node.addNewOpennetNode(ref) == null) {
Logger.normal(this, "Asked for opennet ref but
didn't want it for "+this+" :\n"+ref);
} else {
Logger.normal(this, "Added opennet noderef in
"+this);
Modified: trunk/freenet/src/freenet/node/RequestSender.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestSender.java 2007-12-04 17:46:07 UTC
(rev 16269)
+++ trunk/freenet/src/freenet/node/RequestSender.java 2007-12-04 18:14:40 UTC
(rev 16270)
@@ -686,7 +686,7 @@
if(ref == null) return;
- if(!node.addNewOpennetNode(ref)) {
+ if(node.addNewOpennetNode(ref) == null) {
// If we don't want it let somebody else have it
synchronized(this) {
opennetNoderef = noderef;
Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2007-12-04
17:46:07 UTC (rev 16269)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2007-12-04
18:14:40 UTC (rev 16270)
@@ -186,6 +186,7 @@
sb.append("STATUS - display some status information on the node
including its reference and connections.\r\n");
sb.append("MEMSTAT - display some memory usage related
informations.\r\n");
sb.append("SHUTDOWN - exit the program\r\n");
+ sb.append("ANNOUNCE[:<location>] - announce to the specified
location");
if(n.isUsingWrapper())
sb.append("RESTART - restart the program\r\n");
if(core != null && core.directTMCI != this) {
@@ -862,7 +863,7 @@
}
}
};
- System.err.println("Probing keyspace around "+d+" ...");
+ outsb.append("Probing keyspace around "+d+" ...");
n.dispatcher.startProbe(d, cb,
NodeDispatcher.PROBE_TYPE_DEFAULT);
synchronized(this) {
while(!doneSomething) {
@@ -884,9 +885,9 @@
}
} else if(uline.startsWith("PLUGLOAD:")) {
if (line.substring("PLUGLOAD:".length()).trim().equals("?")) {
- outsb.append(" PLUGLOAD: pluginName - Load
official plugin from freenetproject.org");
- outsb.append(" PLUGLOAD: file://<filename> - Load
plugin from file");
- outsb.append(" PLUGLOAD: http://... - Load
plugin from online file");
+ outsb.append(" PLUGLOAD: pluginName - Load
official plugin from freenetproject.org\r\n");
+ outsb.append(" PLUGLOAD: file://<filename> - Load
plugin from file\r\n");
+ outsb.append(" PLUGLOAD: http://... - Load
plugin from online file\r\n");
} else {
String name =
line.substring("PLUGLOAD:".length()).trim();
n.pluginManager.startPlugin(name, true);
@@ -895,6 +896,48 @@
outsb.append(n.pluginManager.dumpPlugins());
} else if(uline.startsWith("PLUGKILL:")) {
n.pluginManager.killPlugin(line.substring("PLUGKILL:".length()).trim(),
60*1000);
+ } else if(uline.startsWith("ANNOUNCE")) {
+ OpennetManager om = n.getOpennet();
+ if(om == null) {
+ outsb.append("OPENNET DISABLED, cannot announce.");
+ return false;
+ }
+ uline = uline.substring("ANNOUNCE".length());
+ double target;
+ if(uline.charAt(0) == ':') {
+ target = Double.parseDouble(uline);
+ } else {
+ target = n.random.nextDouble();
+ }
+ om.announce(target, new AnnouncementCallback() {
+ public void addedNode(PeerNode pn) {
+ try {
+ out.write(("Added node
"+pn.shortToString()+"\n").getBytes());
+ out.flush();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+
+ public void bogusNoderef(String reason) {
+ try {
+ out.write(("Bogus noderef:
"+reason).getBytes());
+ out.flush();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+
+ public void completed() {
+ try {
+ out.write(("Completed
announcement.").getBytes());
+ out.flush();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+
+ });
} else {
if(uline.length() > 0)
printHeader(out);