1 /*
   2  * Copyright (c) 2004, 2017, 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 
  49     private static void printUsage() {
  50         System.err.println("usage: jstatd [-nr] [-p port] [-n rminame]\n" +
  51                            "       jstatd -?|-h|--help");
  52     }
  53 
  54     static void bind(String name, RemoteHostImpl remoteHost)
  55                 throws RemoteException, MalformedURLException, Exception {
  56 
  57         try {
  58             Naming.rebind(name, remoteHost);
  59         } catch (java.rmi.ConnectException e) {
  60             /*
  61              * either the registry is not running or we cannot contact it.
  62              * start an internal registry if requested.
  63              */
  64             if (startRegistry && registry == null) {
  65                 int localport = (port < 0) ? Registry.REGISTRY_PORT : port;
  66                 registry = LocateRegistry.createRegistry(localport);
  67                 bind(name, remoteHost);
  68             } else {
  69                 throw e;
  70             }
  71         }
  72     }
  73 
  74     @SuppressWarnings("deprecation") // Use of RMISecurityManager
  75     public static void main(String[] args) {
  76         String rminame = null;
  77         int argc = 0;
  78 
  79         for ( ; (argc < args.length) && (args[argc].startsWith("-")); argc++) {
  80             String arg = args[argc];
  81 
  82             if (arg.compareTo("-?") == 0 ||
  83                 arg.compareTo("-h") == 0 ||
  84                 arg.compareTo("--help") == 0) {
  85                 printUsage();
  86                 System.exit(0);
  87             } else if (arg.compareTo("-nr") == 0) {
  88                 startRegistry = false;
  89             } else if (arg.startsWith("-p")) {
  90                 if (arg.compareTo("-p") != 0) {
  91                     port = Integer.parseInt(arg.substring(2));
  92                 } else {
  93                   argc++;
  94                   if (argc >= args.length) {
  95                       printUsage();
  96                       System.exit(1);
  97                   }
  98                   port = Integer.parseInt(args[argc]);
  99                 }
 100             } else if (arg.startsWith("-n")) {
 101                 if (arg.compareTo("-n") != 0) {
 102                     rminame = arg.substring(2);
 103                 } else {
 104                     argc++;
 105                     if (argc >= args.length) {
 106                         printUsage();
 107                         System.exit(1);
 108                     }
 109                     rminame = args[argc];
 110                 }
 111             } else {
 112                 printUsage();
 113                 System.exit(1);
 114             }
 115         }
 116 
 117         if (argc < args.length) {
 118             printUsage();
 119             System.exit(1);
 120         }
 121 
 122         if (System.getSecurityManager() == null) {
 123             System.setSecurityManager(new RMISecurityManager());
 124         }
 125 
 126         StringBuilder name = new StringBuilder();
 127 
 128         if (port >= 0) {
 129             name.append("//:").append(port);
 130         }
 131 
 132         if (rminame == null) {
 133             rminame = "JStatRemoteHost";
 134         }
 135 
 136         name.append("/").append(rminame);
 137 
 138         try {
 139             // use 1.5.0 dynamically generated subs.
 140             System.setProperty("java.rmi.server.ignoreSubClasses", "true");
 141             RemoteHostImpl remoteHost = new RemoteHostImpl();
 142             RemoteHost stub = (RemoteHost) UnicastRemoteObject.exportObject(
 143                     remoteHost, 0);
 144             bind(name.toString(), remoteHost);
 145             System.out.println("jstatd started (bound to " + name.toString() + ")");
 146             System.out.flush();
 147         } catch (MalformedURLException e) {
 148             if (rminame != null) {
 149                 System.out.println("Bad RMI server name: " + rminame);
 150             } else {
 151                 System.out.println("Bad RMI URL: " + name);
 152             }
 153             e.printStackTrace(System.out);
 154             System.exit(1);
 155         } catch (java.rmi.ConnectException e) {
 156             // could not attach to or create a registry
 157             System.out.println("Could not contact RMI registry");
 158             e.printStackTrace(System.out);
 159             System.exit(1);
 160         } catch (RemoteException e) {
 161             System.out.println("Could not bind " + name + " to RMI Registry");
 162             e.printStackTrace(System.out);
 163             System.exit(1);
 164         } catch (Exception e) {
 165             System.out.println("Could not create remote object");
 166             e.printStackTrace(System.out);
 167             System.exit(1);
 168         }
 169     }
 170 }