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