/* * Copyright (c) 2006-2008 Hyperic, Inc. * Copyright (c) 2010 VMware, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.hyperic.sigar.cmd; import java.io.IOException; import java.io.File; import java.lang.reflect.Constructor; import org.hyperic.sigar.Sigar; import org.hyperic.sigar.SigarException; import org.hyperic.sigar.SigarPermissionDeniedException; import org.hyperic.sigar.SigarLoader; import org.hyperic.sigar.SigarProxy; import org.hyperic.sigar.SigarProxyCache; import org.hyperic.sigar.ptql.ProcessFinder; import org.hyperic.sigar.shell.ShellBase; import org.hyperic.sigar.shell.ShellCommandExecException; import org.hyperic.sigar.shell.ShellCommandHandler; import org.hyperic.sigar.shell.ShellCommandInitException; import org.hyperic.sigar.shell.ShellCommandUsageException; import org.hyperic.sigar.util.Getline; /** * The Sigar Shell provides a command shell for running the example * commands and Sigar tests. */ public class Shell extends ShellBase { public static final String RCFILE_NAME = ".sigar_shellrc"; private static final String CLEAR_SCREEN = "\033[2J"; private Sigar sigar = new Sigar(); private SigarProxy proxy = SigarProxyCache.newInstance(this.sigar); private long[] foundPids = new long[0]; private boolean isInteractive = false; public Shell() { } public static void clearScreen() { System.out.print(CLEAR_SCREEN); } public SigarProxy getSigarProxy() { return this.proxy; } public Sigar getSigar() { return this.sigar; } public boolean isInteractive() { return this.isInteractive; } public void setInteractive(boolean value) { this.isInteractive = value; } public void registerCommands() throws ShellCommandInitException { registerCommandHandler("df", new Df(this)); registerCommandHandler("du", new Du(this)); registerCommandHandler("ls", new Ls(this)); registerCommandHandler("iostat", new Iostat(this)); registerCommandHandler("free", new Free(this)); registerCommandHandler("pargs", new ShowArgs(this)); registerCommandHandler("penv", new ShowEnv(this)); registerCommandHandler("pfile", new ProcFileInfo(this)); registerCommandHandler("pmodules", new ProcModuleInfo(this)); registerCommandHandler("pinfo", new ProcInfo(this)); registerCommandHandler("cpuinfo", new CpuInfo(this)); registerCommandHandler("ifconfig", new Ifconfig(this)); registerCommandHandler("uptime", new Uptime(this)); registerCommandHandler("ps", new Ps(this)); registerCommandHandler("pidof", new Pidof(this)); registerCommandHandler("kill", new Kill(this)); registerCommandHandler("netstat", new Netstat(this)); registerCommandHandler("netinfo", new NetInfo(this)); registerCommandHandler("nfsstat", new Nfsstat(this)); registerCommandHandler("route", new Route(this)); registerCommandHandler("version", new Version(this)); registerCommandHandler("mps", new MultiPs(this)); registerCommandHandler("sysinfo", new SysInfo(this)); registerCommandHandler("time", new Time(this)); registerCommandHandler("ulimit", new Ulimit(this)); registerCommandHandler("who", new Who(this)); if (SigarLoader.IS_WIN32) { registerCommandHandler("service", new Win32Service(this)); registerCommandHandler("fversion", new FileVersionInfo(this)); } try { //requires junit.jar registerCommandHandler("test", "org.hyperic.sigar.test.SigarTestRunner"); } catch (NoClassDefFoundError e) { } catch (Exception e) { } } private void registerCommandHandler(String name, String className) throws Exception { Class cls = Class.forName(className); Constructor con = cls.getConstructor(new Class[] { this.getClass() }); registerCommandHandler(name, (ShellCommandHandler)con.newInstance(new Object[] { this })); } public void processCommand(ShellCommandHandler handler, String args[]) throws ShellCommandUsageException, ShellCommandExecException { try { super.processCommand(handler, args); if (handler instanceof SigarCommandBase) { ((SigarCommandBase)handler).flush(); } } finally { SigarProxyCache.clear(this.proxy); } } public static long[] getPids(SigarProxy sigar, String[] args) throws SigarException { long[] pids; switch (args.length) { case 0: pids = new long[] { sigar.getPid() }; break; case 1: if (args[0].indexOf("=") > 0) { pids = ProcessFinder.find(sigar, args[0]); } else if (args[0].equals("$$")) { pids = new long[] { sigar.getPid() }; } else { pids = new long[] { Long.parseLong(args[0]) }; } break; default: pids = new long[args.length]; for (int i=0; i<args.length; i++) { pids[i] = Long.parseLong(args[i]); } break; } return pids; } public long[] findPids(String[] args) throws SigarException { if ((args.length == 1) && args[0].equals("-")) { return this.foundPids; } this.foundPids = getPids(this.proxy, args); return this.foundPids; } public long[] findPids(String query) throws SigarException { return findPids(new String[] { query }); } public void readCommandFile(String dir) { try { File rc = new File(dir, RCFILE_NAME); readRCFile(rc, false); if (this.isInteractive && Getline.isTTY()) { this.out.println("Loaded rc file: " + rc); } } catch (IOException e) { } } public String getUserDeniedMessage(long pid) { return SigarPermissionDeniedException.getUserDeniedMessage(this.proxy, pid); } public void shutdown() { this.sigar.close(); //cleanup for dmalloc //using reflection incase junit.jar is not present try { //SigarTestCase.closeSigar(); Class.forName("org.hyperic.sigar.test.SigarTestCase"). getMethod("closeSigar", new Class[0]).invoke(null, new Object[0]); } catch (ClassNotFoundException e) { //SigarTestCase.java not compiled w/o junit.jar } catch (Exception e) { e.printStackTrace(); } catch (NoClassDefFoundError e) { //avoiding possible Class Not Found: junit/framework/TestCase } super.shutdown(); } public static void main(String[] args) { Shell shell = new Shell(); try { if (args.length == 0) { shell.isInteractive = true; } shell.init("sigar", System.out, System.err); shell.registerCommands(); shell.readCommandFile(System.getProperty("user.home")); shell.readCommandFile("."); shell.readCommandFile(SigarLoader.getLocation()); if (shell.isInteractive) { shell.initHistory(); Getline.setCompleter(shell); shell.run(); } else { shell.handleCommand(null, args); } } catch (Exception e) { System.err.println("Unexpected exception: " + e); } finally { shell.shutdown(); } } }