diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index b34144032..0c1fb1174 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -210,54 +210,15 @@ public class SummaryBarRenderer { .append(_("Network")) .append(": ") .append(_helper.getReachability()) - .append("
\n"); + .append("
\n") - // display all the time so we display the final failure message, and plugin update messages too - String status = UpdateHandler.getStatus(); - if (status.length() > 0) { - buf.append("

").append(status).append("


\n"); - } - if (_helper.updateAvailable() || _helper.unsignedUpdateAvailable()) { - if ("true".equals(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS))) { - // nothing - } else if( - // isDone() is always false for now, see UpdateHandler - // ((!update.isDone()) && - _helper.getAction() == null && - _helper.getUpdateNonce() == null && - ConfigRestartBean.getRestartTimeRemaining() > 12*60*1000) { - long nonce = _context.random().nextLong(); - String prev = System.getProperty("net.i2p.router.web.UpdateHandler.nonce"); - if (prev != null) - System.setProperty("net.i2p.router.web.UpdateHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.UpdateHandler.nonce", nonce+""); - String uri = _helper.getRequestURI(); - buf.append("
\n"); - buf.append("\n"); - if (_helper.updateAvailable()) { - buf.append("
\n"); - } - if (_helper.unsignedUpdateAvailable()) { - buf.append("
\n"); - } - buf.append("
\n"); - } - } + .append(_helper.getUpdateStatus()) + .append(_helper.getRestartStatus()) - buf.append(ConfigRestartBean.renderStatus(_helper.getRequestURI(), _helper.getAction(), _helper.getConsoleNonce())) - .append("

") @@ -451,7 +412,9 @@ public class SummaryBarRenderer { "

") .append(_(_helper.getTunnelStatus())) .append("


\n") - .append(_helper.getDestinations()); + + .append(_helper.getDestinations()) + .append("
\n"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 5ac51b7a3..f28282fea 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -27,6 +27,8 @@ import net.i2p.stat.RateStat; /** * Simple helper to query the appropriate router for data necessary to render * the summary sections on the router console. + * + * For the full summary bar use renderSummaryBar() */ public class SummaryHelper extends HelperBase { @@ -412,7 +414,7 @@ public class SummaryHelper extends HelperBase { } else { buf.append("
").append(_("none")).append("
"); } - buf.append("
\n"); + buf.append("\n"); return buf.toString(); } @@ -604,6 +606,62 @@ public class SummaryHelper extends HelperBase { return NewsFetcher.getInstance(_context).unsignedUpdateVersion(); } + /** + * The update status and buttons + * @since 0.8.13 moved from SummaryBarRenderer + */ + public String getUpdateStatus() { + StringBuilder buf = new StringBuilder(512); + // display all the time so we display the final failure message, and plugin update messages too + String status = UpdateHandler.getStatus(); + if (status.length() > 0) { + buf.append("

").append(status).append("


\n"); + } + if (updateAvailable() || unsignedUpdateAvailable()) { + if ("true".equals(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS))) { + // nothing + } else if( + // isDone() is always false for now, see UpdateHandler + // ((!update.isDone()) && + getAction() == null && + getUpdateNonce() == null && + ConfigRestartBean.getRestartTimeRemaining() > 12*60*1000) { + long nonce = _context.random().nextLong(); + String prev = System.getProperty("net.i2p.router.web.UpdateHandler.nonce"); + if (prev != null) + System.setProperty("net.i2p.router.web.UpdateHandler.noncePrev", prev); + System.setProperty("net.i2p.router.web.UpdateHandler.nonce", nonce+""); + String uri = getRequestURI(); + buf.append("
\n"); + buf.append("\n"); + if (updateAvailable()) { + buf.append("
\n"); + } + if (unsignedUpdateAvailable()) { + buf.append("
\n"); + } + buf.append("
\n"); + } + } + return buf.toString(); + } + + /** + * The restart status and buttons + * @since 0.8.13 moved from SummaryBarRenderer + */ + public String getRestartStatus() { + return ConfigRestartBean.renderStatus(getRequestURI(), getAction(), getConsoleNonce()); + } + /** output the summary bar to _out */ public void renderSummaryBar() throws IOException { SummaryBarRenderer renderer = new SummaryBarRenderer(_context, this); diff --git a/build.xml b/build.xml index 6365da50b..91abfea56 100644 --- a/build.xml +++ b/build.xml @@ -443,50 +443,82 @@ - + - + + - + - + + - + - + + - + + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1235,7 +1267,7 @@ - + diff --git a/history.txt b/history.txt index cd939af9c..6e3942de7 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,12 @@ +2012-01-22 zzz + * Transports: Bind only to a single interface if specified + as the host address and it's available (ticket #591) + * VMCommSystem: Move to dummy directory + +2012-01-21 zzz + * Build: Fix Windows build, version checking for release + * Console summary bar: Move some code around + 2012-01-20 sponge * Fix too short of delay for http. It is up to the browser to time out in a shorter time, not the proxy. This is wreaking havoc on large diff --git a/router/java/src/net/i2p/router/RouterContext.java b/router/java/src/net/i2p/router/RouterContext.java index d16f3b391..5c5b4a2ca 100644 --- a/router/java/src/net/i2p/router/RouterContext.java +++ b/router/java/src/net/i2p/router/RouterContext.java @@ -20,7 +20,6 @@ import net.i2p.router.peermanager.ProfileOrganizer; import net.i2p.router.transport.CommSystemFacadeImpl; import net.i2p.router.transport.FIFOBandwidthLimiter; import net.i2p.router.transport.OutboundMessageRegistry; -import net.i2p.router.transport.VMCommSystem; import net.i2p.router.tunnel.TunnelDispatcher; import net.i2p.router.tunnel.pool.TunnelPoolManager; import net.i2p.util.Clock; diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index c10128fe6..fecba78d6 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 6; + public final static long BUILD = 7; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/transport/VMCommSystem.java b/router/java/src/net/i2p/router/dummy/VMCommSystem.java similarity index 99% rename from router/java/src/net/i2p/router/transport/VMCommSystem.java rename to router/java/src/net/i2p/router/dummy/VMCommSystem.java index 2e5426f08..4c905e0b3 100644 --- a/router/java/src/net/i2p/router/transport/VMCommSystem.java +++ b/router/java/src/net/i2p/router/dummy/VMCommSystem.java @@ -1,4 +1,4 @@ -package net.i2p.router.transport; +package net.i2p.router.dummy; import java.io.IOException; import java.io.OutputStream; diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java index de39759ea..ac6856a5b 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -13,6 +13,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeSet; @@ -30,6 +31,7 @@ import net.i2p.router.transport.CommSystemFacadeImpl; import net.i2p.router.transport.Transport; import net.i2p.router.transport.TransportBid; import net.i2p.router.transport.TransportImpl; +import net.i2p.util.Addresses; import net.i2p.util.ConcurrentHashSet; import net.i2p.util.Log; import net.i2p.util.Translate; @@ -515,6 +517,23 @@ public class NTCPTransport extends TransportImpl { if (_myAddress != null) { InetAddress bindToAddr = null; String bindTo = _context.getProperty(PROP_BIND_INTERFACE); + + if (bindTo == null) { + // If we are configured with a fixed IP address, + // AND it's one of our local interfaces, + // bind only to that. + boolean isFixed = _context.getProperty(CommSystemFacadeImpl.PROP_I2NP_NTCP_AUTO_IP, "true") + .toLowerCase(Locale.US).equals("false"); + String fixedHost = _context.getProperty(CommSystemFacadeImpl.PROP_I2NP_NTCP_HOSTNAME); + if (isFixed && fixedHost != null) { + try { + String testAddr = InetAddress.getByName(fixedHost).getHostAddress(); + if (Addresses.getAddresses().contains(testAddr)) + bindTo = testAddr; + } catch (UnknownHostException uhe) {} + } + } + if (bindTo != null) { try { bindToAddr = InetAddress.getByName(bindTo); @@ -532,10 +551,13 @@ public class NTCPTransport extends TransportImpl { chan.configureBlocking(false); InetSocketAddress addr = null; - if(bindToAddr==null) + if(bindToAddr==null) { addr = new InetSocketAddress(_myAddress.getPort()); - else + } else { addr = new InetSocketAddress(bindToAddr, _myAddress.getPort()); + if (_log.shouldLog(Log.WARN)) + _log.warn("Binding only to " + bindToAddr); + } chan.socket().bind(addr); if (_log.shouldLog(Log.INFO)) _log.info("Listening on " + addr); 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 3f233c53c..11b3e29d0 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -35,6 +35,7 @@ import net.i2p.router.transport.Transport; import net.i2p.router.transport.TransportBid; import net.i2p.router.transport.TransportImpl; import net.i2p.router.util.RandomIterator; +import net.i2p.util.Addresses; import net.i2p.util.ConcurrentHashSet; import net.i2p.util.Log; import net.i2p.util.SimpleScheduler; @@ -255,6 +256,21 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority // bind host String bindTo = _context.getProperty(PROP_BIND_INTERFACE); + + if (bindTo == null) { + // If we are configured with a fixed IP address, + // AND it's one of our local interfaces, + // bind only to that. + String fixedHost = _context.getProperty(PROP_EXTERNAL_HOST); + if (fixedHost != null && fixedHost.length() > 0) { + try { + String testAddr = InetAddress.getByName(fixedHost).getHostAddress(); + if (Addresses.getAddresses().contains(testAddr)) + bindTo = testAddr; + } catch (UnknownHostException uhe) {} + } + } + InetAddress bindToAddr = null; if (bindTo != null) { try { @@ -281,6 +297,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } else { port = _externalListenPort; } + if (bindToAddr != null && _log.shouldLog(Log.WARN)) + _log.warn("Binding only to " + bindToAddr); if (_log.shouldLog(Log.INFO)) _log.info("Binding to the port: " + port); if (_endpoint == null) {