Author: toad
Date: 2008-04-18 12:10:11 +0000 (Fri, 18 Apr 2008)
New Revision: 19387

Added:
   trunk/freenet/src/freenet/config/WrapperConfig.java
Modified:
   trunk/freenet/src/freenet/node/NodeInitException.java
Log:
WrapperConfig: a class to set wrapper.conf parameters.
Not used or tested yet.
Will be used to configure maximum memory usage.

Added: trunk/freenet/src/freenet/config/WrapperConfig.java
===================================================================
--- trunk/freenet/src/freenet/config/WrapperConfig.java                         
(rev 0)
+++ trunk/freenet/src/freenet/config/WrapperConfig.java 2008-04-18 12:10:11 UTC 
(rev 19387)
@@ -0,0 +1,135 @@
+package freenet.config;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+
+import org.tanukisoftware.wrapper.WrapperManager;
+
+import freenet.node.NodeInitException;
+import freenet.support.Logger;
+import freenet.support.io.Closer;
+
+/**
+ * Class to allow us to easily change wrapper properties.
+ * @author toad
+ */
+public class WrapperConfig {
+       
+       public String getWrapperProperty(String name) {
+               return WrapperManager.getProperties().getProperty(name, null);
+       }
+       
+       public boolean canChangeProperties() {
+               if(!WrapperManager.isControlledByNativeWrapper()) return false;
+               File f = new File("wrapper.conf");
+               if(!f.exists()) return false;
+               if(!f.canRead()) return false;
+               if(!f.canWrite()) return false;
+               if(!f.getParentFile().canWrite()) return false; // Can we 
create a file in order to rename over wrapper.conf?
+               return true;
+       }
+
+       /**
+        * Synchronized because we only want one instance running at once.
+        * @param name The property to set.
+        * @param value The value to set it to.
+        * @return True if the property was successfully updated.
+        */
+       public synchronized boolean setWrapperProperty(String name, String 
value) {
+               // Some of this copied from UpdateDeployContext, hence no GPL 
header on this file as none there.
+               
+               File oldConfig = new File("wrapper.conf");
+               File newConfig = new File("wrapper.conf.new");
+               
+               FileInputStream fis = null;
+               FileOutputStream fos = null;
+               
+               try {
+               
+                       fis = new FileInputStream(oldConfig);
+                       BufferedInputStream bis = new BufferedInputStream(fis);
+                       InputStreamReader isr = new InputStreamReader(bis);
+                       BufferedReader br = new BufferedReader(isr);
+                       
+                       fos = new FileOutputStream(newConfig);
+                       OutputStreamWriter osw = new OutputStreamWriter(fos);
+                       BufferedWriter bw = new BufferedWriter(osw);
+                       
+                       String line;
+                       
+                       boolean written = false;
+                       boolean writtenReload = false;
+                       
+                       while((line = br.readLine()) != null) {
+                               
+                               if(line.startsWith(name+"=")) {
+                                       bw.write(name+'='+value+'\n');
+                                       written = true;
+                               } else 
if(line.equalsIgnoreCase("wrapper.restart.reload_configuration=TRUE")) {
+                                       writtenReload = true;
+                               } else {
+                                       bw.write(line+'\n');
+                               }
+                       
+                       }
+                       br.close();
+                       fis = null;
+                       if(!written)
+                               bw.write(name+'='+value+'\n');
+                       if(!writtenReload)
+                               
bw.write("wrapper.restart.reload_configuration=TRUE\n");
+                       bw.close();
+                       fos = null;
+               } catch(IOException e) {
+                       Closer.close(fis);
+                       Closer.close(fos);
+                       fis = null;
+                       fos = null;
+                       if(oldConfig.exists()) newConfig.delete();
+                       Logger.error(this, "Cannot update wrapper property 
"+"name: "+e, e);
+                       System.err.println("Unable to update wrapper property 
"+name+" : "+e);
+                       return false;
+               } finally {
+                       Closer.close(fis);
+                       Closer.close(fos);
+               }
+               
+               if(!newConfig.renameTo(oldConfig)) {
+                       File oldOldConfig = new File("wrapper.conf.old");
+                       if(oldOldConfig.exists() && !oldOldConfig.delete())
+                               try {
+                                       oldOldConfig = 
File.createTempFile("wrapper.conf", ".old.tmp", new File("."));
+                               } catch (IOException e) {
+                                       String error = "Unable to create 
temporary file and unable to copy wrapper.conf to wrapper.conf.old. Could not 
update wrapper.conf trying to set property "+name;
+                                       Logger.error(this, error);
+                                       System.err.println(error);
+                                       return false;
+                               }
+                       if(!oldConfig.renameTo(oldOldConfig)) {
+                               String error = "Unable to change property 
"+name+": Could not move old config file "+oldConfig+", so could not rename new 
config file "+newConfig+" over it (already tried without deleting.";
+                               Logger.error(this, error);
+                               System.err.println(error);
+                               return false;
+                       }
+                       if(!newConfig.renameTo(oldConfig)) {
+                               String error = "Unable to rename "+newConfig+" 
to "+oldConfig+" even after moving the old config file out of the way! Trying 
to restore previous config file so the node will start up...";
+                               Logger.error(this, error);
+                               System.err.println(error);
+                               if(!oldOldConfig.renameTo(oldConfig)) {
+                                       System.err.println("CATASTROPHIC UPDATE 
ERROR: Unable to rename backup copy of config file over the current config 
file, after failing to update config file! The node will not boot until you get 
a new wrapper.conf!\n"+
+                                                       "The old config file is 
saved in "+oldOldConfig+" and it should be renamed to wrapper.conf");
+                                       
System.exit(NodeInitException.EXIT_BROKE_WRAPPER_CONF);
+                               }
+                       }
+               }
+               return true;
+       }
+       
+}

Modified: trunk/freenet/src/freenet/node/NodeInitException.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeInitException.java       2008-04-18 
12:05:36 UTC (rev 19386)
+++ trunk/freenet/src/freenet/node/NodeInitException.java       2008-04-18 
12:10:11 UTC (rev 19387)
@@ -35,6 +35,7 @@
        public static final int EXIT_STORE_IOEXCEPTION = 2;
        public static final int EXIT_STORE_FILE_NOT_FOUND = 1;
        public static final int EXIT_NODE_UPPER_LIMIT = 1024;
+       public static final int EXIT_BROKE_WRAPPER_CONF = 28;
        private static final long serialVersionUID = -1;

        NodeInitException(int exitCode, String msg) {


Reply via email to