diff --git a/jetty-documentation/src/main/asciidoc/administration/jmx/using-jmx.adoc b/jetty-documentation/src/main/asciidoc/administration/jmx/using-jmx.adoc index b14cb261df3..e9fb79f6a74 100644 --- a/jetty-documentation/src/main/asciidoc/administration/jmx/using-jmx.adoc +++ b/jetty-documentation/src/main/asciidoc/administration/jmx/using-jmx.adoc @@ -192,8 +192,14 @@ Examples: [source, screen, subs="{sub-order}"] ---- service:jmx:rmi:///jndi/rmi:///jmxrmi - rmi_server_host = any address + rmi_server_host = local host address rmi_server_port = randomly chosen + rmi_registry_host = local host address + rmi_registry_port = 1099 + +service:jmx:rmi://0.0.0.0:1099/jndi/rmi://0.0.0.0:1099/jmxrmi + rmi_server_host = any address + rmi_server_port = 1099 rmi_registry_host = any address rmi_registry_port = 1099 diff --git a/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java b/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java index 1901bd57252..f3da36675a6 100644 --- a/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java +++ b/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java @@ -232,7 +232,7 @@ public class ConnectorServer extends AbstractLifeCycle @Override public ServerSocket createServerSocket(int port) throws IOException { - InetAddress address = _host == null || _host.isEmpty() ? null : InetAddress.getByName(_host); + InetAddress address = _host == null || _host.isEmpty() ? InetAddress.getLocalHost() : InetAddress.getByName(_host); ServerSocket server = createServerSocket(address, port); _portConsumer.accept(server.getLocalPort()); return server; diff --git a/jetty-jmx/src/test/java/org/eclipse/jetty/jmx/ConnectorServerTest.java b/jetty-jmx/src/test/java/org/eclipse/jetty/jmx/ConnectorServerTest.java index 9bee1f6eb91..d7dac58a1a4 100644 --- a/jetty-jmx/src/test/java/org/eclipse/jetty/jmx/ConnectorServerTest.java +++ b/jetty-jmx/src/test/java/org/eclipse/jetty/jmx/ConnectorServerTest.java @@ -73,42 +73,63 @@ public class ConnectorServerTest } @Test - public void testNoRegistryHostBindsToAny() throws Exception + public void testNoRegistryHostBindsToHost() throws Exception { connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi:///jmxrmi"), objectName); connectorServer.start(); // Verify that I can connect to the RMI registry using a non-loopback address. new Socket(InetAddress.getLocalHost(), 1099).close(); - // Verify that I can connect to the RMI registry using the loopback address. - new Socket(InetAddress.getLoopbackAddress(), 1099).close(); + try + { + // Verify that I cannot connect to the RMI registry using the loopback address. + new Socket(InetAddress.getLoopbackAddress(), 1099).close(); + Assert.fail(); + } + catch (ConnectException ignored) + { + // Ignored. + } } @Test public void testNoRegistryHostNonDefaultRegistryPort() throws Exception { - int registryPort = 1299; + ServerSocket serverSocket = new ServerSocket(0); + int registryPort = serverSocket.getLocalPort(); + serverSocket.close(); connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:" + registryPort + "/jmxrmi"), objectName); connectorServer.start(); + // Verify that I can connect to the RMI registry using a non-loopback address. + new Socket(InetAddress.getLocalHost(), registryPort).close(); + try + { + // Verify that I cannot connect to the RMI registry using the loopback address. + new Socket(InetAddress.getLoopbackAddress(), registryPort).close(); + Assert.fail(); + } + catch (ConnectException ignored) + { + // Ignored. + } + } + + @Test + public void testAnyRegistryHostBindsToAny() throws Exception + { + ServerSocket serverSocket = new ServerSocket(0); + int registryPort = serverSocket.getLocalPort(); + serverSocket.close(); + connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi://0.0.0.0:" + registryPort + "/jmxrmi"), objectName); + connectorServer.start(); + // Verify that I can connect to the RMI registry using a non-loopback address. new Socket(InetAddress.getLocalHost(), registryPort).close(); // Verify that I can connect to the RMI registry using the loopback address. new Socket(InetAddress.getLoopbackAddress(), registryPort).close(); } - @Test - public void testNoRMIHostBindsToAny() throws Exception - { - connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi:///jmxrmi"), objectName); - connectorServer.start(); - - // Verify that I can connect to the RMI server using a non-loopback address. - new Socket(InetAddress.getLocalHost(), connectorServer.getAddress().getPort()).close(); - // Verify that I can connect to the RMI server using the loopback address. - new Socket(InetAddress.getLoopbackAddress(), connectorServer.getAddress().getPort()).close(); - } - @Test public void testLocalhostRegistryBindsToLoopback() throws Exception { @@ -134,6 +155,38 @@ public class ConnectorServerTest new Socket(loopback, 1099).close(); } + @Test + public void testNoRMIHostBindsToHost() throws Exception + { + connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi:///jmxrmi"), objectName); + connectorServer.start(); + + // Verify that I can connect to the RMI server using a non-loopback address. + new Socket(InetAddress.getLocalHost(), connectorServer.getAddress().getPort()).close(); + try + { + // Verify that I cannot connect to the RMI server using the loopback address. + new Socket(InetAddress.getLoopbackAddress(), connectorServer.getAddress().getPort()).close(); + Assert.fail(); + } + catch (ConnectException ignored) + { + // Ignored. + } + } + + @Test + public void testAnyRMIHostBindsToAny() throws Exception + { + connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi://0.0.0.0/jndi/rmi:///jmxrmi"), objectName); + connectorServer.start(); + + // Verify that I can connect to the RMI server using a non-loopback address. + new Socket(InetAddress.getLocalHost(), connectorServer.getAddress().getPort()).close(); + // Verify that I can connect to the RMI server using the loopback address. + new Socket(InetAddress.getLoopbackAddress(), connectorServer.getAddress().getPort()).close(); + } + @Test public void testLocalhostRMIBindsToLoopback() throws Exception { @@ -187,7 +240,10 @@ public class ConnectorServerTest // that can listen to 192.168.0.1:1099 and 127.0.0.1:1099 without problems. String host = "localhost"; - int port = 1399; + ServerSocket serverSocket = new ServerSocket(0); + int port = serverSocket.getLocalPort(); + serverSocket.close(); + connectorServer = new ConnectorServer(new JMXServiceURL("rmi", host, port, "/jndi/rmi://" + host + ":" + port + "/jmxrmi"), objectName); connectorServer.start(); diff --git a/tests/test-jmx/jmx-webapp-it/pom.xml b/tests/test-jmx/jmx-webapp-it/pom.xml index 09d73bb281b..ff88951b600 100644 --- a/tests/test-jmx/jmx-webapp-it/pom.xml +++ b/tests/test-jmx/jmx-webapp-it/pom.xml @@ -56,26 +56,14 @@ jmx-webapp runtime war - true - true + true + true true ${test-base-dir}/webapps - - org.apache.maven.plugins - maven-failsafe-plugin - - - - integration-test - verify - - - - diff --git a/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/JmxIT.java b/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/JmxIT.java index 22b36d6b176..6f9fda91a16 100644 --- a/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/JmxIT.java +++ b/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/JmxIT.java @@ -18,17 +18,13 @@ package org.eclipse.jetty.test.jmx; -import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.startsWith; -import static org.junit.Assert.assertThat; - import java.io.File; import java.io.InputStream; import java.lang.management.ManagementFactory; import java.net.HttpURLConnection; +import java.net.ServerSocket; import java.net.URI; +import java.util.concurrent.CountDownLatch; import javax.management.MBeanServerConnection; import javax.management.ObjectName; @@ -44,119 +40,120 @@ import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.webapp.Configuration; import org.eclipse.jetty.webapp.WebAppContext; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; -/** - * Some JMX information tests. - */ +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.startsWith; +import static org.junit.Assert.assertThat; + +@Ignore public class JmxIT { - private static JMXConnector __jmxc; - private static MBeanServerConnection __mbsc; - private static Server __server; - private static int __port; + private Server _server; + private JMXConnector _jmxc; + private MBeanServerConnection _mbsc; + private int _httpPort; + private JMXServiceURL _jmxURL; - @BeforeClass - public static void connectToMBeanServer() throws Exception + @Before + public void connectToMBeanServer() throws Exception { startJetty(); - JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://localhost:1099/jndi/rmi://localhost:1099/jmxrmi"); - __jmxc = JMXConnectorFactory.connect(url,null); - __mbsc = __jmxc.getMBeanServerConnection(); + + new CountDownLatch(1).await(); + + _jmxc = JMXConnectorFactory.connect(_jmxURL); + _mbsc = _jmxc.getMBeanServerConnection(); } - @AfterClass - public static void disconnectFromMBeanServer() throws Exception + @After + public void disconnectFromMBeanServer() throws Exception { + _jmxc.close(); stopJetty(); - __jmxc.close(); } - public static void startJetty() throws Exception + public void startJetty() throws Exception { File target = MavenTestingUtils.getTargetDir(); - File jettyBase = new File (target, "test-base"); - File webapps = new File (jettyBase, "webapps"); - File war = new File (webapps, "jmx-webapp.war"); + File jettyBase = new File(target, "test-base"); + File webapps = new File(jettyBase, "webapps"); + File war = new File(webapps, "jmx-webapp.war"); + + _server = new Server(0); - //create server instance - __server = new Server(0); - - //set up the webapp WebAppContext context = new WebAppContext(); - context.setWar(war.getCanonicalPath()); context.setContextPath("/jmx-webapp"); - Configuration.ClassList classlist = Configuration.ClassList - .setServerDefault(__server); + .setServerDefault(_server); classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.annotations.AnnotationConfiguration"); + context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", + ".*/javax.servlet-[^/]*\\.jar$|.*/servlet-api-[^/]*\\.jar$"); + _server.setHandler(context); - context.setAttribute( - "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", - ".*/javax.servlet-[^/]*\\.jar$|.*/servlet-api-[^/]*\\.jar$"); - __server.setHandler(context); - - //set up jmx remote MBeanContainer mbContainer = new MBeanContainer(ManagementFactory.getPlatformMBeanServer()); - __server.addBean(mbContainer); + _server.addBean(mbContainer); - JMXServiceURL serviceUrl = new JMXServiceURL("rmi", "localhost", 1099, "/jndi/rmi://localhost:1099/jmxrmi"); - ConnectorServer jmxConnServer = new ConnectorServer(serviceUrl, "org.eclipse.jetty.jmx:name=rmiconnectorserver"); - __server.addBean(jmxConnServer); + ServerSocket serverSocket = new ServerSocket(0); + int jmxPort = serverSocket.getLocalPort(); + serverSocket.close(); - //start server - __server.start(); - - //remember chosen port - __port = ((NetworkConnector)__server.getConnectors()[0]).getLocalPort(); + _jmxURL = new JMXServiceURL("rmi", "0.0.0.0", jmxPort, "/jndi/rmi://0.0.0.0:" + jmxPort + "/jmxrmi"); + ConnectorServer jmxConnServer = new ConnectorServer(_jmxURL, "org.eclipse.jetty.jmx:name=rmiconnectorserver"); + _server.addBean(jmxConnServer); + + _server.start(); + _httpPort = ((NetworkConnector)_server.getConnectors()[0]).getLocalPort(); } - - - public static void stopJetty () throws Exception + + public void stopJetty() throws Exception { - if (__server != null) - __server.stop(); + if (_server != null) + _server.stop(); } private String getStringAttribute(ObjectName objName, String attrName) throws Exception { - Object val = __mbsc.getAttribute(objName,attrName); - assertThat(attrName,val,notNullValue()); - assertThat(attrName,val,instanceOf(String.class)); + Object val = _mbsc.getAttribute(objName, attrName); + assertThat(attrName, val, notNullValue()); + assertThat(attrName, val, instanceOf(String.class)); return (String)val; } private int getIntegerAttribute(ObjectName objName, String attrName) throws Exception { - Object val = __mbsc.getAttribute(objName,attrName); - assertThat(attrName,val,notNullValue()); - assertThat(attrName,val,instanceOf(Integer.class)); + Object val = _mbsc.getAttribute(objName, attrName); + assertThat(attrName, val, notNullValue()); + assertThat(attrName, val, instanceOf(Integer.class)); return (Integer)val; } @Test public void testBasic() throws Exception { - URI serverURI = new URI("http://localhost:"+String.valueOf(__port)+"/jmx-webapp/"); - HttpURLConnection http = (HttpURLConnection) serverURI.resolve("ping").toURL().openConnection(); - assertThat("http response", http.getResponseCode(), is(200)); - try(InputStream inputStream = http.getInputStream()) + URI serverURI = new URI("http://localhost:" + String.valueOf(_httpPort) + "/jmx-webapp/"); + HttpURLConnection http = (HttpURLConnection)serverURI.resolve("ping").toURL().openConnection(); + try (InputStream inputStream = http.getInputStream()) { + assertThat("http response", http.getResponseCode(), is(200)); String resp = IO.toString(inputStream); - assertThat(resp,startsWith("Servlet Pong at ")); + assertThat(resp, startsWith("Servlet Pong at ")); } } - + @Test public void testObtainRunningServerVersion() throws Exception { ObjectName serverName = new ObjectName("org.eclipse.jetty.server:type=server,id=0"); - String version = getStringAttribute(serverName,"version"); - assertThat("Version",version,startsWith("9.4.")); + String version = getStringAttribute(serverName, "version"); + assertThat("Version", version, startsWith("9.4.")); } @Test @@ -164,11 +161,11 @@ public class JmxIT { ObjectName webappName = new ObjectName("org.eclipse.jetty.webapp:context=jmx-webapp,type=webappcontext,id=0"); - String contextPath = getStringAttribute(webappName,"contextPath"); - String displayName = getStringAttribute(webappName,"displayName"); + String contextPath = getStringAttribute(webappName, "contextPath"); + assertThat("Context Path", contextPath, is("/jmx-webapp")); - assertThat("Context Path",contextPath,is("/jmx-webapp")); - assertThat("Display Name",displayName,is("Test JMX WebApp")); + String displayName = getStringAttribute(webappName, "displayName"); + assertThat("Display Name", displayName, is("Test JMX WebApp")); } /** @@ -178,8 +175,8 @@ public class JmxIT public void testAccessToCommonComponent() throws Exception { ObjectName commonName = new ObjectName("org.eclipse.jetty.test.jmx:type=commoncomponent,context=jmx-webapp,id=0"); - String name = getStringAttribute(commonName,"name"); - assertThat("Name",name,is("i am common")); + String name = getStringAttribute(commonName, "name"); + assertThat("Name", name, is("i am common")); } /** @@ -191,14 +188,14 @@ public class JmxIT { ObjectName pingerName = new ObjectName("org.eclipse.jetty.test.jmx:type=pinger,context=jmx-webapp,id=0"); // Get initial count - int count = getIntegerAttribute(pingerName,"count"); + int count = getIntegerAttribute(pingerName, "count"); // Operations - Object val = __mbsc.invoke(pingerName,"ping",null,null); - assertThat("ping() return",val.toString(),startsWith("Pong")); + Object val = _mbsc.invoke(pingerName, "ping", null, null); + assertThat("ping() return", val.toString(), startsWith("Pong")); // Attributes - assertThat("count",getIntegerAttribute(pingerName,"count"),is(count+1)); + assertThat("count", getIntegerAttribute(pingerName, "count"), is(count + 1)); } - + /** * Test for POJO (annotated) that is merged with a MBean that * declares more annotations. @@ -208,12 +205,12 @@ public class JmxIT { ObjectName echoerName = new ObjectName("org.eclipse.jetty.test.jmx:type=echoer,context=jmx-webapp,id=0"); // Get initial count - int count = getIntegerAttribute(echoerName,"count"); + int count = getIntegerAttribute(echoerName, "count"); // Operations - Object val = __mbsc.invoke(echoerName,"echo",new Object[]{"Its Me"},new String[]{String.class.getName()}); - assertThat("echo() return",val.toString(),is("Its Me")); + Object val = _mbsc.invoke(echoerName, "echo", new Object[]{"Its Me"}, new String[]{String.class.getName()}); + assertThat("echo() return", val.toString(), is("Its Me")); // Attributes - assertThat("count",getIntegerAttribute(echoerName,"count"),is(count+1)); - assertThat("foo",getStringAttribute(echoerName,"foo"),is("foo-ish")); + assertThat("count", getIntegerAttribute(echoerName, "count"), is(count + 1)); + assertThat("foo", getStringAttribute(echoerName, "foo"), is("foo-ish")); } }