tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ma...@apache.org
Subject svn commit: r1498340 - in /tomcat/trunk: java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java java/org/apache/catalina/mbeans/LocalStrings.properties webapps/docs/config/listeners.xml
Date Mon, 01 Jul 2013 09:50:39 GMT
Author: markt
Date: Mon Jul  1 09:50:38 2013
New Revision: 1498340

URL: http://svn.apache.org/r1498340
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=55017
Add the ability to configure the RMO bind address when using the JXM remote listener.
Patch provided by Alexey Noskov.

Modified:
    tomcat/trunk/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java
    tomcat/trunk/java/org/apache/catalina/mbeans/LocalStrings.properties
    tomcat/trunk/webapps/docs/config/listeners.xml

Modified: tomcat/trunk/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java?rev=1498340&r1=1498339&r2=1498340&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java (original)
+++ tomcat/trunk/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java Mon Jul 
1 09:50:38 2013
@@ -20,8 +20,11 @@ package org.apache.catalina.mbeans;
 import java.io.IOException;
 import java.io.Serializable;
 import java.lang.management.ManagementFactory;
+import java.net.InetAddress;
 import java.net.MalformedURLException;
+import java.net.ServerSocket;
 import java.net.Socket;
+import java.net.UnknownHostException;
 import java.rmi.RemoteException;
 import java.rmi.registry.LocateRegistry;
 import java.rmi.server.RMIClientSocketFactory;
@@ -61,6 +64,7 @@ public class JmxRemoteLifecycleListener 
     protected static final StringManager sm =
         StringManager.getManager(Constants.Package);
 
+    protected String rmiBindAddress = null;
     protected int rmiRegistryPortPlatform = -1;
     protected int rmiServerPortPlatform = -1;
     protected boolean rmiSSL = true;
