blob: 197750576993954d39f30953dc28ae5830b74da7 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2004 Sun Microsystems, Inc. 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. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package sun.tools.jstatd;
27
28import java.rmi.*;
29import java.rmi.server.*;
30import java.rmi.registry.Registry;
31import java.rmi.registry.LocateRegistry;
32import java.net.MalformedURLException;
33import 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 */
43public class Jstatd {
44
45 private static Registry registry;
46 private static int port = -1;
47 private static boolean startRegistry = true;
48
49 private static void printUsage() {
50 System.err.println("usage: jstatd [-nr] [-p port] [-n rminame]");
51 }
52
53 static void bind(String name, RemoteHostImpl remoteHost)
54 throws RemoteException, MalformedURLException, Exception {
55
56 try {
57 Naming.rebind(name, remoteHost);
58 } catch (java.rmi.ConnectException e) {
59 /*
60 * either the registry is not running or we cannot contact it.
61 * start an internal registry if requested.
62 */
63 if (startRegistry && registry == null) {
64 int localport = (port < 0) ? Registry.REGISTRY_PORT : port;
65 registry = LocateRegistry.createRegistry(localport);
66 bind(name, remoteHost);
67 }
68 else {
69 System.out.println("Could not contact registry\n"
70 + e.getMessage());
71 e.printStackTrace();
72 }
73 } catch (RemoteException e) {
74 System.err.println("Could not bind " + name + " to RMI Registry");
75 e.printStackTrace();
76 }
77 }
78
79 public static void main(String[] args) {
80 String rminame = null;
81 int argc = 0;
82
83 for ( ; (argc < args.length) && (args[argc].startsWith("-")); argc++) {
84 String arg = args[argc];
85
86 if (arg.compareTo("-nr") == 0) {
87 startRegistry = false;
88 } else if (arg.startsWith("-p")) {
89 if (arg.compareTo("-p") != 0) {
90 port = Integer.parseInt(arg.substring(2));
91 } else {
92 argc++;
93 if (argc >= args.length) {
94 printUsage();
95 System.exit(1);
96 }
97 port = Integer.parseInt(args[argc]);
98 }
99 } else if (arg.startsWith("-n")) {
100 if (arg.compareTo("-n") != 0) {
101 rminame = arg.substring(2);
102 } else {
103 argc++;
104 if (argc >= args.length) {
105 printUsage();
106 System.exit(1);
107 }
108 rminame = args[argc];
109 }
110 } else {
111 printUsage();
112 System.exit(1);
113 }
114 }
115
116 if (argc < args.length) {
117 printUsage();
118 System.exit(1);
119 }
120
121 if (System.getSecurityManager() == null) {
122 System.setSecurityManager(new RMISecurityManager());
123 }
124
125 StringBuilder name = new StringBuilder();
126
127 if (port >= 0) {
128 name.append("//:").append(port);
129 }
130
131 if (rminame == null) {
132 rminame = "JStatRemoteHost";
133 }
134
135 name.append("/").append(rminame);
136
137 try {
138 // use 1.5.0 dynamically generated subs.
139 System.setProperty("java.rmi.server.ignoreSubClasses", "true");
140 RemoteHostImpl remoteHost = new RemoteHostImpl();
141 RemoteHost stub = (RemoteHost) UnicastRemoteObject.exportObject(
142 remoteHost, 0);
143 bind(name.toString(), remoteHost);
144 } catch (MalformedURLException e) {
145 if (rminame != null) {
146 System.out.println("Bad RMI server name: " + rminame);
147 } else {
148 System.out.println("Bad RMI URL: " + name + " : "
149 + e.getMessage());
150 }
151 System.exit(1);
152 } catch (java.rmi.ConnectException e) {
153 // could not attach to or create a registry
154 System.out.println("Could not contact RMI registry\n"
155 + e.getMessage());
156 System.exit(1);
157 } catch (Exception e) {
158 System.out.println("Could not create remote object\n"
159 + e.getMessage());
160 e.printStackTrace();
161 System.exit(1);
162 }
163 }
164}