diff --git a/htroot/ConfigUpdate_p.html b/htroot/ConfigUpdate_p.html index 1e1496655..3c03e5332 100644 --- a/htroot/ConfigUpdate_p.html +++ b/htroot/ConfigUpdate_p.html @@ -10,9 +10,11 @@ #%env/templates/submenuConfig.template%#

System Update

+ #(deploys)#::Release will be installed. Please wait.#(/deploys)# + #(candeploy)# This servlet can only be used on operation systems that are currently supported for deploy functions. - If you see this message this means that your operation sytem ist not supported. + If you see this message this means that your operation system is not supported. ::
Manual System Update @@ -100,6 +102,7 @@
Last Deploy

#(lastdeploy)#never::#[time]##(/lastdeploy)#

+ :: #(/candeploy)# #%env/templates/footer.template%# diff --git a/htroot/ConfigUpdate_p.java b/htroot/ConfigUpdate_p.java index e5a31f363..bcbe3d565 100644 --- a/htroot/ConfigUpdate_p.java +++ b/htroot/ConfigUpdate_p.java @@ -52,6 +52,8 @@ public class ConfigUpdate_p { if (post.containsKey("update")) { prop.put("forwardToSteering", "1"); prop.put("forwardToSteering_release",post.get("releaseinstall", "")); + prop.put("deploys", "1"); + prop.put("candeploy", "2"); // display nothing else return prop; } @@ -117,7 +119,7 @@ public class ConfigUpdate_p { } // set if this should be visible - if (serverSystem.canExecUnix) { + if (serverSystem.canExecUnix || serverSystem.isWindows) { // we can deploy a new system with (i.e.) // cd DATA/RELEASE;tar xfz $1;cp -Rf yacy/* ../../;rm -Rf yacy prop.put("candeploy", "1"); diff --git a/htroot/Steering.java b/htroot/Steering.java index b9f8f0a49..d24ab0c1b 100644 --- a/htroot/Steering.java +++ b/htroot/Steering.java @@ -86,7 +86,7 @@ public class Steering { if (post.containsKey("update")) { boolean devenvironment = yacyVersion.combined2prettyVersion(sb.getConfig("version","0.1")).startsWith("dev"); String releaseFileName = post.get("releaseinstall", ""); - File releaseFile = new File(sb.getRootPath(), "DATA/RELEASE/" + releaseFileName); + File releaseFile = new File(sb.getRootPath(), "DATA/RELEASE/".replace("/", File.separator) + releaseFileName); if ((!devenvironment) && (releaseFile.length() > 0) && (releaseFile.exists())) { yacyVersion.deployRelease(releaseFile); } diff --git a/htroot/yacysearchitem.java b/htroot/yacysearchitem.java index 17acb16e7..def2ab8e1 100644 --- a/htroot/yacysearchitem.java +++ b/htroot/yacysearchitem.java @@ -224,7 +224,6 @@ public class yacysearchitem { ((yacyURL.probablyRootURL(result.hash())) ? ", probablyRootURL" : "") + (((wordURL = yacyURL.probablyWordURL(result.hash(), query[0])) != null) ? ", probablyWordURL=" + wordURL.toNormalform(false, true) : "")); plasmaSnippetCache.TextSnippet snippet = result.textSnippet(); - // TODO: check if tags are correctly stripped from snippet prop.put("content_snippet", (snippet == null) ? "(snippet not found)" : snippet.getLineMarked(theQuery.queryHashes)); serverProfiling.update("SEARCH", new plasmaProfiling.searchEvent(theQuery.id(true), plasmaSearchEvent.FINALIZATION + "-" + item, 0, 0)); diff --git a/source/de/anomic/server/serverSystem.java b/source/de/anomic/server/serverSystem.java index 02658a33d..60024b1e2 100644 --- a/source/de/anomic/server/serverSystem.java +++ b/source/de/anomic/server/serverSystem.java @@ -69,6 +69,7 @@ public final class serverSystem { public static boolean isMacArchitecture = false; public static boolean isUnixFS = false; public static boolean canExecUnix = false; + public static boolean isWindows = false; // calculated system constants public static int maxPathLength = 65535; @@ -99,7 +100,8 @@ public final class serverSystem { isMacArchitecture = ((systemOS == systemMacOSC) || (systemOS == systemMacOSX)); isUnixFS = ((systemOS == systemMacOSX) || (systemOS == systemUnix)); - canExecUnix = ((isUnixFS) || (!((systemOS == systemMacOSC) || (systemOS == systemWindows)))); + canExecUnix = ((isUnixFS) || (!((systemOS == systemMacOSC) || (systemOS == systemWindows)))); + isWindows = (systemOS == systemWindows); // set up the MRJ Methods through reflection if (isMacArchitecture) try { @@ -121,13 +123,13 @@ public final class serverSystem { macMRJFileUtils = null; macMRJOSType = null; } - // set up maximum path length accoring to system - if (systemOS == systemWindows) maxPathLength = 255; else maxPathLength = 65535; + // set up maximum path length according to system + if (isWindows) maxPathLength = 255; else maxPathLength = 65535; } - public static boolean isWindows() { +/* public static boolean isWindows() { return systemOS == systemWindows; - } + }*/ public static Object getMacOSTS(String s) { if ((isMacArchitecture) && (macMRJFileUtils != null)) try { @@ -330,19 +332,30 @@ public final class serverSystem { public static void deployScript(File scriptFile, String theScript) throws IOException { serverFileUtils.copy(theScript.getBytes(), scriptFile); - try { - Runtime.getRuntime().exec("chmod 755 " + scriptFile.getAbsolutePath().replaceAll(" ", "\\ ")).waitFor(); - } catch (InterruptedException e) { - serverLog.logSevere("DEPLOY", "deploy of script file failed. file = " + scriptFile.getAbsolutePath(), e); - throw new IOException(e.getMessage()); + if(!isWindows){ // set executable + try { + Runtime.getRuntime().exec("chmod 755 " + scriptFile.getAbsolutePath().replaceAll(" ", "\\ ")).waitFor(); + } catch (InterruptedException e) { + serverLog.logSevere("DEPLOY", "deploy of script file failed. file = " + scriptFile.getAbsolutePath(), e); + throw new IOException(e.getMessage()); + } } } public static void execAsynchronous(File scriptFile) throws IOException { - // runs a unix/linux script as separate thread - File starterFile = new File(scriptFile.getAbsolutePath().replaceAll(" ", "\\ ") + ".starter.sh"); - //deployScript(starterFile, "touch restart.starter.startet1"); - deployScript(starterFile, "#!/bin/sh" + serverCore.LF_STRING + scriptFile.getAbsolutePath().replaceAll(" ", "\\ ") + " &" + serverCore.LF_STRING); + // runs a script as separate thread + String starterFileExtension = null; + String script = null; + if(isWindows){ + starterFileExtension = ".starter.bat"; + // TODO: use /K to debug + script = "start /MIN CMD /C " + scriptFile.getAbsolutePath().replaceAll(" ", "\\ "); + } else { // unix/linux + starterFileExtension = ".starter.sh"; + script = "#!/bin/sh" + serverCore.LF_STRING + scriptFile.getAbsolutePath().replaceAll(" ", "\\ ") + " &" + serverCore.LF_STRING; + } + File starterFile = new File(scriptFile.getAbsolutePath().replaceAll(" ", "\\ ") + starterFileExtension); + deployScript(starterFile, script); try { Runtime.getRuntime().exec(starterFile.getAbsolutePath().replaceAll(" ", "\\ ")).waitFor(); } catch (InterruptedException e) { diff --git a/source/de/anomic/tools/tarTools.java b/source/de/anomic/tools/tarTools.java new file mode 100644 index 000000000..ff98fc1f3 --- /dev/null +++ b/source/de/anomic/tools/tarTools.java @@ -0,0 +1,98 @@ +// tarTools.java +// (C) 2007 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany +// contributed by David Wieditz; d.wieditz@gmx.de +// first published 21.05.2008 on http://yacy.net +// +// This is a part of YaCy, a peer-to-peer based web search engine +// +// $LastChangedDate: $ +// $LastChangedRevision: $ +// $LastChangedBy: $ +// +// LICENSE +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +package de.anomic.tools; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.util.zip.GZIPInputStream; + +import com.ice.tar.TarEntry; +import com.ice.tar.TarInputStream; + +import de.anomic.server.logging.serverLog; + +public class tarTools { + + public static InputStream getInputStream(String tarFileName) throws Exception{ + if(tarFileName.endsWith(".gz")){ + return new GZIPInputStream(new FileInputStream(new File(tarFileName))); + } else { + return new FileInputStream(new File(tarFileName)); + } + } + + public static InputStream getInputStream(File tarFileName) throws Exception{ + return getInputStream(tarFileName.toString()); + } + + /** + * untar for any archive, overwrites existing data + * @param in use getInputStream() for convenience + * @param untarDir destination path + * @throws Exception (IOException or FileNotFoundException) + */ + public static void unTar(InputStream in, String untarDir) throws Exception{ + serverLog.logInfo("UNTAR", "starting"); + if(new File(untarDir).exists()){ + TarInputStream tin = new TarInputStream(in); + TarEntry tarEntry = tin.getNextEntry(); + while(tarEntry != null){ + File destPath = new File(untarDir + File.separator + tarEntry.getName()); + if (!tarEntry.isDirectory()) { + new File(destPath.getParent()).mkdirs(); // create missing subdirectories + FileOutputStream fout = new FileOutputStream(destPath); + tin.copyEntryContents(fout); + fout.close(); + } else { + destPath.mkdir(); + } + tarEntry = tin.getNextEntry(); + } + tin.close(); + } else { // untarDir doesn't exist + serverLog.logWarning("UNTAR", "destination " + untarDir + " doesn't exist."); + } + serverLog.logInfo("UNTAR", "finished"); + } + + public static void main(String args[]){ + // @arg0 source + // @arg1 destination + if(args.length == 2){ + try { + unTar(getInputStream(args[0]), args[1]); + } catch (Exception e) { + System.out.println(e); + } + } else { + System.out.println("usage: "); + } + } +} \ No newline at end of file diff --git a/source/de/anomic/yacy/yacyVersion.java b/source/de/anomic/yacy/yacyVersion.java index b2d48f77f..109a48577 100644 --- a/source/de/anomic/yacy/yacyVersion.java +++ b/source/de/anomic/yacy/yacyVersion.java @@ -50,6 +50,7 @@ import de.anomic.server.serverCore; import de.anomic.server.serverFileUtils; import de.anomic.server.serverSystem; import de.anomic.server.logging.serverLog; +import de.anomic.tools.tarTools; public final class yacyVersion implements Comparator, Comparable { @@ -370,7 +371,7 @@ public final class yacyVersion implements Comparator, Comparable, Comparable /dev/null" + serverCore.LF_STRING; - File scriptFile = new File(sb.getRootPath(), "DATA/RELEASE/update.sh"); + try{ + tarTools.unTar(tarTools.getInputStream(releaseFile), sb.getRootPath() + "/DATA/RELEASE/".replace("/", File.separator)); + } catch (Exception e){ + serverLog.logSevere("UNTAR", "failed", e); + } + String script = null; + String scriptFileName = null; + if(serverSystem.isWindows){ + script = + // TODO: does YaCy delete this file after 2nd update-shutdown? "Die Batchdatei kann nicht gefunden werden." + "@echo off" + serverCore.LF_STRING + + "title YaCy updater" + serverCore.LF_STRING + + "echo YACY UPDATER" + serverCore.LF_STRING + + "echo working..." + serverCore.LF_STRING + + "cd " + apphome + "/DATA/RELEASE/".replace("/", File.separator) + serverCore.LF_STRING + + + ":WAIT" + serverCore.LF_STRING + + "ping -n 2 127.0.0.1 >nul" + serverCore.LF_STRING + + "IF exist ..\\yacy.running goto WAIT" + serverCore.LF_STRING + + + "IF not exist yacy goto NODATA" + serverCore.LF_STRING + + + "cd yacy" + serverCore.LF_STRING + + "xcopy *.* " + apphome + " /E /Y >nul" + serverCore.LF_STRING + + // /E - all subdirectories + // /Y - don't ask + "cd .." + serverCore.LF_STRING + + "rd yacy /S /Q" + serverCore.LF_STRING + + // /S delete tree + // /Q don't ask + "goto END" + serverCore.LF_STRING + + + ":NODATA" + serverCore.LF_STRING + + "echo YACY UPDATER ERROR: NO UPDATE SOURCE FILES ON FILESYSTEM" + serverCore.LF_STRING + + "pause" + serverCore.LF_STRING + + + ":END" + serverCore.LF_STRING + + "cd " + apphome + serverCore.LF_STRING + + "start /MIN CMD /C startYACY.bat" + serverCore.LF_STRING; + scriptFileName = "update.bat"; + } else { // unix/linux + script = + "#!/bin/sh" + serverCore.LF_STRING + + "cd " + sb.getRootPath() + "/DATA/RELEASE/" + serverCore.LF_STRING + + /* ((releaseFile.getName().endsWith(".gz")) ? + // test gz-file for integrity and tar xfz then + ("if gunzip -t " + releaseFile.getAbsolutePath() + serverCore.LF_STRING + + "then" + serverCore.LF_STRING + + "gunzip -c " + releaseFile.getAbsolutePath() + " | tar xf -" + serverCore.LF_STRING) : + // just tar xf the file, no integrity test possible? + ("tar xf " + releaseFile.getAbsolutePath() + serverCore.LF_STRING) + ) +*/ + "while [ -f ../yacy.running ]; do" + serverCore.LF_STRING + + "sleep 1" + serverCore.LF_STRING + + "done" + serverCore.LF_STRING + + "cp -Rf yacy/* " + apphome + serverCore.LF_STRING + + "rm -Rf yacy" + serverCore.LF_STRING + + /* ((releaseFile.getName().endsWith(".gz")) ? + // else-case of gunzip -t test: if failed, just restart + ("else" + serverCore.LF_STRING + + "while [ -f ../yacy.running ]; do" + serverCore.LF_STRING + + "sleep 1" + serverCore.LF_STRING + + "done" + serverCore.LF_STRING + + "fi" + serverCore.LF_STRING) : + // in case that we did not made the integrity test, there is no else case + "" + ) +*/ + "cd " + apphome + serverCore.LF_STRING + + "nohup ./startYACY.sh > /dev/null" + serverCore.LF_STRING; + scriptFileName = "update.sh"; + } + File scriptFile = new File(sb.getRootPath(), "DATA/RELEASE/".replace("/", File.separator) + scriptFileName); serverSystem.deployScript(scriptFile, script); serverLog.logInfo("UPDATE", "wrote update-script to " + scriptFile.getAbsolutePath()); serverSystem.execAsynchronous(scriptFile); diff --git a/startYACY.bat b/startYACY.bat index df5c5c434..5cb36836b 100644 --- a/startYACY.bat +++ b/startYACY.bat @@ -11,7 +11,7 @@ For %%X in (libx/*.jar) Do Call %0 CPGEN libx\%%X REM Please change the "javastart" settings in the web-interface "Basic Configuration" -> "Advanced" set jmx= set jms= -set javacmd=-Xmx64m -Xms10m +set javacmd=-Xmx120m -Xms120m set priolvl=0 set priority=/NORMAL if exist DATA\SETTINGS\httpProxy.conf GoTo :RENAMEINDEX @@ -36,6 +36,7 @@ start "YaCy" %priority% /B /WAIT java %javacmd% -classpath %CLASSPATH% yacy if not exist DATA\yacy.restart GoTo :END del DATA\yacy.restart +GoTo :GETSTARTOPTS Rem PUBLIC is now freeworld (r4575) :RENAMEINDEX diff --git a/startYACY_noconsole.bat b/startYACY_noconsole.bat index ae78ca43b..af63bfcc1 100644 --- a/startYACY_noconsole.bat +++ b/startYACY_noconsole.bat @@ -11,7 +11,7 @@ For %%X in (libx/*.jar) Do Call %0 CPGEN libx\%%X REM Please change the "javastart" settings in the web-interface "Basic Configuration" -> "Advanced" set jmx= set jms= -set javacmd=-Xmx94m -Xms94m +set javacmd=-Xmx120m -Xms120m set priolvl=0 set priority=/NORMAL if exist DATA\SETTINGS\httpProxy.conf GoTo :RENAMEINDEX