/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.plugins.iis.util;
import java.util.HashMap;
import java.util.Map;
import org.hyperic.sigar.win32.MetaBase;
import org.hyperic.sigar.win32.Win32Exception;
public class IISMetaBase {
private static final String IIS_MKEY = "/LM/W3SVC";
private static final int MD_SSL_ACCESS_PERM = 6030;
private static final int MD_ACCESS_SSL = 0x00000008;
String id;
String ip;
String hostname;
String port;
String path;
boolean requireSSL = false;
public String getId() {
return id;
}
public String getIp() {
return ip;
}
public String getHostname() {
return hostname;
}
public String getPort() {
return port;
}
public String getPath() {
return path;
}
public boolean isRequireSSL() {
return requireSSL;
}
public String toString() {
String s = "id: " + id + " " + ip + ":" + port;
if (hostname != null) {
s += ", Host: " + hostname;
}
return s;
}
public static Map<String, IISMetaBase> getWebSites() throws Win32Exception {
String keys[];
Map<String, IISMetaBase> websites = new HashMap<String, IISMetaBase>();
MetaBase mb = new MetaBase();
try {
mb.OpenSubKey(IIS_MKEY);
keys = mb.getSubKeyNames();
} finally {
mb.close();
}
for (String key : keys) {
int id;
if (!Character.isDigit(key.charAt(0))) {
continue;
}
try {
id = Integer.parseInt(key);
} catch (NumberFormatException e) {
continue;
}
String subkey = IIS_MKEY + "/" + id;
MetaBase srv = null;
try {
srv = new MetaBase();
srv.OpenSubKey(subkey);
String[] bindings = null;
IISMetaBase info = new IISMetaBase();
//IIS 6.0+Windows 2003 has Administration website
//that requires SSL by default.
//Any Web Site can be configured to required ssl.
try {
int flags = srv.getIntValue(MD_SSL_ACCESS_PERM);
info.requireSSL = (flags & MD_ACCESS_SSL) != 0;
if (info.requireSSL) {
bindings = srv.getMultiStringValue(MetaBase.MD_SECURE_BINDINGS);
}
} catch (Win32Exception e) {
}
if (bindings == null) {
bindings = srv.getMultiStringValue(MetaBase.MD_SERVER_BINDINGS);
}
if (bindings.length == 0) {
continue;
}
String entry = bindings[0];
int ix = entry.indexOf(":");
if (ix == -1) {
continue;
}
info.id = key;
//binding format:
//"listen ip:port:host header"
info.ip = entry.substring(0, ix);
entry = entry.substring(ix + 1);
ix = entry.indexOf(":");
info.port = entry.substring(0, ix);
//if host header is defined, URLMetric
//will add Host: header with this value.
info.hostname = entry.substring(ix + 1);
if ((info.hostname != null) && (info.hostname.length() == 0)) {
info.hostname = null;
}
if ((info.ip == null) || (info.ip.length() == 0)) {
//not bound to a specific ip
info.ip = "localhost";
}
String name = srv.getStringValue(MetaBase.MD_SERVER_COMMENT);
websites.put(name, info);
//XXX this is bogus, else locks the metabase
//because OpenSubKey does not close the key
//thats already open.
srv.close();
srv = null;
srv = new MetaBase();
srv.OpenSubKey(subkey + "/ROOT");
String docroot = srv.getStringValue(3001);
info.path = docroot;
} catch (Win32Exception e) {
} finally {
if (srv != null) {
srv.close();
}
}
}
return websites;
}
public static void main(String[] args) throws Exception {
Map websites = IISMetaBase.getWebSites();
System.out.println(websites);
}
}