@@ -76,6 +80,22 @@ public class JmxRemoteLifecycleListener 
     protected JMXConnectorServer csPlatform = null;
 
     /**
+     * Get the inet address on which the Platform RMI server is exported.
+     * @return The textual representation of inet address
+     */
+    public String getRmiBindAddress() {
+        return rmiBindAddress;
+    }
+
+    /**
+     * Set the inet address on which the Platform RMI server is exported.
+     * @param theRmiBindAddress The textual representation of inet address
+     */
+    public void setRmiBindAddress(String theRmiBindAddress) {
+        rmiBindAddress = theRmiBindAddress;
+    }
+
+    /**
      * Get the port on which the Platform RMI server is exported. This is the
      * port that is normally chosen by the RMI stack.
      * @return The port number
@@ -189,11 +209,28 @@ public class JmxRemoteLifecycleListener 
 
             // Configure SSL for RMI connection if required
             if (rmiSSL) {
+                if (rmiBindAddress != null) {
+                    throw new IllegalStateException(sm.getString(
+                            "jmxRemoteLifecycleListener.sslRmiBindAddress"));
+                }
+
                 csf = new SslRMIClientSocketFactory();
                 ssf = new SslRMIServerSocketFactory(ciphers, protocols,
                             clientAuth);
             }
 
+            // Force server bind address if required
+            if (rmiBindAddress != null) {
+                try {
+                    ssf = new RmiServerBindSocketFactory(
+                            InetAddress.getByName(rmiBindAddress));
+                } catch (UnknownHostException e) {
+                    log.error(sm.getString(
+                            "jmxRemoteLifecycleListener.invalidRmiBindAddress",
+                            rmiBindAddress), e);
+                }
+            }
+
             // Force the use of local ports if required
             if (useLocalPorts) {
                 csf = new RmiClientLocalhostSocketFactory(csf);
@@ -219,7 +256,7 @@ public class JmxRemoteLifecycleListener 
 
             // Create the Platform server
             csPlatform = createServer("Platform", rmiRegistryPortPlatform,
-                    rmiServerPortPlatform, env,
+                    rmiServerPortPlatform, env, csf, ssf,
                     ManagementFactory.getPlatformMBeanServer());
 
         } else if (Lifecycle.STOP_EVENT == event.getType()) {
@@ -229,11 +266,12 @@ public class JmxRemoteLifecycleListener 
 
     private JMXConnectorServer createServer(String serverName,
             int theRmiRegistryPort, int theRmiServerPort,
-            HashMap<String,Object> theEnv, MBeanServer theMBeanServer) {
+            HashMap<String,Object> theEnv, RMIClientSocketFactory csf,
+            RMIServerSocketFactory ssf, MBeanServer theMBeanServer) {
 
         // Create the RMI registry
         try {
-            LocateRegistry.createRegistry(theRmiRegistryPort);
+            LocateRegistry.createRegistry(theRmiRegistryPort, csf, ssf);
         } catch (RemoteException e) {
             log.error(sm.getString(
                     "jmxRemoteLifecycleListener.createRegistryFailed",
@@ -289,7 +327,8 @@ public class JmxRemoteLifecycleListener 
     }
 
     public static class RmiClientLocalhostSocketFactory
-    implements RMIClientSocketFactory, Serializable {
+            implements RMIClientSocketFactory, Serializable {
+
         private static final long serialVersionUID = 1L;
 
         private static final String FORCED_HOST = "localhost";
@@ -308,7 +347,20 @@ public class JmxRemoteLifecycleListener 
                 return factory.createSocket(FORCED_HOST, port);
             }
         }
+    }
+
+    public static class RmiServerBindSocketFactory
+            implements RMIServerSocketFactory {
 
+        private final InetAddress bindAddress;
 
+        public RmiServerBindSocketFactory(InetAddress address) {
+            bindAddress = address;
+        }
+
+        @Override
+        public ServerSocket createServerSocket(int port) throws IOException  {
+            return new ServerSocket(port, 0, bindAddress);
+        }
     }
 }

Modified: tomcat/trunk/java/org/apache/catalina/mbeans/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/mbeans/LocalStrings.properties?rev=1498340&r1=1498339&r2=1498340&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/mbeans/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/mbeans/LocalStrings.properties Mon Jul  1 09:50:38
2013
@@ -18,5 +18,7 @@ jmxRemoteLifecycleListener.createServerF
 jmxRemoteLifecycleListener.destroyServerFailed=The JMX connector server could not be stopped
for the {0} server
 jmxRemoteLifecycleListener.invalidURL=The JMX Service URL requested for the {0} server, "{1}",
was invalid
 jmxRemoteLifecycleListener.start=The JMX Remote Listener has configured the registry on port
{0} and the server on port {1} for the {2} server
+jmxRemoteLifecycleListener.sslRmiBindAddress=rmiBindAddress is incompatible with setting
the system property com.sun.management.jmxremote.ssl to true
+jmxRemoteLifecycleListener.invalidRmiBindAddress=Invalid RMI bind address [{0}]
 
 mBeanFactory.managerContext=Manager components may only be added to Contexts.

Modified: tomcat/trunk/webapps/docs/config/listeners.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/listeners.xml?rev=1498340&r1=1498339&r2=1498340&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/listeners.xml (original)
+++ tomcat/trunk/webapps/docs/config/listeners.xml Mon Jul  1 09:50:38 2013
@@ -434,6 +434,13 @@
         <p>The port to be used by the Platform JMX/RMI server.</p>
       </attribute>
 
+      <attribute name="rmiBindAddress" required="false">
+        <p>The address of the interface to be used by JMX/RMI server. Setting
+        this option to <code>true</code> is incompatible with setting the system
+        property <code>com.sun.management.jmxremote.ssl</code> to
+        <code>true</code>.</p>
+      </attribute>
+
       <attribute name="useLocalPorts" required="false">
         <p>Should any clients using these ports be forced to use local ports to
         connect to the the JMX/RMI server. This is useful when tunnelling



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Mime
View raw message