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