diff --git a/apps/admin/java/src/net/i2p/router/admin/AdminRunner.java b/apps/admin/java/src/net/i2p/router/admin/AdminRunner.java index d5c63c60d3..af9eeb6cbd 100644 --- a/apps/admin/java/src/net/i2p/router/admin/AdminRunner.java +++ b/apps/admin/java/src/net/i2p/router/admin/AdminRunner.java @@ -11,9 +11,10 @@ import java.util.Iterator; import java.util.Set; import net.i2p.data.Hash; -import net.i2p.data.DataHelper +import net.i2p.data.DataHelper; import net.i2p.router.Router; import net.i2p.router.RouterContext; +import net.i2p.router.web.StatsGenerator; import net.i2p.util.I2PThread; import net.i2p.util.Log; @@ -49,7 +50,7 @@ class AdminRunner implements Runnable { } else if ( (command.indexOf("routerStats.html") >= 0) || (command.indexOf("oldstats.jsp") >= 0) ) { try { out.write(DataHelper.getASCII("HTTP/1.1 200 OK\nConnection: close\nCache-control: no-cache\nContent-type: text/html\n\n")); - _generator.generateStatsPage(new OutputStreamWriter(out)); + _generator.generateStatsPage(new OutputStreamWriter(out), true); out.close(); } catch (IOException ioe) { if (_log.shouldLog(Log.WARN)) @@ -63,7 +64,8 @@ class AdminRunner implements Runnable { } else if (true || command.indexOf("routerConsole.html") > 0) { try { out.write(DataHelper.getASCII("HTTP/1.1 200 OK\nConnection: close\nCache-control: no-cache\nContent-type: text/html\n\n")); - _context.router().renderStatusHTML(new OutputStreamWriter(out)); + // TODO Not technically the same as router().renderStatusHTML() was + _context.routerAppManager().renderStatusHTML(new OutputStreamWriter(out)); out.close(); } catch (IOException ioe) { if (_log.shouldLog(Log.WARN)) diff --git a/apps/i2psnark/java/build.xml b/apps/i2psnark/java/build.xml index 683e812858..214ffa2375 100644 --- a/apps/i2psnark/java/build.xml +++ b/apps/i2psnark/java/build.xml @@ -50,6 +50,10 @@ + + + + @@ -71,7 +75,7 @@ - + @@ -179,29 +183,120 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + - - - - diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index abfc320978..e9736fab87 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -233,6 +233,8 @@ public class SnarkManager implements CompleteListener { _configFile = new File(_configDir, CONFIG_FILE); _trackerMap = new ConcurrentHashMap(4); loadConfig(null); + if (!ctx.isRouterContext()) + Runtime.getRuntime().addShutdownHook(new Thread(new TempDeleter(_util.getTempDir()), "Snark Temp Dir Deleter")); } /** Caller _must_ call loadConfig(file) before this if setting new values @@ -245,7 +247,7 @@ public class SnarkManager implements CompleteListener { _monitor = new I2PAppThread(new DirMonitor(), "Snark DirMonitor", true); _monitor.start(); // only if default instance - if ("i2psnark".equals(_contextName)) + if (_context.isRouterContext() && "i2psnark".equals(_contextName)) // delay until UpdateManager is there _context.simpleTimer2().addEvent(new Register(), 4*60*1000); // Not required, Jetty has a shutdown hook @@ -254,6 +256,16 @@ public class SnarkManager implements CompleteListener { _idleChecker.schedule(5*60*1000); } + /** + * Only used in app context + * @since 0.9.27 + */ + private static class TempDeleter implements Runnable { + private final File file; + public TempDeleter(File f) { file = f; } + public void run() { FileUtil.rmdir(file, false); } + } + /** @since 0.9.4 */ private class Register implements SimpleTimer.TimedEvent { public void timeReached() { @@ -388,6 +400,8 @@ public class SnarkManager implements CompleteListener { } private int getStartupDelayMinutes() { + if (!_context.isRouterContext()) + return 0; try { return Integer.parseInt(_config.getProperty(PROP_STARTUP_DELAY)); } catch (NumberFormatException nfe) { @@ -675,7 +689,8 @@ public class SnarkManager implements CompleteListener { * @return String[] -- Array of all the themes found, non-null, unsorted */ public String[] getThemes() { - String[] themes; + String[] themes; + if (_context.isRouterContext()) { // "docs/themes/snark/" File dir = new File(_context.getBaseDir(), "docs/themes/snark"); FileFilter fileFilter = new FileFilter() { public boolean accept(File file) { return file.isDirectory(); } }; @@ -689,8 +704,10 @@ public class SnarkManager implements CompleteListener { } else { themes = new String[0]; } - // return the map. - return themes; + } else { + themes = new String[] { "light", "ubergine", "vanilla" }; + } + return themes; } @@ -815,7 +832,7 @@ public class SnarkManager implements CompleteListener { } } - if (startDelay != null){ + if (startDelay != null && _context.isRouterContext()) { int minutes = _util.getStartupDelay(); try { minutes = Integer.parseInt(startDelay.trim()); } catch (NumberFormatException nfe) {} if ( minutes != _util.getStartupDelay()) { diff --git a/apps/i2psnark/java/src/org/klomp/snark/standalone/RunStandalone.java b/apps/i2psnark/java/src/org/klomp/snark/standalone/RunStandalone.java new file mode 100644 index 0000000000..521d0ec58b --- /dev/null +++ b/apps/i2psnark/java/src/org/klomp/snark/standalone/RunStandalone.java @@ -0,0 +1,62 @@ +package org.klomp.snark.standalone; + +import java.io.File; + +import net.i2p.I2PAppContext; +import net.i2p.apps.systray.UrlLauncher; +import net.i2p.jetty.JettyStart; + +/** + * @since moved from ../web and fixed in 0.9.27 + */ +public class RunStandalone { + + private final JettyStart _jettyStart; + private final I2PAppContext _context; + private int _port = 8002; + private String _host = "127.0.0.1"; + + private RunStandalone(String args[]) throws Exception { + _context = I2PAppContext.getGlobalContext(); + File base = _context.getBaseDir(); + File xml = new File(base, "jetty-i2psnark.xml"); + _jettyStart = new JettyStart(_context, null, new String[] { xml.getAbsolutePath() } ); + if (args.length > 1) { + _port = Integer.parseInt(args[1]); + } + if (args.length > 0) { + _host = args[0]; + } + } + + /** + * Usage: RunStandalone [host [port]] (but must match what's in the jetty-i2psnark.xml file) + */ + public static void main(String args[]) { + try { + RunStandalone runner = new RunStandalone(args); + runner.start(); + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + } + + public void start() { + try { + _jettyStart.startup(); + String url = "http://" + _host + ':' + _port + "/i2psnark/"; + try { + Thread.sleep(1000); + } catch (InterruptedException ie) {} + UrlLauncher launch = new UrlLauncher(_context, null, new String[] { url } ); + launch.startup(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void stop() { + _jettyStart.shutdown(null); + } +} diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index 74688f2c72..fd914e27bc 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -4,7 +4,6 @@ import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.Serializable; -import java.text.Collator; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -192,7 +191,10 @@ public class I2PSnarkServlet extends BasicServlet { return; } - _themePath = "/themes/snark/" + _manager.getTheme() + '/'; + if (_context.isRouterContext()) + _themePath = "/themes/snark/" + _manager.getTheme() + '/'; + else + _themePath = _contextPath + WARBASE + "themes/snark/" + _manager.getTheme() + '/'; _imgPath = _themePath + "images/"; req.setCharacterEncoding("UTF-8"); @@ -285,8 +287,9 @@ public class I2PSnarkServlet extends BasicServlet { if (!isConfigure) { delay = _manager.getRefreshDelaySeconds(); if (delay > 0) { + String jsPfx = _context.isRouterContext() ? "" : ".resources"; //out.write("\n"); - out.write("\n" + + out.write("\n" + "