Author: nextgens
Date: 2006-05-20 14:11:21 +0000 (Sat, 20 May 2006)
New Revision: 8798
Modified:
trunk/freenet/.classpath
trunk/freenet/build.xml
trunk/freenet/src/freenet/clients/http/WelcomeToadlet.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/TextModeClientInterface.java
Log:
Initial support for self-restarting in the node.
disabled per-default so it's probably safe.
I need to ask toad if not starting the memory checker thread is a problem.
I will document how to use it when it's ready.
Modified: trunk/freenet/.classpath
===================================================================
--- trunk/freenet/.classpath 2006-05-20 12:36:59 UTC (rev 8797)
+++ trunk/freenet/.classpath 2006-05-20 14:11:21 UTC (rev 8798)
@@ -2,6 +2,7 @@
<classpath>
<classpathentry
excluding="freenet/node/*Test.java|org/spaceroots/mantissa/random/MersenneTwisterTest.java|test/**"
kind="src" path="src"/>
<classpathentry kind="con"
path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="lib" path="lib/freenet-ext.jar"/>
+ <classpathentry exported="true" kind="lib" path="lib/freenet-ext.jar"/>
+ <classpathentry exported="true" kind="lib" path="lib/wrapper.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
Modified: trunk/freenet/build.xml
===================================================================
--- trunk/freenet/build.xml 2006-05-20 12:36:59 UTC (rev 8797)
+++ trunk/freenet/build.xml 2006-05-20 14:11:21 UTC (rev 8798)
@@ -51,6 +51,7 @@
<javac srcdir="${src}" destdir="${build}" debug="on" optimize="on"
source="1.4">
<classpath>
<pathelement location="${freenet-ext.location}"/>
+ <pathelement location="${lib}/wrapper.jar"/>
<pathelement location="gnu-crypto.jar"/>
<pathelement location="javax-security.jar"/>
<pathelement location="javax-crypto.jar"/>
Modified: trunk/freenet/src/freenet/clients/http/WelcomeToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/WelcomeToadlet.java 2006-05-20
12:36:59 UTC (rev 8797)
+++ trunk/freenet/src/freenet/clients/http/WelcomeToadlet.java 2006-05-20
14:11:21 UTC (rev 8798)
@@ -13,6 +13,7 @@
import freenet.config.SubConfig;
import freenet.keys.FreenetURI;
import freenet.node.Node;
+import freenet.node.NodeStarter;
import freenet.node.UserAlert;
import freenet.node.Version;
import freenet.support.Bucket;
@@ -77,6 +78,39 @@
writeReply(ctx, 200, "text/html", "OK", buf.toString());
this.node.exit();
+ }else if(request.getParam("restartconfirm").length() > 0){
+ // false for no navigation bars, because that would be
very silly
+ ctx.getPageMaker().makeHead(buf, "Node Restart", false);
+ buf.append("<div class=\"infobox
infobox-information\">\n");
+ buf.append("<div class=\"infobox-header\">\n");
+ buf.append("The Freenet node is beeing restarted\n");
+ buf.append("</div>\n");
+ buf.append("<div class=\"infobox-content\">\n");
+ buf.append("The restart process might take up to 3
minutes. <br>");
+ buf.append("Thank you for using Freenet\n");
+ buf.append("</div>\n");
+ buf.append("</div>\n");
+ ctx.getPageMaker().makeTail(buf);
+
+ writeReply(ctx, 200, "text/html", "OK", buf.toString());
+ Logger.normal(this, "Node is restarting");
+ node.getNodeStarter().restart();
+ }else if (request.getParam("restart").length() > 0) {
+ ctx.getPageMaker().makeHead(buf, "Node Restart");
+ buf.append("<div class=\"infobox infobox-query\">\n");
+ buf.append("<div class=\"infobox-header\">\n");
+ buf.append("Node Restart?\n");
+ buf.append("</div>\n");
+ buf.append("<div class=\"infobox-content\">\n");
+ buf.append("Are you sure you wish to restart your
Freenet node?\n");
+ buf.append("<form action=\"/\" method=\"post\">\n");
+ buf.append("<input type=\"submit\" name=\"cancel\"
value=\"Cancel\" />\n");
+ buf.append("<input type=\"submit\"
name=\"restartconfirm\" value=\"Restart\" />\n");
+ buf.append("</form>\n");
+ buf.append("</div>\n");
+ buf.append("</div>\n");
+ ctx.getPageMaker().makeTail(buf);
+ writeReply(ctx, 200, "text/html", "OK", buf.toString());
} else if (request.getParam("exit").equalsIgnoreCase("true")) {
ctx.getPageMaker().makeHead(buf, "Node Shutdown");
buf.append("<div class=\"infobox infobox-query\">\n");
@@ -369,9 +403,14 @@
}
buf.append("<form method=\"post\" action=\".\">\n");
buf.append("<input type=\"hidden\" name=\"exit\" value=\"true\"
/><input type=\"submit\" value=\"Shut down the node\" />\n");
- buf.append("</form>\n");
+ buf.append("</form>");
+ if(node.isUsingWrapper()){
+ buf.append("<form action=\"/\" method=\"post\">\n");
+ buf.append("<input type=\"submit\" name=\"restart\"
value=\"Restart the node\" />\n");
+ buf.append("</form>");
+ }
+ buf.append("\n</div>\n");
buf.append("</div>\n");
- buf.append("</div>\n");
// Activity
buf.append("<div class=\"infobox infobox-information\">\n");
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2006-05-20 12:36:59 UTC (rev
8797)
+++ trunk/freenet/src/freenet/node/Node.java 2006-05-20 14:11:21 UTC (rev
8798)
@@ -558,6 +558,8 @@
// USK inserter.
private final MyARKInserter arkPutter;
+ private static NodeStarter nodeStarter;
+
/**
* Read all storable settings (identity etc) from the node file.
* @param filename The name of the file to read from.
@@ -770,7 +772,7 @@
*/
Node node;
try {
- node = new Node(cfg, random);
+ node = new Node(cfg, random, logConfigHandler);
node.start(false);
} catch (NodeInitException e) {
System.err.println("Failed to load node:
"+e.getMessage());
@@ -789,18 +791,37 @@
this.exitCode = exitCode;
}
}
-
+
+ Node(Config config, RandomSource random, LoggingConfigHandler lc,
NodeStarter ns) throws NodeInitException{
+ this(config, random, lc);
+ nodeStarter=ns;
+ }
+
+ public boolean isUsingWrapper(){
+ if(nodeStarter!=null)
+ return true;
+ else
+ return false;
+ }
+
+ public NodeStarter getNodeStarter(){
+ return nodeStarter;
+ }
+
/**
* Create a Node from a Config object.
* @param config The Config object for this node.
* @param random The random number generator for this node. Passed in
because we may want
* to use a non-secure RNG for e.g. one-JVM live-code simulations. Should
be a Yarrow in
* a production node.
+ * @param the loggingHandler
* @throws NodeInitException If the node initialization fails.
*/
- private Node(Config config, RandomSource random) throws NodeInitException {
-
+ Node(Config config, RandomSource random, LoggingConfigHandler lc) throws
NodeInitException {
// Easy stuff
+ nodeStarter=null;
+ if(logConfigHandler != lc)
+ this.logConfigHandler=lc;
arkPutter = new MyARKInserter();
startupTime = System.currentTimeMillis();
throttleWindow = new ThrottleWindowManager(2.0);
@@ -1277,18 +1298,6 @@
this.arkFetcherContext = ctx;
}
-
- private InetAddress resolve(String val) {
- try {
- if(val == null || val.length() == 0)
- return null;
- else
- return InetAddress.getByName(val);
- } catch (UnknownHostException e) {
- Logger.error(this, "Ignoring unresolvable overridden IP
address: "+overrideIPAddress);
- return null;
- }
- }
void start(boolean noSwaps) throws NodeInitException {
if(!noSwaps)
Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2006-05-20
12:36:59 UTC (rev 8797)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2006-05-20
14:11:21 UTC (rev 8798)
@@ -155,6 +155,8 @@
// sb.append("SAY:<text> - send text to the last created/pushed
stream\r\n");
sb.append("STATUS - display some status information on the node
including its reference and connections.\r\n");
sb.append("SHUTDOWN - exit the program\r\n");
+ if(n.isUsingWrapper())
+ sb.append("RESTART - restart the program\r\n");
if(n.directTMCI != this) {
sb.append("QUIT - close the socket\r\n");
}
@@ -301,6 +303,12 @@
out.write(sb.toString().getBytes());
out.flush();
n.exit();
+ } else if(uline.startsWith("RESTART")) {
+ StringBuffer sb = new StringBuffer();
+ sb.append("Restarting the node.\r\n");
+ out.write(sb.toString().getBytes());
+ out.flush();
+ n.getNodeStarter().restart();
} else if(uline.startsWith("QUIT") && n.directTMCI == this) {
StringBuffer sb = new StringBuffer();
sb.append("QUIT command not available in console mode.\r\n");