package org.rhq.enterprise.server.system;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.as.controller.client.ModelControllerClient;
import org.rhq.common.jbossas.client.controller.CoreJBossASClient;
import org.rhq.common.jbossas.client.controller.MCCHelper;
import org.rhq.core.domain.alert.Alert;
import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.cloud.StorageNodeLoadComposite;
import org.rhq.core.domain.common.ProductInfo;
import org.rhq.core.domain.common.ServerDetails;
import org.rhq.core.domain.common.composite.SystemSetting;
import org.rhq.core.domain.common.composite.SystemSettings;
import org.rhq.core.domain.criteria.AlertCriteria;
import org.rhq.core.domain.criteria.AlertDefinitionCriteria;
import org.rhq.core.domain.criteria.Criteria;
import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.alert.AlertDefinitionManagerLocal;
import org.rhq.enterprise.server.alert.AlertManagerLocal;
import org.rhq.enterprise.server.cloud.StorageNodeManagerLocal;
import org.rhq.enterprise.server.core.AgentManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerLocal;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
/**
* Get system information
* @author Heiko W. Rupp
*/
@Stateless
public class SystemInfoManagerBean implements SystemInfoManagerLocal{
Log log = LogFactory.getLog("SystemInfoManager");
@EJB SystemManagerLocal systemManager;
@EJB MeasurementScheduleManagerLocal scheduleManager;
@EJB ResourceManagerLocal resourceManager;
@EJB AlertManagerLocal alertManager;
@EJB AlertDefinitionManagerLocal alertDefinitionManager;
@EJB StorageNodeManagerLocal storageNodeManager;
@EJB AgentManagerLocal agentManger;
@Override
public Map<String, String> getSystemInformation(Subject caller) {
Map<String,String> result = new HashMap<String, String>();
ServerDetails details = systemManager.getServerDetails(caller);
Map<ServerDetails.Detail,String> detailsMap = details.getDetails();
for (Map.Entry<ServerDetails.Detail,String> detail : detailsMap.entrySet()) {
result.put(detail.getKey().toString(),detail.getValue());
}
ProductInfo productInfo = details.getProductInfo();
result.put("BuildNumber", productInfo.getBuildNumber());
result.put("FullName", productInfo.getFullName());
result.put("Name", productInfo.getName());
result.put("Version", productInfo.getVersion());
ModelControllerClient mcc = null;
try {
mcc = MCCHelper.createModelControllerClient();
CoreJBossASClient coreClient = new CoreJBossASClient(mcc);
result.put("AS version",coreClient.getAppServerVersion());
result.put("AS product version", coreClient.getServerProductVersion());
result.put("AS product name", coreClient.getServerProductName());
result.put("AS config dir", coreClient.getAppServerConfigDir());
} catch (Exception e) {
result.put("AS*", "Not able to get AS props due to " + e.getMessage());
} finally {
MCCHelper.safeClose(mcc);
}
SystemSettings systemSettings=systemManager.getSystemSettings(caller);
Map<String,String> settingsMap = systemSettings.toMap();
// Don't use putAll(), as we need to filter out passwords
for (Map.Entry<String,String> detail : settingsMap.entrySet()) {
String key = detail.getKey();
if (key.equals(SystemSetting.LDAP_BIND_PW.getInternalName())
|| key.toLowerCase().contains("passw")
|| key.equals(SystemSetting.HELP_PASSWORD.getInternalName())
|| key.equals(SystemSetting.STORAGE_PASSWORD.getInternalName())) {
if (detail.getValue()==null) {
result.put(key, "- null -");
}
else {
result.put(key, "- non null -");
}
}
else {
result.put(key, detail.getValue());
}
}
List<StorageNodeLoadComposite> loadComposites = storageNodeManager.getStorageNodeComposites(caller);
for (StorageNodeLoadComposite loadComposite : loadComposites) {
result.put("Storage_Node " + loadComposite.getStorageNode().getAddress(), loadComposite.toString());
}
List<Agent> agents = agentManger.getAllAgents();
for (Agent agent : agents) {
result.put("Agent " + agent.getName(), agent.toString());
}
// system stats
result.putAll(getStats(caller));
return result;
}
@Override
public void dumpToLog(Subject caller) {
Map<String,String> infoMap = getSystemInformation(caller);
StringBuilder builder = new StringBuilder("\n");
SortedSet<String> keys = new TreeSet<String>(infoMap.keySet());
for (String key : keys) {
String value = infoMap.get(key);
builder.append(key);
builder.append(": [");
builder.append(value);
builder.append("]\n");
}
log.info("SystemInformation: ********" + builder.toString() + "********");
}
private Map<String,String> getStats(Subject caller) {
Map<String,String> result = new HashMap<String, String>();
ResourceCriteria criteria = new ResourceCriteria();
criteria.addFilterResourceCategories(ResourceCategory.PLATFORM);
criteria.setRestriction(Criteria.Restriction.COUNT_ONLY);
PageList<Resource> resList = resourceManager.findResourcesByCriteria(caller,criteria);
result.put("PlatformCount",String.valueOf(resList.getTotalSize()));
criteria = new ResourceCriteria();
criteria.addFilterResourceCategories(ResourceCategory.SERVER);
criteria.setRestriction(Criteria.Restriction.COUNT_ONLY);
resList = resourceManager.findResourcesByCriteria(caller,criteria);
result.put("ServerCount",String.valueOf(resList.getTotalSize()));
criteria = new ResourceCriteria();
criteria.addFilterResourceCategories(ResourceCategory.SERVICE);
criteria.setRestriction(Criteria.Restriction.COUNT_ONLY);
resList = resourceManager.findResourcesByCriteria(caller,criteria);
result.put("ServiceCount",String.valueOf(resList.getTotalSize()));
AlertCriteria alertCriteria = new AlertCriteria();
alertCriteria.setRestriction(Criteria.Restriction.COUNT_ONLY);
PageList<Alert> alertList = alertManager.findAlertsByCriteria(caller,alertCriteria);
result.put("AlertCount",String.valueOf(alertList.getTotalSize()));
AlertDefinitionCriteria alertDefinitionCriteria = new AlertDefinitionCriteria();
alertDefinitionCriteria.setRestriction(Criteria.Restriction.COUNT_ONLY);
PageList<AlertDefinition> defList = alertDefinitionManager.findAlertDefinitionsByCriteria(caller,alertDefinitionCriteria);
result.put("AlertDefinitionCount",String.valueOf(defList.getTotalSize()));
// status.setSchedules(-1); // TODO number of (active) schedules
result.put("SchedulesPerMinute", String.valueOf(scheduleManager.getScheduledMeasurementsPerMinute()));
return result;
}
}