From 24daf006161813f76175cf1cd2540686051974c6 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 13 Jun 2009 21:04:27 +0000 Subject: [PATCH] * i2prouter: - Don't cd to script location, no longer required * RouterLaunch: - If no wrapper, put wrapper.log in system temp dir unless specified with -Dwrapper.logfile=/path/to/wrapper.log or it already exists in CWD (for backward compatibility) - Append rather than replace wrapper.log - Pass wrapper log location to router as a property, so that logs.jsp can find it * logs.jsp: - Get wrapper log location from a property too * runplain.sh: - Add path substitution to runplain.sh on install - Pass I2P base dir to the router as a property * wrapper.config: - Put wrapper.log in system temp dir for new installs - Pass I2P base dir to the router as a property * WorkingDir: - Don't migrate an existing install by default - Never migrate the data (too hard) --- .../src/net/i2p/router/web/LogsHelper.java | 17 +++++-- core/java/src/net/i2p/util/WorkingDir.java | 34 +++++++++---- installer/install.xml | 1 + installer/resources/i2prouter | 51 ++++--------------- installer/resources/runplain.sh | 16 ++++-- installer/resources/wrapper.config | 11 +++- .../java/src/net/i2p/router/RouterLaunch.java | 28 +++++++++- 7 files changed, 94 insertions(+), 64 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java index a4896cdb8..9aee053f5 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java @@ -17,16 +17,23 @@ public class LogsHelper extends HelperBase { } public String getServiceLogs() { - // look in new and old place - File f = new File(_context.getLogDir(), "wrapper.log"); - if (!f.exists()) - f = new File(_context.getBaseDir(), "wrapper.log"); + // RouterLaunch puts the location here if no wrapper + String path = System.getProperty("wrapper.logfile"); + File f; + if (path != null) { + f = new File(path); + } else { + // look in new and old places + f = new File(System.getProperty("java.io.tmpdir"), "wrapper.log"); + if (!f.exists()) + f = new File(_context.getBaseDir(), "wrapper.log"); + } String str = FileUtil.readTextFile(f.getAbsolutePath(), 250, false); if (str == null) return ""; else { str = str.replaceAll("<", "<").replaceAll(">", ">"); - return "
" + str + "
"; + return "Location: " + f.getAbsolutePath() + "
" + str + "
"; } } diff --git a/core/java/src/net/i2p/util/WorkingDir.java b/core/java/src/net/i2p/util/WorkingDir.java index 4e47f6458..0ba73f391 100644 --- a/core/java/src/net/i2p/util/WorkingDir.java +++ b/core/java/src/net/i2p/util/WorkingDir.java @@ -52,7 +52,7 @@ public class WorkingDir { * Only call this once on router invocation. * Caller should store the return value for future reference. */ - public static String getWorkingDir(boolean migrateOldData) { + public static String getWorkingDir(boolean migrateOldConfig) { String dir = System.getProperty(PROP_WORKING_DIR); boolean isWindows = System.getProperty("os.name").startsWith("Win"); File dirf = null; @@ -73,6 +73,18 @@ public class WorkingDir { String cwd = System.getProperty(PROP_BASE_DIR); if (cwd == null) cwd = System.getProperty("user.dir"); + + // Check for a hosts.txt file, if it exists then I2P is there + File oldDirf = new File(cwd); + File test = new File(oldDirf, "hosts.txt"); + if (!test.exists()) { + System.err.println("ERROR - Cannot find I2P installation in " + cwd + + " - Will probably be just a router with no apps or console at all!"); + // until we move reseeding from the console to the router, we + // won't be able to reseed, so we are probably doomed + return cwd; + } + // where we want to go String rv = dirf.getAbsolutePath(); if (dirf.exists()) { @@ -86,19 +98,19 @@ public class WorkingDir { return cwd; } - // Check for a hosts.txt file, if it exists then I2P is there - File oldDirf = new File(cwd); - File test = new File(oldDirf, "hosts.txt"); - if (!test.exists()) { - System.err.println("ERROR - Cannot find I2P installation in " + cwd); - return cwd; - } - - // Check for a router.keys file, if it exists it's an old install, + // Check for a router.keys file or logs dir, if either exists it's an old install, // and only migrate the data files if told to do so + // (router.keys could be deleted later by a killkeys()) test = new File(oldDirf, "router.keys"); boolean oldInstall = test.exists(); - migrateOldData &= oldInstall; + if (!oldInstall) { + test = new File(oldDirf, "logs"); + oldInstall = test.exists(); + } + // keep everything where it is, in one place... + if (oldInstall && !migrateOldConfig) + return cwd; + boolean migrateOldData = false; // this is a terrible idea // Do the copying if (migrateOldData) diff --git a/installer/install.xml b/installer/install.xml index a4894b4e4..1abfda98d 100644 --- a/installer/install.xml +++ b/installer/install.xml @@ -109,6 +109,7 @@ + diff --git a/installer/resources/i2prouter b/installer/resources/i2prouter index b5c292f19..c8bab7911 100644 --- a/installer/resources/i2prouter +++ b/installer/resources/i2prouter @@ -8,28 +8,31 @@ # if you have changed the default location set in the # wrapper configuration file. # -# Note that (percent)INSTALL_PATH and (percent)SYSTEM_java_io_tmpdir -# should have been replaced by -# the izpack installer. If you did not run the installer, -# replace them with the appropriate path. #----------------------------------------------------------------------------- # These settings can be modified to fit the needs of your application +# Paths +# Note that (percent)INSTALL_PATH and (percent)SYSTEM_java_io_tmpdir +# should have been replaced by the izpack installer. +# If you did not run the installer, replace them with the appropriate path. +I2P="%INSTALL_PATH" +I2PTEMP="%SYSTEM_java_io_tmpdir" + # Application APP_NAME="i2p" APP_LONG_NAME="I2P Service" # Wrapper -WRAPPER_CMD="%INSTALL_PATH/i2psvc" -WRAPPER_CONF="%INSTALL_PATH/wrapper.config" +WRAPPER_CMD="$I2P/i2psvc" +WRAPPER_CONF="$I2P/wrapper.config" # Priority at which to run the wrapper. See "man nice" for valid priorities. # nice is only used if a priority is specified. PRIORITY= # Location of the pid file. -PIDDIR="%SYSTEM_java_io_tmpdir" +PIDDIR="$I2PTEMP" # If uncommented, causes the Wrapper to be shutdown using an anchor file. # When launched with the 'start' command, it will also ignore all INT and @@ -51,40 +54,6 @@ PIDDIR="%SYSTEM_java_io_tmpdir" # Do not modify anything beyond this point #----------------------------------------------------------------------------- -# Get the fully qualified path to the script -case $0 in - /*) - SCRIPT="$0" - ;; - *) - PWD=`pwd` - SCRIPT="$PWD/$0" - ;; -esac - -# Change spaces to ":" so the tokens can be parsed. -SCRIPT=`echo $SCRIPT | sed -e 's; ;:;g'` -# Get the real path to this script, resolving any symbolic links -TOKENS=`echo $SCRIPT | sed -e 's;/; ;g'` -REALPATH= -for C in $TOKENS; do - REALPATH="$REALPATH/$C" - while [ -h "$REALPATH" ] ; do - LS="`ls -ld "$REALPATH"`" - LINK="`expr "$LS" : '.*-> \(.*\)$'`" - if expr "$LINK" : '/.*' > /dev/null; then - REALPATH="$LINK" - else - REALPATH="`dirname "$REALPATH"`""/$LINK" - fi - done -done -# Change ":" chars back to spaces. -REALPATH=`echo $REALPATH | sed -e 's;:; ;g'` - -# Change the current directory to the location of the script -cd "`dirname "$REALPATH"`" - # Process ID ANCHORFILE="$PIDDIR/$APP_NAME.anchor" PIDFILE="$PIDDIR/$APP_NAME.pid" diff --git a/installer/resources/runplain.sh b/installer/resources/runplain.sh index 25221f513..644bdadcf 100644 --- a/installer/resources/runplain.sh +++ b/installer/resources/runplain.sh @@ -5,9 +5,17 @@ # probably not enough for i2p. # You should really use the i2prouter script instead. # -export CP=. ; for j in lib/* ; do export CP=$CP:$j ; done; + +# Paths +# Note that (percent)INSTALL_PATH and (percent)SYSTEM_java_io_tmpdir +# should have been replaced by the izpack installer. +# If you did not run the installer, replace them with the appropriate path. +I2P="%INSTALL_PATH" +I2PTEMP="%SYSTEM_java_io_tmpdir" + +export CP="$I2P" ; for j in "$I2P/lib/*" ; do export CP="$CP:$j" ; done; JAVA=java -JAVAOPTS="-Djava.library.path=.:lib -DloggerFilenameOverride=logs/log-router-@.txt" -nohup $JAVA -cp $CP $JAVAOPTS net.i2p.router.RouterLaunch > /dev/null 2>&1 & -echo $! > router.pid +JAVAOPTS="-Djava.library.path=$I2P:$I2P/lib -Di2p.dir.base=$I2P -DloggerFilenameOverride=logs/log-router-@.txt" +nohup $JAVA -cp "$CP" $JAVAOPTS net.i2p.router.RouterLaunch > /dev/null 2>&1 & +echo $! > "$I2PTEMP/router.pid" diff --git a/installer/resources/wrapper.config b/installer/resources/wrapper.config index b14bc8288..03efe22fb 100644 --- a/installer/resources/wrapper.config +++ b/installer/resources/wrapper.config @@ -51,11 +51,12 @@ wrapper.java.additional.1=-DloggerFilenameOverride=logs/log-router-@.txt wrapper.java.additional.2=-Dorg.mortbay.http.Version.paranoid=true wrapper.java.additional.3=-Dorg.mortbay.util.FileResource.checkAliases=false wrapper.java.additional.4=-Dorg.mortbay.xml.XmlParser.NotValidating=true +wrapper.java.additional.5=-Di2p.dir.base=$INSTALL_PATH # Uncomment this for better performance. # If it doesn't work, server mode is not available in your JVM. # This may not be required if your machine is already "server-class". # See http://java.sun.com/j2se/1.5.0/docs/guide/vm/server-class.html -#wrapper.java.additional.5=-server +#wrapper.java.additional.6=-server # Initial Java Heap Size (in MB) #wrapper.java.initmemory=4 @@ -86,7 +87,13 @@ wrapper.console.format=PM wrapper.console.loglevel=INFO # Log file to use for wrapper output logging. -wrapper.logfile=wrapper.log +# You may wish to change this on linux so the log is +# preserved across OS restarts. +# If you do change it, add the following line above to +# tell the router where to find the wrapper log +# (change X to the next available number) +# wrapper.java.additional.X=-Dwrapper.logfile=/path/to/wrapper.log +wrapper.logfile=$SYSTEM_java_io_tmpdir/wrapper.log # Format of output for the log file. (See docs for formats) wrapper.logfile.format=LPTM diff --git a/router/java/src/net/i2p/router/RouterLaunch.java b/router/java/src/net/i2p/router/RouterLaunch.java index 6aab4e8ac..13ee2f3cf 100644 --- a/router/java/src/net/i2p/router/RouterLaunch.java +++ b/router/java/src/net/i2p/router/RouterLaunch.java @@ -1,13 +1,39 @@ package net.i2p.router; +import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; +/** + * This is the class called by the runplain.sh script on linux + * and the i2p.exe launcher on Windows. + * (i.e. no wrapper) + * + * If there is no -Dwrapper.log=/path/to/wrapper.log on the java command line + * to specify a log file, check for existence of wrapper.log in CWD, + * for backward compatibility in old installations (don't move it). + * Otherwise, use (system temp dir)/wrapper.log. + * Create if it doesn't exist, and append to it if it does. + * Put the location in the environment as an absolute path, so logs.jsp can find it. + */ public class RouterLaunch { + private static final String PROP_WRAPPER_LOG = "wrapper.logfile"; + private static final String DEFAULT_WRAPPER_LOG = "wrapper.log"; + public static void main(String args[]) { + String path = System.getProperty(PROP_WRAPPER_LOG); + File logfile; + if (path != null) { + logfile = new File(path); + } else { + logfile = new File(DEFAULT_WRAPPER_LOG); + if (!logfile.exists()) + logfile = new File(System.getProperty("java.io.tmpdir"), DEFAULT_WRAPPER_LOG); + } + System.setProperty(PROP_WRAPPER_LOG, logfile.getAbsolutePath()); try { - System.setOut(new PrintStream(new FileOutputStream("wrapper.log"))); + System.setOut(new PrintStream(new FileOutputStream(logfile, true))); } catch (IOException ioe) { ioe.printStackTrace(); }