From 65ae9138efca58cc740c307596f9d0afd430c0df Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Thu, 28 May 2009 13:49:57 +0000
Subject: [PATCH]     * Console:       - config.jsp now cause graceful restart 
    * UPnP:       - Tweak to help startup problems    * UDP:       - Only save
 IP when it changes

---
 .../net/i2p/router/web/ConfigNetHandler.java  | 26 ++++++++++++++-----
 apps/routerconsole/jsp/config.jsp             |  7 +++--
 .../net/i2p/router/transport/UPnPManager.java |  2 +-
 .../router/transport/udp/UDPTransport.java    |  9 ++++---
 4 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java
index 7167c893ad..a0a06a778c 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java
@@ -215,16 +215,16 @@ public class ConfigNetHandler extends FormHandler {
             if (switchRequired) {
                 _context.router().setConfigSetting(PROP_HIDDEN, "" + _hiddenMode);
                 if (_hiddenMode)
-                    addFormNotice("Gracefully restarting into Hidden Router Mode. Make sure you have no 0-1 length "
-                              + "<a href=\"configtunnels.jsp\">tunnels!</a>");
+                    addFormError("Gracefully restarting into Hidden Router Mode");
                 else
-                    addFormNotice("Gracefully restarting to exit Hidden Router Mode");
+                    addFormError("Gracefully restarting to exit Hidden Router Mode");
             }
 
             _context.router().setConfigSetting(Router.PROP_DYNAMIC_KEYS, "" + _dynamicKeys);
 
             if (Boolean.valueOf(_context.getProperty(TransportManager.PROP_ENABLE_UPNP)).booleanValue() !=
                 _upnp) {
+                // This is minor, don't set restartRequired
                 if (_upnp)
                     addFormNotice("Enabling UPnP, restart required to take effect");
                 else
@@ -240,9 +240,11 @@ public class ConfigNetHandler extends FormHandler {
             }
 
             // Time sync enable, means NOT disabled 
-            _context.router().setConfigSetting(Timestamper.PROP_DISABLED, "false");
+            // Hmm router sets this at startup, not required here
+            //_context.router().setConfigSetting(Timestamper.PROP_DISABLED, "false");
             
-            LoadTestManager.setEnableLoadTesting(_context, _enableLoadTesting);
+            // Hidden in the GUI
+            //LoadTestManager.setEnableLoadTesting(_context, _enableLoadTesting);
         }
         
         boolean saved = _context.router().saveConfig();
@@ -256,14 +258,24 @@ public class ConfigNetHandler extends FormHandler {
         if (switchRequired) {
             hiddenSwitch();
         } else if (restartRequired) {
+            // Wow this dumps all conns immediately and really isn't nice
             //addFormNotice("Performing a soft restart");
             //_context.router().restart();
             //addFormNotice("Soft restart complete");
+
             // Most of the time we aren't changing addresses, just enabling or disabling
             // things, so let's try just a new routerInfo and see how that works.
             // Maybe we should restart if we change addresses though?
-            _context.router().rebuildRouterInfo();
-            addFormNotice("Router Info rebuilt");
+            // No, this doesn't work well, really need to call SSU Transport externalAddressReceived(),
+            // but that's hard to get to, and doesn't handle port changes, etc.
+            // So don't do this...
+            //_context.router().rebuildRouterInfo();
+            //addFormNotice("Router Info rebuilt");
+
+            // There's a few changes that don't really require restart (e.g. enabling inbound TCP)
+            // But it would be hard to get right, so just do a restart.
+            addFormError("Gracefully restarting I2P to change published router address");
+            _context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART);
         }
     }
 
diff --git a/apps/routerconsole/jsp/config.jsp b/apps/routerconsole/jsp/config.jsp
index 3e5d5893fb..932131e188 100644
--- a/apps/routerconsole/jsp/config.jsp
+++ b/apps/routerconsole/jsp/config.jsp
@@ -115,7 +115,7 @@
     %>
     <br />
     <input type="radio" name="udpAutoIP" value="hidden" <%=nethelper.getUdpAutoIPChecked(2) %> />
-    Hidden mode - do not publish IP <i>(prevents participating traffic; change restarts router)</i><br />
+    Hidden mode - do not publish IP <i>(prevents participating traffic)</i><br />
  </p><p>
  <b>UDP Configuration:</b><br />
  UDP port:
@@ -142,7 +142,7 @@
     <input type="radio" name="ntcpAutoIP" value="false" <%=nethelper.getTcpAutoIPChecked(0) %> />
     Disable inbound (Firewalled)<br />
     <input type="radio" name="ntcpAutoIP" value="disabled" <%=nethelper.getTcpAutoIPChecked(4) %> />
-    Completely disable <i>(select only if behind a firewall that throttles or blocks outbound TCP - change requires restart)</i><br />
+    Completely disable <i>(select only if behind a firewall that throttles or blocks outbound TCP)</i><br />
  </p><p>
  Externally reachable TCP port:<br />
     <input type="radio" name="ntcpAutoPort" value="2" <%=nethelper.getTcpAutoPortChecked(2) %> />
@@ -151,8 +151,7 @@
     <input type="radio" name="ntcpAutoPort" value="1" <%=nethelper.getTcpAutoPortChecked(1) %> />
     Specify Port:
     <input name ="ntcpport" type="text" size="5" maxlength="5" value="<jsp:getProperty name="nethelper" property="ntcpport" />" /><br />
- </p><p><b>Note: changing any of these settings will terminate all of your connections and effectively
-    restart your router.</b>
+ </p><p><b>Note: Changing these settings will restart your router.</b>
  </p>
  <input type="submit" name="save" value="Save changes" /> <input type="reset" value="Cancel" /><br />
  <hr />
diff --git a/router/java/src/net/i2p/router/transport/UPnPManager.java b/router/java/src/net/i2p/router/transport/UPnPManager.java
index 3f6d00b871..6201d56d97 100644
--- a/router/java/src/net/i2p/router/transport/UPnPManager.java
+++ b/router/java/src/net/i2p/router/transport/UPnPManager.java
@@ -30,7 +30,7 @@ public class UPnPManager {
     private RouterContext _context;
     private UPnP _upnp;
     private UPnPCallback _upnpCallback;
-    private boolean _isRunning;
+    private volatile boolean _isRunning;
     private InetAddress _detectedAddress;
     private TransportManager _manager;
     /**
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
index a0e76bfbda..3871fbdc0a 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -477,9 +477,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             // queue a country code lookup of the new IP
             _context.commSystem().queueLookup(ourIP);
             // store these for laptop-mode (change ident on restart... or every time... when IP changes)
-            _context.router().setConfigSetting(PROP_IP, _externalListenHost.getHostAddress());
-            _context.router().setConfigSetting(PROP_IP_CHANGE, "" + _context.clock().now());
-            _context.router().saveConfig();
+            String oldIP = _context.getProperty(PROP_IP);
+            if (!_externalListenHost.getHostAddress().equals(oldIP)) {
+                _context.router().setConfigSetting(PROP_IP, _externalListenHost.getHostAddress());
+                _context.router().setConfigSetting(PROP_IP_CHANGE, "" + _context.clock().now());
+                _context.router().saveConfig();
+            }
             _context.router().rebuildRouterInfo();
         }
         _testEvent.forceRun();
-- 
GitLab