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" +
"