/* * Copyright (c) 2006-2007 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.File; import java.io.FileFilter; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; import java.net.URLClassLoader; import java.net.URL; import org.hyperic.sigar.Sigar; import org.hyperic.sigar.SigarLoader; public class Runner { private static HashMap wantedJars = new HashMap(); private static final String JAR_EXT = ".jar"; static { wantedJars.put("junit", Boolean.FALSE); wantedJars.put("log4j", Boolean.FALSE); } private static void printMissingJars() { for (Iterator it = wantedJars.entrySet().iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry)it.next(); String jar = (String)entry.getKey(); if (wantedJars.get(jar) == Boolean.FALSE) { System.out.println("Unable to locate: " + jar + JAR_EXT); } } } private static boolean missingJars() { for (Iterator it = wantedJars.entrySet().iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry)it.next(); String jar = (String)entry.getKey(); if (wantedJars.get(jar) == Boolean.FALSE) { return true; } } return false; } public static URL[] getLibJars(String dir) throws Exception { File[] jars = new File(dir).listFiles(new FileFilter() { public boolean accept(File file) { String name = file.getName(); int jarIx = name.indexOf(JAR_EXT); if (jarIx == -1) { return false; } int ix = name.indexOf('-'); if (ix != -1) { name = name.substring(0, ix); //versioned .jar } else { name = name.substring(0, jarIx); } if (wantedJars.get(name) != null) { wantedJars.put(name, Boolean.TRUE); return true; } else { return false; } } }); if (jars == null) { return new URL[0]; } URL[] urls = new URL[jars.length]; for (int i=0; i<jars.length; i++) { URL url = new URL("jar", null, "file:" + jars[i].getAbsolutePath() + "!/"); urls[i] = url; } return urls; } private static void addURLs(URL[] jars) throws Exception { URLClassLoader loader = (URLClassLoader)Thread.currentThread().getContextClassLoader(); //bypass protected access. Method addURL = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class }); addURL.setAccessible(true); //pound sand. for (int i=0; i<jars.length; i++) { addURL.invoke(loader, new Object[] { jars[i] }); } } private static boolean addJarDir(String dir) throws Exception { URL[] jars = getLibJars(dir); addURLs(jars); return !missingJars(); } private static String getenv(String key) { try { return System.getenv("ANT_HOME"); //check for junit.jar } catch (Error e) { /*1.4*/ Sigar sigar = new Sigar(); try { return sigar.getProcEnv("$$", "ANT_HOME"); } catch (Exception se) { return null; } finally { sigar.close(); } } } public static void main(String[] args) throws Exception { if (args.length < 1) { args = new String[] { "Shell" }; } else { //e.g. convert // "ifconfig", "eth0" // to: // "Shell", "ifconfig", "eth0" if (Character.isLowerCase(args[0].charAt(0))) { String[] nargs = new String[args.length + 1]; System.arraycopy(args, 0, nargs, 1, args.length); nargs[0] = "Shell"; args = nargs; } } String name = args[0]; String[] pargs = new String[args.length - 1]; System.arraycopy(args, 1, pargs, 0, args.length-1); String sigarLib = SigarLoader.getLocation(); String[] dirs = { sigarLib, "lib", "." }; for (int i=0; i<dirs.length; i++) { if (addJarDir(dirs[i])) { break; } } if (missingJars()) { File[] subdirs = new File(".").listFiles(new FileFilter() { public boolean accept(File file) { return file.isDirectory(); } }); for (int i=0; i<subdirs.length; i++) { File lib = new File(subdirs[i], "lib"); if (lib.exists()) { if (addJarDir(lib.getAbsolutePath())) { break; } } } if (missingJars()) { String home = getenv("ANT_HOME"); //check for junit.jar if (home != null) { addJarDir(home + "/lib"); } } } Class cmd = null; String[] packages = { "org.hyperic.sigar.cmd.", "org.hyperic.sigar.test.", "org.hyperic.sigar.", "org.hyperic.sigar.win32.", "org.hyperic.sigar.jmx.", }; for (int i=0; i<packages.length; i++) { try { cmd = Class.forName(packages[i] + name); break; } catch (ClassNotFoundException e) {} } if (cmd == null) { System.out.println("Unknown command: " + args[0]); return; } Method main = cmd.getMethod("main", new Class[] { String[].class }); try { main.invoke(null, new Object[] { pargs }); } catch (InvocationTargetException e) { Throwable t = e.getTargetException(); if (t instanceof NoClassDefFoundError) { System.out.println("Class Not Found: " + t.getMessage()); printMissingJars(); } else { t.printStackTrace(); } } } }