/* * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Oracle nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * This source code is provided to illustrate the usage of a given feature * or technique and has been deliberately simplified. Additional steps * required for a production-quality application, such as security checks, * input validation and proper error handling, might not be present in * this sample code. */ package com.sun.jmx.examples.scandir; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.HashMap; import java.util.Map; import javax.management.MBeanServerConnection; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import javax.rmi.ssl.SslRMIClientSocketFactory; /** * The ScanDirClient class is a very simple programmatic client example * which is able to connect to a secured JMX <i>scandir</i> application. * <p>The program initialize the connection environment map with the * appropriate properties and credentials, and then connects to the * secure JMX <i>scandir</i> daemon.</p> * <p>It gets the application's current configuration and prints it on * its <code>System.out</code>.</p> * <p>The {@link #main main} method takes two arguments: the host on which * the server is running (localhost), and the port number * that was configured to start the server RMI Connector (4545). * </p> * @author Sun Microsystems, 2006 - All rights reserved. **/ public class ScanDirClient { // This class has only a main. private ScanDirClient() { } /** * The usage string for the ScanDirClient. */ public static final String USAGE = ScanDirClient.class.getSimpleName() + " <server-host> <rmi-port-number>"; /** * Connects to a secured JMX <i>scandir</i> application. * @param args The {@code main} method takes two parameters: * <ul> * <li>args[0] must be the server's host</li> * <li>args[1] must be the rmi port number at which the * JMX <i>scandir</i> daemon is listening for connections * - that is, the port number of its JMX RMI Connector which * was configured in {@code management.properties} * </li> * <ul> **/ public static void main(String[] args) { try { // Check args // if (args==null || args.length!=2) { System.err.println("Bad number of arguments: usage is: \n\t" + USAGE); System.exit(1); } try { InetAddress.getByName(args[0]); } catch (UnknownHostException x) { System.err.println("No such host: " + args[0]+ "\n usage is: \n\t" + USAGE); System.exit(2); } catch (Exception x) { System.err.println("Bad address: " + args[0]+ "\n usage is: \n\t" + USAGE); System.exit(2); } try { if (Integer.parseInt(args[1]) <= 0) { System.err.println("Bad port value: " + args[1]+ "\n usage is: \n\t" + USAGE); System.exit(2); } } catch (Exception x) { System.err.println("Bad argument: " + args[1]+ "\n usage is: \n\t" + USAGE); System.exit(2); } // Create an environment map to hold connection properties // like credentials etc... We will later pass this map // to the JMX Connector. // System.out.println("\nInitialize the environment map"); final Map<String,Object> env = new HashMap<String,Object>(); // Provide the credentials required by the server // to successfully perform user authentication // final String[] credentials = new String[] { "guest" , "guestpasswd" }; env.put("jmx.remote.credentials", credentials); // Provide the SSL/TLS-based RMI Client Socket Factory required // by the JNDI/RMI Registry Service Provider to communicate with // the SSL/TLS-protected RMI Registry // env.put("com.sun.jndi.rmi.factory.socket", new SslRMIClientSocketFactory()); // Create the RMI connector client and // connect it to the RMI connector server // args[0] is the server's host - localhost // args[1] is the secure server port - 4545 // System.out.println("\nCreate the RMI connector client and " + "connect it to the RMI connector server"); final JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://"+args[0]+":"+args[1] + "/jmxrmi"); System.out.println("Connecting to: "+url); final JMXConnector jmxc = JMXConnectorFactory.connect(url, env); // Get an MBeanServerConnection // System.out.println("\nGet the MBeanServerConnection"); final MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); // Create a proxy for the ScanManager MXBean // final ScanManagerMXBean proxy = ScanManager.newSingletonProxy(mbsc); // Get the ScanDirConfig MXBean from the scan manager // System.out.println( "\nGet ScanDirConfigMXBean from ScanManagerMXBean"); final ScanDirConfigMXBean configMBean = proxy.getConfigurationMBean(); // Print the scan dir configuration // System.out.println( "\nGet 'Configuration' attribute on ScanDirConfigMXBean"); System.out.println("\nConfiguration:\n" + configMBean.getConfiguration()); // Try to invoke the "close" method on the ScanManager MXBean. // // Should get a SecurityException as the user "guest" doesn't // have readwrite access. // System.out.println("\nInvoke 'close' on ScanManagerMXBean"); try { proxy.close(); } catch (SecurityException e) { System.out.println("\nGot expected security exception: " + e); } // Close MBeanServer connection // System.out.println("\nClose the connection to the server"); jmxc.close(); System.out.println("\nBye! Bye!"); } catch (Exception e) { System.out.println("\nGot unexpected exception: " + e); e.printStackTrace(); System.exit(3); } } }