From 9cc96f45d01d4337c9feadb5155a1d60d87c11c5 Mon Sep 17 00:00:00 2001
From: jrandom <jrandom>
Date: Sat, 14 Aug 2004 02:03:45 +0000
Subject: [PATCH] * add a main() to TunnelControllerGroup which can be used as
 a clientApp.* * new config property to have a tunnel start on load
 (default=true), so tunnels, er, start on load * use i2ptunnel.config instead
 of i2ptunnel.cfg (for consistency) * minor refactoring

---
 .../net/i2p/i2ptunnel/TunnelController.java   |  3 ++
 .../i2p/i2ptunnel/TunnelControllerGroup.java  | 44 +++++++++++++++++--
 .../i2ptunnel/WebEditPageFormGenerator.java   |  6 +++
 .../net/i2p/i2ptunnel/WebEditPageHelper.java  | 12 ++++-
 .../i2p/i2ptunnel/WebStatusPageHelper.java    | 12 +----
 installer/java/src/i2ptunnel.config           | 22 ++++++++++
 installer/java/src/router.config.template     |  8 ++++
 7 files changed, 92 insertions(+), 15 deletions(-)
 create mode 100644 installer/java/src/i2ptunnel.config

diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
index 2b301ca5b9..7141e17384 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 c542f5f18f..b821fe9f24 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 static TunnelControllerGroup _instance;
+    static final String DEFAULT_CONFIG_FILE = "i2ptunnel.config";
+    
     private List _controllers;
-    private static TunnelControllerGroup _instance = new TunnelControllerGroup();
-    public static TunnelControllerGroup getInstance() { return _instance; }
+    private String _configFile = DEFAULT_CONFIG_FILE;
     
-    private TunnelControllerGroup() { 
+    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 43cf004225..eea5e3dd38 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("\" /><br />\n");
+        buf.append("<b>Start automatically?</b> \n");
+        buf.append("<input type=\"checkbox\" name=\"startOnLoad\" value=\"true\" ");
+        if (controller.getStartOnLoad())
+            buf.append(" checked=\"true\" />\n<br />\n");
+        else
+            buf.append(" />\n<br />\n");
     }
 
     /**
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageHelper.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageHelper.java
index 22f12c3423..8fbe2f9d38 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 75848eef6b..530e33c0c5 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 0000000000..aec56c630d
--- /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 bbe7b48d1a..67d6701b1d 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 
-- 
GitLab