1 /* 2 * Copyright (c) 2004, 2020, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package sun.tools.jstatd; 27 28 import java.rmi.*; 29 import java.rmi.server.*; 30 import java.rmi.registry.Registry; 31 import java.rmi.registry.LocateRegistry; 32 import java.net.MalformedURLException; 33 import sun.jvmstat.monitor.remote.*; 34 35 /** 36 * Application providing remote access to the jvmstat instrumentation 37 * exported by local Java Virtual Machine processes. Remote access is 38 * provided through an RMI interface. 39 * 40 * @author Brian Doherty 41 * @since 1.5 42 */ 43 public class Jstatd { 44 45 private static Registry registry; 46 private static int port = -1; 47 private static boolean startRegistry = true; 48 private static RemoteHost remoteHost; 49 printUsage()50 private static void printUsage() { 51 System.err.println("usage: jstatd [-nr] [-p port] [-r rmiport] [-n rminame]\n" + 52 " jstatd -?|-h|--help"); 53 } 54 bind(String name, RemoteHost remoteHost)55 static void bind(String name, RemoteHost remoteHost) 56 throws RemoteException, MalformedURLException, Exception { 57 58 try { 59 Naming.rebind(name, remoteHost); 60 } catch (java.rmi.ConnectException e) { 61 /* 62 * either the registry is not running or we cannot contact it. 63 * start an internal registry if requested. 64 */ 65 if (startRegistry && registry == null) { 66 int localport = (port < 0) ? Registry.REGISTRY_PORT : port; 67 registry = LocateRegistry.createRegistry(localport); 68 bind(name, remoteHost); 69 } else { 70 throw e; 71 } 72 } 73 } 74 75 @SuppressWarnings("deprecation") // Use of RMISecurityManager main(String[] args)76 public static void main(String[] args) { 77 String rminame = null; 78 int rmiPort = 0; 79 int argc = 0; 80 81 for ( ; (argc < args.length) && (args[argc].startsWith("-")); argc++) { 82 String arg = args[argc]; 83 84 if (arg.compareTo("-?") == 0 || 85 arg.compareTo("-h") == 0 || 86 arg.compareTo("--help") == 0) { 87 printUsage(); 88 System.exit(0); 89 } else if (arg.compareTo("-nr") == 0) { 90 startRegistry = false; 91 } else if (arg.startsWith("-p")) { 92 if (arg.compareTo("-p") != 0) { 93 port = Integer.parseInt(arg.substring(2)); 94 } else { 95 argc++; 96 if (argc >= args.length) { 97 printUsage(); 98 System.exit(1); 99 } 100 port = Integer.parseInt(args[argc]); 101 } 102 } else if (arg.startsWith("-r")) { 103 if (arg.compareTo("-r") != 0) { 104 rmiPort = Integer.parseInt(arg.substring(2)); 105 } else { 106 argc++; 107 if (argc >= args.length) { 108 printUsage(); 109 System.exit(1); 110 } 111 rmiPort = Integer.parseInt(args[argc]); 112 } 113 } else if (arg.startsWith("-n")) { 114 if (arg.compareTo("-n") != 0) { 115 rminame = arg.substring(2); 116 } else { 117 argc++; 118 if (argc >= args.length) { 119 printUsage(); 120 System.exit(1); 121 } 122 rminame = args[argc]; 123 } 124 } else { 125 printUsage(); 126 System.exit(1); 127 } 128 } 129 130 if (argc < args.length) { 131 printUsage(); 132 System.exit(1); 133 } 134 135 if (System.getSecurityManager() == null) { 136 System.setSecurityManager(new RMISecurityManager()); 137 } 138 139 StringBuilder name = new StringBuilder(); 140 141 if (port >= 0) { 142 name.append("//:").append(port); 143 } 144 145 if (rminame == null) { 146 rminame = "JStatRemoteHost"; 147 } 148 149 name.append("/").append(rminame); 150 151 try { 152 // use 1.5.0 dynamically generated subs. 153 System.setProperty("java.rmi.server.ignoreSubClasses", "true"); 154 remoteHost = new RemoteHostImpl(rmiPort); 155 RemoteHost stub = (RemoteHost) UnicastRemoteObject.exportObject( 156 remoteHost, rmiPort); 157 bind(name.toString(), stub); 158 System.out.println("jstatd started (bound to " + name.toString() + ")"); 159 System.out.flush(); 160 } catch (MalformedURLException e) { 161 if (rminame != null) { 162 System.out.println("Bad RMI server name: " + rminame); 163 } else { 164 System.out.println("Bad RMI URL: " + name); 165 } 166 e.printStackTrace(System.out); 167 System.exit(1); 168 } catch (java.rmi.ConnectException e) { 169 // could not attach to or create a registry 170 System.out.println("Could not contact RMI registry"); 171 e.printStackTrace(System.out); 172 System.exit(1); 173 } catch (RemoteException e) { 174 System.out.println("Could not bind " + name + " to RMI Registry"); 175 e.printStackTrace(System.out); 176 System.exit(1); 177 } catch (Exception e) { 178 System.out.println("Could not create remote object"); 179 e.printStackTrace(System.out); 180 System.exit(1); 181 } 182 } 183 } 184