diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
index 2b301ca5b..7141e1738 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
@@ -55,6 +55,8 @@ public class TunnelController implements Logging {
_running = false;
if (createKey)
createPrivateKey();
+ if (getStartOnLoad())
+ startTunnel();
}
private void createPrivateKey() {
@@ -241,6 +243,7 @@ public class TunnelController implements Logging {
public String getListenPort() { return _config.getProperty("listenPort"); }
public String getTargetDestination() { return _config.getProperty("targetDestination"); }
public String getProxyList() { return _config.getProperty("proxyList"); }
+ public boolean getStartOnLoad() { return "true".equalsIgnoreCase(_config.getProperty("startOnLoad", "true")); }
public boolean getIsRunning() { return _running; }
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java
index c542f5f18..b821fe9f2 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java
@@ -24,13 +24,36 @@ import net.i2p.util.Log;
*/
public class TunnelControllerGroup {
private Log _log;
- private List _controllers;
- private static TunnelControllerGroup _instance = new TunnelControllerGroup();
- public static TunnelControllerGroup getInstance() { return _instance; }
+ private static TunnelControllerGroup _instance;
+ static final String DEFAULT_CONFIG_FILE = "i2ptunnel.config";
- private TunnelControllerGroup() {
+ private List _controllers;
+ private String _configFile = DEFAULT_CONFIG_FILE;
+
+ public static TunnelControllerGroup getInstance() {
+ synchronized (TunnelControllerGroup.class) {
+ if (_instance == null)
+ _instance = new TunnelControllerGroup(DEFAULT_CONFIG_FILE);
+ return _instance;
+ }
+ }
+
+ private TunnelControllerGroup(String configFile) {
_log = I2PAppContext.getGlobalContext().logManager().getLog(TunnelControllerGroup.class);
_controllers = new ArrayList();
+ _configFile = configFile;
+ loadControllers(_configFile);
+ }
+
+ public static void main(String args[]) {
+ if ( (args == null) || (args.length <= 0) ) {
+ _instance = new TunnelControllerGroup(DEFAULT_CONFIG_FILE);
+ } else if (args.length == 1) {
+ _instance = new TunnelControllerGroup(args[0]);
+ } else {
+ System.err.println("Usage: TunnelControllerGroup [filename]");
+ return;
+ }
}
/**
@@ -58,6 +81,11 @@ public class TunnelControllerGroup {
_log.info(i + " controllers loaded from " + configFile);
}
+ public void reloadControllers() {
+ unloadControllers();
+ loadControllers(_configFile);
+ }
+
/**
* Stop and remove reference to all known tunnels (but dont delete any config
* file or do other silly things)
@@ -158,11 +186,20 @@ public class TunnelControllerGroup {
return msgs;
}
+ /**
+ * Save the configuration of all known tunnels to the default config
+ * file
+ *
+ */
+ public void saveConfig() {
+ saveConfig(_configFile);
+ }
/**
* Save the configuration of all known tunnels to the given file
*
*/
public void saveConfig(String configFile) {
+ _configFile = configFile;
File cfgFile = new File(configFile);
File parent = cfgFile.getParentFile();
if ( (parent != null) && (!parent.exists()) )
@@ -246,4 +283,5 @@ public class TunnelControllerGroup {
* @return list of TunnelController objects
*/
public List getControllers() { return _controllers; }
+
}
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageFormGenerator.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageFormGenerator.java
index 43cf00422..eea5e3dd3 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageFormGenerator.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageFormGenerator.java
@@ -281,6 +281,12 @@ class WebEditPageFormGenerator {
}
}
buf.append("\" />
\n");
+ buf.append("Start automatically? \n");
+ buf.append("\n
\n");
+ else
+ buf.append(" />\n
\n");
}
/**
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageHelper.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageHelper.java
index 22f12c342..8fbe2f9d3 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageHelper.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageHelper.java
@@ -38,6 +38,7 @@ public class WebEditPageHelper {
private String _targetHost;
private String _targetPort;
private String _privKeyFile;
+ private boolean _startOnLoad;
private boolean _privKeyGenerate;
private boolean _removeConfirmed;
@@ -156,6 +157,13 @@ public class WebEditPageHelper {
public void setRemoveConfirm(String moo) {
_removeConfirmed = true;
}
+ /**
+ * If called with any value, we want this tunnel to start whenever it is
+ * loaded (aka right now and whenever the router is started up)
+ */
+ public void setStartOnLoad(String moo) {
+ _startOnLoad = true;
+ }
/**
* Process the form and display any resulting messages
@@ -248,7 +256,7 @@ public class WebEditPageHelper {
return getMessages(doSave());
}
private List doSave() {
- TunnelControllerGroup.getInstance().saveConfig(WebStatusPageHelper.CONFIG_FILE);
+ TunnelControllerGroup.getInstance().saveConfig();
return TunnelControllerGroup.getInstance().clearAllMessages();
}
@@ -320,6 +328,8 @@ public class WebEditPageHelper {
}
}
+ config.setProperty("startOnLoad", _startOnLoad + "");
+
if (_tunnelCount != null)
config.setProperty("option.tunnels.numInbound", _tunnelCount);
if (_tunnelDepth != null)
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebStatusPageHelper.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebStatusPageHelper.java
index 75848eef6..530e33c0c 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebStatusPageHelper.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebStatusPageHelper.java
@@ -17,20 +17,11 @@ public class WebStatusPageHelper {
private Log _log;
private String _action;
private int _controllerNum;
- private static boolean _configLoaded = false;
-
- static final String CONFIG_FILE = "i2ptunnel.cfg";
public WebStatusPageHelper() {
_action = null;
_controllerNum = -1;
_log = I2PAppContext.getGlobalContext().logManager().getLog(WebStatusPageHelper.class);
- synchronized (WebStatusPageHelper.class) {
- if (!_configLoaded) {
- reloadConfig();
- _configLoaded = true;
- }
- }
}
public void setAction(String action) {
@@ -113,8 +104,7 @@ public class WebStatusPageHelper {
return getMessages(msgs);
}
private String reloadConfig() {
- TunnelControllerGroup.getInstance().unloadControllers();
- TunnelControllerGroup.getInstance().loadControllers(CONFIG_FILE);
+ TunnelControllerGroup.getInstance().reloadControllers();
return "Config reloaded";
}
private String start() {
diff --git a/installer/java/src/i2ptunnel.config b/installer/java/src/i2ptunnel.config
new file mode 100644
index 000000000..aec56c630
--- /dev/null
+++ b/installer/java/src/i2ptunnel.config
@@ -0,0 +1,22 @@
+tunnel.0.description=HTTP proxy for browsing eepsites and the web
+tunnel.0.i2cpHost=localhost
+tunnel.0.i2cpPort=7654
+tunnel.0.interface=127.0.0.1
+tunnel.0.listenPort=4444
+tunnel.0.name=eepProxy
+tunnel.0.option.tunnels.depthInbound=2
+tunnel.0.option.tunnels.numInbound=2
+tunnel.0.proxyList=squid.i2p
+tunnel.0.startOnLoad=true
+tunnel.0.type=httpclient
+tunnel.1.description=IRC proxy to access the anonymous irc net
+tunnel.1.i2cpHost=localhost
+tunnel.1.i2cpPort=7654
+tunnel.1.interface=127.0.0.1
+tunnel.1.listenPort=6668
+tunnel.1.name=ircProxy
+tunnel.1.option.tunnels.depthInbound=2
+tunnel.1.option.tunnels.numInbound=2
+tunnel.1.startOnLoad=true
+tunnel.1.targetDestination=irc.duck.i2p
+tunnel.1.type=client
diff --git a/installer/java/src/router.config.template b/installer/java/src/router.config.template
index bbe7b48d1..67d6701b1 100644
--- a/installer/java/src/router.config.template
+++ b/installer/java/src/router.config.template
@@ -148,6 +148,14 @@ clientApp.1.args=-nocli -e "config localhost ##_router_i2cp_port##" -e "httpclie
# -e "listen_on 0.0.0.0"
# before the -e "httpclient 4444". otherwise, both of these proxies will only listen for connections on 127.0.0.1
+# The following three lines replace the clientApp.1.* lines above, for use with the new router console.
+# It loads up all of the tunnels (2 minutes later, giving the router time to boot), and starts any defined with
+# startOnLoad. It can be further controlled at http://localhost:7657/i2ptunnel/
+#
+#clientApp.1.main=net.i2p.i2ptunnel.TunnelControllerGroup
+#clientApp.1.name=Tunnels
+#clientApp.1.args=i2ptunnel.config
+
# New router console webapp, driven by Jetty
# to use, you must mkdir ./webapps/ and place the routerconsole.war file in there,
# and add jetty-all.jar and routerconsole.jar in the router's classpath in the startRouter