package org.hyperic.hq.plugin.iis; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hyperic.sigar.win32.Win32Exception; import org.hyperic.util.exec.Execute; import org.hyperic.util.exec.ExecuteWatchdog; import org.hyperic.util.exec.PumpStreamHandler; public class IisApplicationPool { private static final Log _log = LogFactory.getLog(IisApplicationPool.class.getName()); private static final String APPCMD = "C:/Windows/System32/inetsrv/appcmd.exe"; private static final String WMIC = "C:/Windows/System32/"; public String name; public String status; public String dotNetCLRVersion; public String managedPipelineMode; public static Map getApplicationPools() throws Win32Exception { if (new File(APPCMD).exists()) { try { return getApplicationPoolsViaAppCmd(); } catch (Exception ex) { _log.error(APPCMD + ": " + ex, ex); throw new Win32Exception(ex.getMessage()); } } else { return null; } } private static double getPerf(int porcessId) { final String[] cmd = { WMIC, "" }; return 0; } private static Map getApplicationPoolsViaAppCmd() { final String[] cmd = { APPCMD, "list", "APPPOOL" }; Map apppools = new HashMap(); ByteArrayOutputStream output = executeCommandLine(cmd); if (output == null) return apppools; String appPools[] = output.toString().split("\\r\\n|\\n|\\r"); Pattern pattern = Pattern.compile(".*\"([^\"]+)\".*"); Pattern infoPattern = Pattern.compile(".*\\(MgdVersion:([^,]+),MgdMode:([^,]+),state:([^\\)]+)\\)"); for (int i = 0; i < appPools.length; i++) { Matcher matcher = pattern.matcher(appPools[i]); IisApplicationPool info = new IisApplicationPool(); if (matcher.matches()) { info.name = matcher.group(1); } matcher = infoPattern.matcher(appPools[i]); if (matcher.matches()) { info.dotNetCLRVersion = matcher.group(1); info.managedPipelineMode = matcher.group(2); info.status = matcher.group(3); } apppools.put(info.name, info); } return apppools; } private static ByteArrayOutputStream executeCommandLine(final String[] cmd) { ByteArrayOutputStream output = new ByteArrayOutputStream(); ExecuteWatchdog wdog = new ExecuteWatchdog(5 * 1000); Execute exec = new Execute(new PumpStreamHandler(output), wdog); exec.setCommandline(cmd); try { int exitStatus = exec.execute(); if (exitStatus != 0 || wdog.killedProcess()) { _log.error(Arrays.asList(cmd) + ": " + output); output.close(); return output; } } catch (Exception e) { _log.error(Arrays.asList(cmd) + ": " + e); try { output.close(); } catch (IOException e1) { _log.error(Arrays.asList(cmd) + ": " + e1); } return null; } return output; } public static String getPidForApplicationName(String apppool_name) { final String[] cmd = { APPCMD, "list", "WP" }; ByteArrayOutputStream output = executeCommandLine(cmd); if (output == null) return null; String[] lines = output.toString().split("\\r\\n|\\n|\\r"); if (lines == null || lines.length == 0) return null; Pattern pattern = Pattern.compile("WP\\s\"(\\d+)\"\\s\\(applicationPool:" + apppool_name + "\\)"); for (int i = 0; i < lines.length; i++) { Matcher matcher = pattern.matcher(lines[i]); if (matcher.matches()) return matcher.group(1); } return null; } }