diff --git a/apps/i2psnark/java/build.xml b/apps/i2psnark/java/build.xml
index 3d23a8ba6..627f68e42 100644
--- a/apps/i2psnark/java/build.xml
+++ b/apps/i2psnark/java/build.xml
@@ -4,8 +4,8 @@
-
-
+
+
@@ -29,9 +29,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
index e970a6954..4651cbdfb 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
@@ -192,6 +192,15 @@ public class I2PSnarkUtil {
/** hook between snark's logger and an i2p log */
void debug(String msg, int snarkDebugLevel, Throwable t) {
+ if (t instanceof OutOfMemoryError) {
+ try { Thread.sleep(100); } catch (InterruptedException ie) {}
+ try {
+ t.printStackTrace();
+ } catch (Throwable tt) {}
+ try {
+ System.out.println("OOM thread: " + Thread.currentThread().getName());
+ } catch (Throwable tt) {}
+ }
switch (snarkDebugLevel) {
case 0:
case 1:
diff --git a/apps/i2psnark/java/src/org/klomp/snark/Peer.java b/apps/i2psnark/java/src/org/klomp/snark/Peer.java
index ef3fe2b27..5a8d6f09e 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Peer.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Peer.java
@@ -283,6 +283,9 @@ public class Peer implements Comparable
PeerConnectionOut out = s.out;
if (out != null)
out.disconnect();
+ PeerListener pl = s.listener;
+ if (pl != null)
+ pl.disconnected(this);
}
}
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java
index 35b428a9c..83a04e0ce 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java
@@ -172,8 +172,9 @@ class PeerConnectionIn implements Runnable
}
catch (Throwable t)
{
- Snark.debug(peer + ": " + t, Snark.ERROR);
- t.printStackTrace();
+ I2PSnarkUtil.instance().debug(peer.toString(), Snark.ERROR, t);
+ if (t instanceof OutOfMemoryError)
+ throw (OutOfMemoryError)t;
}
finally
{
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java
index 00f9f42fd..91562415e 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java
@@ -62,13 +62,13 @@ class PeerConnectionOut implements Runnable
{
try
{
- while (!quit)
+ while (!quit && peer.isConnected())
{
Message m = null;
PeerState state = null;
synchronized(sendQueue)
{
- while (!quit && sendQueue.isEmpty())
+ while (!quit && peer.isConnected() && sendQueue.isEmpty())
{
try
{
@@ -86,7 +86,7 @@ class PeerConnectionOut implements Runnable
}
}
state = peer.state;
- if (!quit && state != null)
+ if (!quit && state != null && peer.isConnected())
{
// Piece messages are big. So if there are other
// (control) messages make sure they are send first.
@@ -149,8 +149,9 @@ class PeerConnectionOut implements Runnable
}
catch (Throwable t)
{
- Snark.debug(peer + ": " + t, Snark.ERROR);
- t.printStackTrace();
+ I2PSnarkUtil.instance().debug(peer.toString(), Snark.ERROR, t);
+ if (t instanceof OutOfMemoryError)
+ throw (OutOfMemoryError)t;
}
finally
{
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
index 84666d9f0..3fa5144cf 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
@@ -536,8 +536,8 @@ public class PeerCoordinator implements PeerListener
public void disconnected(Peer peer)
{
- if (Snark.debug >= Snark.INFO)
- Snark.debug("Disconnected " + peer, Snark.INFO);
+ if (_log.shouldLog(Log.INFO))
+ _log.info("Disconnected " + peer);
synchronized(peers)
{
diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
index ab915f6fc..c29d2015e 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
@@ -231,8 +231,9 @@ public class TrackerClient extends I2PThread
}
catch (Throwable t)
{
- Snark.debug("TrackerClient: " + t, Snark.ERROR);
- t.printStackTrace();
+ I2PSnarkUtil.instance().debug("TrackerClient: " + t, Snark.ERROR, t);
+ if (t instanceof OutOfMemoryError)
+ throw (OutOfMemoryError)t;
}
finally
{
diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/RunStandalone.java b/apps/i2psnark/java/src/org/klomp/snark/web/RunStandalone.java
new file mode 100644
index 000000000..c3d4548ed
--- /dev/null
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/RunStandalone.java
@@ -0,0 +1,47 @@
+package org.klomp.snark.web;
+
+import java.io.File;
+
+import net.i2p.util.FileUtil;
+import org.mortbay.jetty.Server;
+
+public class RunStandalone {
+ private Server _server;
+
+ static {
+ System.setProperty("org.mortbay.http.Version.paranoid", "true");
+ System.setProperty("org.mortbay.xml.XmlParser.NotValidating", "true");
+ }
+
+ private RunStandalone(String args[]) {}
+
+ public static void main(String args[]) {
+ RunStandalone runner = new RunStandalone(args);
+ runner.start();
+ }
+
+ public void start() {
+ File workDir = new File("work");
+ boolean workDirRemoved = FileUtil.rmdir(workDir, false);
+ if (!workDirRemoved)
+ System.err.println("ERROR: Unable to remove Jetty temporary work directory");
+ boolean workDirCreated = workDir.mkdirs();
+ if (!workDirCreated)
+ System.err.println("ERROR: Unable to create Jetty temporary work directory");
+
+ try {
+ _server = new Server("jetty-i2psnark.xml");
+ _server.start();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void stop() {
+ try {
+ _server.stop();
+ } catch (InterruptedException ie) {
+ ie.printStackTrace();
+ }
+ }
+}
diff --git a/apps/i2psnark/jetty-i2psnark.xml b/apps/i2psnark/jetty-i2psnark.xml
new file mode 100644
index 000000000..bb0aab700
--- /dev/null
+++ b/apps/i2psnark/jetty-i2psnark.xml
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.0.0.0
+ 8002
+
+
+ 3
+ 10
+ 30000
+ 1000
+ 8443
+ 8443
+ main
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ i2psnark
+
+ /
+ i2psnark.war
+
+
+
+
+
+
+
+ ./logs/yyyy_mm_dd.i2psnark-request.log
+ 90
+ true
+ false
+ false
+ GMT
+
+
+
+
+
+
+ 2000
+ false
+
+
diff --git a/apps/i2psnark/readme-standalone.txt b/apps/i2psnark/readme-standalone.txt
new file mode 100644
index 000000000..2f641db89
--- /dev/null
+++ b/apps/i2psnark/readme-standalone.txt
@@ -0,0 +1,6 @@
+To run I2PSnark from the command line, run "java -jar lib/i2psnark.jar", but
+to run it with the web UI, run "java -jar launch-i2psnark.jar". I2PSnark is
+GPL'ed software, based on Snark (http://www.klomp.org/) to run on top of I2P
+(http://www.i2p.net/) within a webserver (such as the bundled Jetty from
+http://jetty.mortbay.org/). For more information about I2PSnark, get in touch
+with the folks at http://forum.i2p.net/
\ No newline at end of file
diff --git a/apps/syndie/java/src/net/i2p/syndie/web/RunStandalone.java b/apps/syndie/java/src/net/i2p/syndie/web/RunStandalone.java
index d5dcea0d1..ffef2957d 100644
--- a/apps/syndie/java/src/net/i2p/syndie/web/RunStandalone.java
+++ b/apps/syndie/java/src/net/i2p/syndie/web/RunStandalone.java
@@ -10,6 +10,7 @@ public class RunStandalone {
static {
System.setProperty("org.mortbay.http.Version.paranoid", "true");
+ System.setProperty("org.mortbay.xml.XmlParser.NotValidating", "true");
System.setProperty("syndie.rootDir", ".");
System.setProperty("syndie.defaultSingleUserArchives", "http://syndiemedia.i2p.net:8000/archive/archive.txt");
System.setProperty("syndie.defaultProxyHost", "");
diff --git a/build.xml b/build.xml
index ed229b8f4..ffc1b1afe 100644
--- a/build.xml
+++ b/build.xml
@@ -9,6 +9,7 @@
+
@@ -152,6 +153,7 @@
+
@@ -453,4 +455,8 @@
+
+
+
+
diff --git a/history.txt b/history.txt
index b6c11a1d4..2f4f98d16 100644
--- a/history.txt
+++ b/history.txt
@@ -1,4 +1,19 @@
-$Id: history.txt,v 1.361 2005/12/16 22:47:04 jrandom Exp $
+$Id: history.txt,v 1.362 2005/12/17 04:22:07 jrandom Exp $
+
+2005-12-18 jrandom
+ * Added a standalone runner for the I2PSnark web ui (build with the
+ command "ant i2psnark", unzip i2psnark-standalone.zip somewhere, run
+ with "java -jar launch-i2psnark.jar", and go to http://localhost:8002/).
+ * Further I2PSnark error handling
+
+2005-12-17 jrandom
+ * Let multiuser accounts authorize themselves to access the remote
+ functionality again (thanks Ch0Hag!)
+ * Adjust the JVM heap size to 128MB for new installs (existing users can
+ accomplish this by editing wrapper.config, adding the line
+ "wrapper.java.maxmemory=128", and then doing a full shutdown and startup
+ of the router). This is relevent for heavy usage of I2PSnark in the
+ router console.
2005-12-17 jrandom
* Use our faster SHA1, rather than the JVM's within I2PSnark, and let