Author: toad
Date: 2006-06-02 20:49:33 +0000 (Fri, 02 Jun 2006)
New Revision: 9005

Modified:
   trunk/freenet/src/freenet/node/updater/NodeUpdater.java
Log:
first attempt at self-update support on Windows. not tested yet!

Modified: trunk/freenet/src/freenet/node/updater/NodeUpdater.java
===================================================================
--- trunk/freenet/src/freenet/node/updater/NodeUpdater.java     2006-06-02 
20:33:35 UTC (rev 9004)
+++ trunk/freenet/src/freenet/node/updater/NodeUpdater.java     2006-06-02 
20:49:33 UTC (rev 9005)
@@ -1,10 +1,20 @@
 package freenet.node.updater;

+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+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 java.net.MalformedURLException;
+import java.util.Properties;

+import org.tanukisoftware.wrapper.WrapperManager;
+
 import freenet.client.FetchException;
 import freenet.client.FetchResult;
 import freenet.client.FetcherContext;
@@ -182,28 +192,126 @@
                        ArrayBucket bucket = (ArrayBucket) result.asBucket();
                        byte[] data = bucket.toByteArray();

-                       File f = new File("freenet-cvs-snapshot.jar.new");
-                       f.delete();
+                       File fRunning = new File("freenet-cvs-snapshot.jar");
+                       File fNew = new File("freenet-cvs-snapshot.jar.new");

-                       FileOutputStream fos = new FileOutputStream(f);
+                       boolean nastyRestart = false;

+                       if(File.separatorChar != '\\') {
+                               // Do nothing.
+                       } else {
+                               nastyRestart = true;
+                               Properties p = WrapperManager.getProperties();
+                               String cp1 = 
p.getProperty("wrapper.java.classpath.1");
+                               if(cp1.equals("freenet-cvs-snapshot.jar")) {
+                                       // Cool!
+                               } else 
if(cp1.equals("freenet-cvs-snapshot.jar.new")) {
+                                       // Swapped; we are running .new
+                                       File tmp = fRunning;
+                                       fRunning = fNew;
+                                       fNew = fRunning;
+                               } else {
+                                       Logger.error(this, "Cannot restart on 
Windows due to non-standard config file!");
+                                       System.err.println("Cannot restart on 
Windows due to non-standard config file!");
+                                       return;
+                               }
+                       }
+                       
+                       fNew.delete();
+                       
+                       FileOutputStream fos = new FileOutputStream(fNew);
+                       
                        fos.write(data);
                        fos.flush();
                        fos.close();
-                       System.out.println("################## File written! 
"+cg.getURI().getSuggestedEdition()+ " " +f.getAbsolutePath());
-                       
-                       File f2 = new File("freenet-cvs-snapshot.jar");
-                       f2.delete();
-                       
-                       if(f.renameTo(f2)){
+                       System.out.println("################## File written! 
"+cg.getURI().getSuggestedEdition()+ " " +fNew.getAbsolutePath());
+
+                       if(!nastyRestart) {
+                               // Easy way.
+                               if(!fNew.renameTo(fRunning)) {
+                                       fRunning.delete();
+                                       if(!fNew.renameTo(fRunning)) {
+                                               System.out.println("ERROR 
renaming the file!");
+                                               return;
+                                       }
+                               }
+                       } else {
+                               // Hard way.
+                               
+                               
if(!WrapperManager.isControlledByNativeWrapper()) {
+                                       Logger.error(this, "Cannot update 
because not running under wrapper");
+                                       System.err.println("Cannot update 
because not running under wrapper");
+                               }
+                               
+                               try {
+                                       
+                                       File oldConfig = new 
File("wrapper.conf");
+                                       File newConfig = new 
File("wrapper.conf.new");
+                                       
+                                       FileInputStream fis = new 
FileInputStream(oldConfig);
+                                       BufferedInputStream bis = new 
BufferedInputStream(fis);
+                                       InputStreamReader isr = new 
InputStreamReader(bis);
+                                       BufferedReader br = new 
BufferedReader(isr);
+                                       
+                                       fos = new FileOutputStream(newConfig);
+                                       BufferedOutputStream bos = new 
BufferedOutputStream(fos);
+                                       OutputStreamWriter osw = new 
OutputStreamWriter(fos);
+                                       BufferedWriter bw = new 
BufferedWriter(osw);
+                                       
+                                       String line;
+                                       boolean succeeded = false;
+                                       boolean stillSucceeded = false;
+                                       while((line = br.readLine()) != null) {
+                                               
if(line.equals("wrapper.java.classpath.1="+fRunning.getName())) {
+                                                       
bw.write("wrapper.java.classpath.1="+fNew.getName());
+                                                       succeeded = true;
+                                               } else {
+                                                       
if(line.equals("wrapper.restart.reload_configuration=TRUE"))
+                                                               stillSucceeded 
= true;
+                                                       bw.write(line);
+                                               }
+                                       }
+                                       bw.close();
+                                       br.close();
+                                       
+                                       if(!succeeded) {
+                                               System.err.println("Not able to 
update because of non-standard config");
+                                               Logger.error(this, "Not able to 
update because of non-standard config");
+                                               return;
+                                       }
+                                       
+                                       if(!stillSucceeded) {
+                                               System.err.println("Not able to 
update because of non-standard or old config, add a line saying 
\"wrapper.restart.reload_configuration=TRUE\"");
+                                               Logger.error(this, "Not able to 
update because of non-standard or old config, add a line saying 
\"wrapper.restart.reload_configuration=TRUE\"");
+                                               return;
+                                       }
+                                       
+                                       if(!newConfig.renameTo(oldConfig)) {
+                                               oldConfig.delete();
+                                               
if(!newConfig.renameTo(oldConfig)) {
+                                                       
System.err.println("Failed to rename over old config: update failed.");
+                                                       Logger.error(this, 
"Failed to rename over old config: update failed.");
+                                                       return;
+                                               }
+                                       }
+                                       
+                                       // New config installed.
+                                       
+                               } catch (IOException e) {
+                                       Logger.error(this, "Not able to update 
because of I/O error: "+e, e);
+                                       System.err.println("Not able to update 
because of I/O error: "+e);
+                               }
+                               
                                if(node.getNodeStarter()!=null)
                                        node.getNodeStarter().restart();
                                else{
                                        System.out.println("New version has 
been downloaded: please restart your node!");
                                        node.exit();
                                }       
-                       }else
-                               System.out.println("ERROR renaming the file!");
+                               
+                               
+                               
+                       }


                }catch(Exception e){


Reply via email to