package org.hyperic.hq.plugin.exchange;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hyperic.hq.product.AutoServerDetector;
import org.hyperic.hq.product.PluginException;
import org.hyperic.hq.product.ServerDetector;
import org.hyperic.hq.product.ServerResource;
import org.hyperic.sigar.win32.Service;
import org.hyperic.sigar.win32.Win32Exception;
import org.hyperic.util.config.ConfigResponse;
import org.hyperic.hq.product.ServiceResource;
import edu.emory.mathcs.backport.java.util.Collections;
public class ExchangeClientAccessDetector extends ServerDetector
implements AutoServerDetector {
private static final Log log =
LogFactory.getLog(ExchangeClientAccessDetector.class.getName());
private final static String IMAP4_NAME = "IMAP4";
private final static String POP3_NAME = "POP3";
private final static String ADDRESS_BOOK_NAME = "AddressBook";
private static final String[] SERVICES = {
IMAP4_NAME,
POP3_NAME,
ADDRESS_BOOK_NAME
};
private static final Map<String, String> servicesMap = new HashMap<String, String>();
static {
servicesMap.put(IMAP4_NAME, ExchangeDetector.EX + IMAP4_NAME);
servicesMap.put(POP3_NAME, ExchangeDetector.EX + POP3_NAME);
servicesMap.put(ADDRESS_BOOK_NAME, ExchangeDetector.EX + "AB");
}
public List getServerResources(ConfigResponse platformConfig) throws PluginException {
List<ServerResource> servers = new ArrayList<ServerResource>();
String exe;
Service exch = null;
String serviceName="";
try {
// nira rpc client does not exist for exchange 2007 - need to check (maybe a different server)
serviceName = getTypeProperty("SERVER_NAME");
exch = new Service(serviceName);
if (log.isDebugEnabled()) {
log.debug("clientAccessDetetctor: getServerResources: looking for service:" + serviceName);
}
if (exch.getStatus() != Service.SERVICE_RUNNING) {
if (log.isDebugEnabled()) {
log.debug("[getServerResources] service '" + serviceName
+ "' is not RUNNING (status='" + exch.getStatusString() + "')");
}
return null;
}
exe = exch.getConfig().getExe().trim();
} catch (Win32Exception e) {
log.debug("[getServerResources] Error getting '" + serviceName
+ "' service information " + e, e);
return null;
} finally {
if (exch != null) {
exch.close();
}
}
File bin = new File(exe).getParentFile();
if (!isInstallTypeVersion(bin.getPath())) {
if (log.isDebugEnabled()) {
log.debug("[getServerResources] exchange on '" + bin
+ "' IS NOT a " + getTypeInfo().getName());
}
return null;
} else {
if (log.isDebugEnabled()) {
log.debug("[getServerResources] exchange on '" + bin
+ "' IS a " + getTypeInfo().getName());
}
}
ConfigResponse cprops = new ConfigResponse();
ConfigResponse productProps = new ConfigResponse();
String roleRegKeyStr = getTypeProperty(ExchangeUtils.EXCHANGE_ROLE_REG_KEY);
if (roleRegKeyStr != null) {
if (!ExchangeUtils.checkRoleConfiguredAndSetVersion(roleRegKeyStr, cprops)) {
if (log.isDebugEnabled()) {
log.debug("role configured - but not found in registry - ignoring server:" + roleRegKeyStr);
}
return null;
}
String discoverSite = getTypeProperty(ExchangeUtils.SITE_DISCOVERY);
if (discoverSite!=null){
String adSiteName = ExchangeUtils.fetchActiveDirectorySiteName();
if (adSiteName!=null){
productProps.setValue(ExchangeUtils.AD_SITE_PROP, adSiteName);
}
}
}
ServerResource server = createServerResource(exe);
setCustomProperties(server, cprops);
server.setIdentifier(serviceName);
setProductConfig(server,productProps);
server.setMeasurementConfig();
servers.add(server);
return servers;
}
private boolean isExchangeServiceRunning(String serviceName) {
return isWin32ServiceRunning(serviceName);
}
private ServiceResource createService(String name, String win32Name) {
ConfigResponse cfg = new ConfigResponse();
cfg.setValue("service_name", win32Name);
ServiceResource service = new ServiceResource();
service.setType(this, name);
service.setServiceName(name);
setProductConfig(service, new ConfigResponse());
setMeasurementConfig(service, new ConfigResponse());
setControlConfig(service, cfg);
log.debug("=" + win32Name + "=> " + service.getProductConfig());
return service;
}
@Override
protected List discoverServices(ConfigResponse config) throws PluginException {
List<ServiceResource> actualServices = new ArrayList<ServiceResource>();
// POP3 + IMAP4 are disabled by default, only report the services
// if they are enabled and running.
for(Entry<String,String> entry: servicesMap.entrySet()) {
if(!isExchangeServiceRunning(entry.getValue())) {
if (log.isDebugEnabled()) {
log.debug(entry.getValue() + " is not running");
}
continue;
}else {
if (log.isDebugEnabled()) {
log.debug(entry.getValue() + " is running, adding to inventory");
}
}
actualServices.add(createService(entry.getKey(), entry.getValue()));
}
return actualServices;
}
}