Author: zothar
Date: 2006-08-17 05:37:31 +0000 (Thu, 17 Aug 2006)
New Revision: 10154
Modified:
trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/PeerNode.java
trunk/freenet/src/freenet/node/PeerNodeStatus.java
Log:
Added per-peer private notes and a FProxy interface. New features and minor
tweaks to the extra peer data facility.
Modified: trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2006-08-17 03:02:43 UTC (rev 10153)
+++ trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2006-08-17 05:37:31 UTC (rev 10154)
@@ -319,6 +319,7 @@
peerTableHeaderRow.addChild("th").addChild("span", new String[] { "title",
"style" }, new String[] { "Probability of the node rejecting a request due to
overload or causing a timeout.", "border-bottom: 1px dotted; cursor: help;" },
"Overload Probability");
}
peerTableHeaderRow.addChild("th").addChild("span", new
String[] { "title", "style" }, new String[] { "How long since the node
connected or was last seen", "border-bottom: 1px dotted; cursor: help;" },
"Connected\u00a0/\u00a0Idle");
+ peerTableHeaderRow.addChild("th").addChild("span", new
String[] { "title", "style" }, new String[] { "A private note concerning this
peer", "border-bottom: 1px dotted; cursor: help;" }, "Private Note");
for (int peerIndex = 0, peerCount =
peerNodeStatuses.length; peerIndex < peerCount; peerIndex++) {
PeerNodeStatus peerNodeStatus =
peerNodeStatuses[peerIndex];
@@ -392,6 +393,9 @@
peerRow.addChild("td", "class",
"peer-idle", idleToString(now, idle));
}
+ // private darknet node comment note column
+ peerRow.addChild("td", "class",
"peer-private-darknet-comment-note").addChild("input", new String[] { "type",
"name", "size", "maxlength", "value" }, new String[] { "text",
"peerPrivateNote_" + peerNodeStatus.hashCode(), "16", "250",
peerNodeStatus.getPrivateDarknetCommentNote() });
+
if (path.endsWith("displaymessagetypes.html")) {
HTMLNode messageCountRow =
peerTable.addChild("tr", "class", "message-status");
messageCountRow.addChild("td",
"colspan", "2");
@@ -443,6 +447,7 @@
} else {
HTMLNode actionSelect =
peerForm.addChild("select", "name", "action");
actionSelect.addChild("option", "value", "",
"-- Select action --");
+ actionSelect.addChild("option", "value",
"update_notes", "Update changed private notes");
actionSelect.addChild("option", "value",
"enable", "Enable selected peers");
actionSelect.addChild("option", "value",
"disable", "Disable selected peers");
actionSelect.addChild("option", "value",
"set_burst_only", "On selected peers, set BurstOnly");
@@ -576,6 +581,21 @@
headers.put("Location", "/darknet/");
ctx.sendReplyHeaders(302, "Found", headers, null, 0);
return;
+ } else if (request.isPartSet("submit") &&
request.getPartAsString("action",25).equals("update_notes")) {
+ //int hashcode =
Integer.decode(request.getParam("node")).intValue();
+
+ PeerNode[] peerNodes = node.getDarknetConnections();
+ for(int i = 0; i < peerNodes.length; i++) {
+ if
(request.isPartSet("peerPrivateNote_"+peerNodes[i].hashCode())) {
+
if(!request.getPartAsString("peerPrivateNote_"+peerNodes[i].hashCode(),250).equals(peerNodes[i].getPrivateDarknetCommentNote()))
{
+
peerNodes[i].setPrivateDarknetCommentNote(request.getPartAsString("peerPrivateNote_"+peerNodes[i].hashCode(),250));
+ }
+ }
+ }
+ MultiValueTable headers = new MultiValueTable();
+ headers.put("Location", "/darknet/");
+ ctx.sendReplyHeaders(302, "Found", headers, null, 0);
+ return;
} else if (request.isPartSet("submit") &&
request.getPartAsString("action",25).equals("enable")) {
//int hashcode =
Integer.decode(request.getParam("node")).intValue();
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2006-08-17 03:02:43 UTC (rev
10153)
+++ trunk/freenet/src/freenet/node/Node.java 2006-08-17 05:37:31 UTC (rev
10154)
@@ -393,6 +393,8 @@
public static final int PEER_NODE_STATUS_LISTEN_ONLY = 10;
public static final int N2N_TEXT_MESSAGE_TYPE_USERALERT = 1;
public static final int EXTRA_PEER_DATA_TYPE_N2NTM = 1;
+ public static final int EXTRA_PEER_DATA_TYPE_PEER_NOTE = 2;
+ public static final int PEER_NOTE_TYPE_PRIVATE_DARKNET_COMMENT = 1;
public final long bootID;
public final long startupTime;
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2006-08-17 03:02:43 UTC
(rev 10153)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2006-08-17 05:37:31 UTC
(rev 10154)
@@ -271,6 +271,12 @@
/** Average proportion of requests which are rejected or timed out */
private TimeDecayingRunningAverage pRejected;
+ /** Private comment on the peer for /darknet/ page */
+ private String privateDarknetComment;
+
+ /** Private comment on the peer for /darknet/ page's extra peer data file
number */
+ private int privateDarknetCommentFileNumber;
+
/**
* Create a PeerNode from a SimpleFieldSet containing a
* node reference for one. This must contain the following
@@ -508,6 +514,9 @@
// status may have changed from PEER_NODE_STATUS_DISCONNECTED to
PEER_NODE_STATUS_NEVER_CONNECTED
setPeerNodeStatus(now);
+
+ privateDarknetComment = new String();
+ privateDarknetCommentFileNumber = -1;
// Setup the extraPeerDataFileNumbers
extraPeerDataFileNumbers = new Vector();
@@ -2432,6 +2441,29 @@
if(extraPeerDataType == Node.EXTRA_PEER_DATA_TYPE_N2NTM) {
node.handleNodeToNodeTextMessageSimpleFieldSet(fs,
this, fileNumber);
return true;
+ } else if(extraPeerDataType ==
Node.EXTRA_PEER_DATA_TYPE_PEER_NOTE) {
+ String peerNoteTypeString = fs.get("peerNoteType");
+ int peerNoteType = -1;
+ try {
+ peerNoteType =
Integer.parseInt(peerNoteTypeString);
+ } catch (NumberFormatException e) {
+ Logger.error(this, "NumberFormatException
parsing peerNoteType ("+peerNoteTypeString+") in file
"+extraPeerDataFile.getPath());
+ return false;
+ }
+ if(peerNoteType ==
Node.PEER_NOTE_TYPE_PRIVATE_DARKNET_COMMENT) {
+ synchronized(privateDarknetComment) {
+ try {
+ privateDarknetComment = new
String(Base64.decode(fs.get("privateDarknetComment")));
+ } catch (IllegalBase64Exception e) {
+ Logger.error(this, "Bad Base64
encoding when decoding a private darknet comment SimpleFieldSet", e);
+ return false;
+ }
+ privateDarknetCommentFileNumber =
fileNumber;
+ }
+ return true;
+ }
+ Logger.error(this, "Read unknown peer note type
'"+peerNoteType+"' from file "+extraPeerDataFile.getPath());
+ return false;
}
Logger.error(this, "Read unknown extra peer data type
'"+extraPeerDataType+"' from file "+extraPeerDataFile.getPath());
return false;
@@ -2466,12 +2498,12 @@
extraPeerDataFileNumbers.addElement(new
Integer(nextFileNumber));
}
FileOutputStream fos;
- File extraPeerDataPeerDataFile = new
File(extraPeerDataPeerDir.getPath()+File.separator+nextFileNumber);
- if(extraPeerDataPeerDataFile.exists()) {
- Logger.error(this, "Extra peer data file already
exists: "+extraPeerDataPeerDataFile.getPath());
+ File extraPeerDataFile = new
File(extraPeerDataPeerDir.getPath()+File.separator+nextFileNumber);
+ if(extraPeerDataFile.exists()) {
+ Logger.error(this, "Extra peer data file already
exists: "+extraPeerDataFile.getPath());
return -1;
}
- String f = extraPeerDataPeerDataFile.getPath();
+ String f = extraPeerDataFile.getPath();
try {
fos = new FileOutputStream(f);
} catch (FileNotFoundException e2) {
@@ -2508,7 +2540,7 @@
}
File extraPeerDataFile = new
File(extraPeerDataDirPath+File.separator+getIdentityString()+File.separator+fileNumber);
if(!extraPeerDataFile.exists()) {
- Logger.error(this, "Extra peer data directory for peer
does not exist: "+extraPeerDataFile.getPath());
+ Logger.error(this, "Extra peer data file for peer does
not exist: "+extraPeerDataFile.getPath());
return;
}
synchronized(extraPeerDataFileNumbers) {
@@ -2518,5 +2550,70 @@
}
extraPeerDataFile.delete();
}
+
+ public boolean rewriteExtraPeerDataFile(SimpleFieldSet fs, int
extraPeerDataType, int fileNumber) {
+ String extraPeerDataDirPath = node.getExtraPeerDataDir();
+ if(extraPeerDataType > 0)
+ fs.put("extraPeerDataType",
Integer.toString(extraPeerDataType));
+ File extraPeerDataPeerDir = new
File(extraPeerDataDirPath+File.separator+getIdentityString());
+ if(!extraPeerDataPeerDir.exists()) {
+ Logger.error(this, "Extra peer data directory for peer
does not exist: "+extraPeerDataPeerDir.getPath());
+ return false;
+ }
+ if(!extraPeerDataPeerDir.isDirectory()) {
+ Logger.error(this, "Extra peer data directory for peer
not a directory: "+extraPeerDataPeerDir.getPath());
+ return false;
+ }
+ File extraPeerDataFile = new
File(extraPeerDataDirPath+File.separator+getIdentityString()+File.separator+fileNumber);
+ if(!extraPeerDataFile.exists()) {
+ Logger.error(this, "Extra peer data file for peer does
not exist: "+extraPeerDataFile.getPath());
+ return false;
+ }
+ String f = extraPeerDataFile.getPath();
+ FileOutputStream fos;
+ try {
+ fos = new FileOutputStream(f);
+ } catch (FileNotFoundException e2) {
+ Logger.error(this, "Cannot write extra peer data file
to disk: Cannot open "
+ + f + " - " + e2, e2);
+ return false;
+ }
+ OutputStreamWriter w = new OutputStreamWriter(fos);
+ try {
+ fs.writeTo(w);
+ w.close();
+ } catch (IOException e) {
+ try {
+ w.close();
+ } catch (IOException e1) {
+ Logger.error(this, "Cannot close extra peer
data file: "+e, e);
+ }
+ Logger.error(this, "Cannot write file: " + e, e);
+ return false;
+ }
+ return true;
+ }
+
+ public synchronized String getPrivateDarknetCommentNote() {
+ return privateDarknetComment;
+ }
+
+ public synchronized void setPrivateDarknetCommentNote(String comment) {
+ int localFileNumber;
+ synchronized(privateDarknetComment) {
+ privateDarknetComment = comment;
+ localFileNumber = privateDarknetCommentFileNumber;
+ }
+ SimpleFieldSet fs = new SimpleFieldSet();
+ fs.put("peerNoteType",
Integer.toString(Node.PEER_NOTE_TYPE_PRIVATE_DARKNET_COMMENT));
+ fs.put("privateDarknetComment",
Base64.encode(comment.getBytes()));
+ if(localFileNumber == -1) {
+ localFileNumber = writeNewExtraPeerDataFile(fs,
Node.EXTRA_PEER_DATA_TYPE_PEER_NOTE);
+ synchronized(privateDarknetComment) {
+ privateDarknetCommentFileNumber =
localFileNumber;
+ }
+ } else {
+ rewriteExtraPeerDataFile(fs,
Node.EXTRA_PEER_DATA_TYPE_PEER_NOTE, localFileNumber);
+ }
+ }
}
-
\ No newline at end of file
Modified: trunk/freenet/src/freenet/node/PeerNodeStatus.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNodeStatus.java 2006-08-17 03:02:43 UTC
(rev 10153)
+++ trunk/freenet/src/freenet/node/PeerNodeStatus.java 2006-08-17 05:37:31 UTC
(rev 10154)
@@ -73,6 +73,8 @@
private final double pReject;
+ private final String privateDarknetCommentNote;
+
public PeerNodeStatus(PeerNode peerNode) {
this.name = peerNode.getName();
this.peerAddress = (peerNode.getDetectedPeer() != null) ?
peerNode.getDetectedPeer().getFreenetAddress().toString() : null;
@@ -103,6 +105,7 @@
this.localMessagesSent = new
Hashtable(peerNode.getLocalNodeSentMessagesToStatistic());
this.hashCode = peerNode.hashCode;
this.pReject = peerNode.getPRejected();
+ this.privateDarknetCommentNote =
peerNode.getPrivateDarknetCommentNote();
}
/**
@@ -305,4 +308,11 @@
public double getPReject() {
return pReject;
}
+
+ /**
+ * @return the privateDarknetCommentNote
+ */
+ public String getPrivateDarknetCommentNote() {
+ return privateDarknetCommentNote;
+ }
}