package org.infosec.ismp.manager.snmp.processor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.StringUtils;
import org.infosec.ismp.manager.model.snmp.NetworkHistoryEntity;
import org.infosec.ismp.manager.model.snmp.SnmpDeviceHistoryBaseEntity;
import org.infosec.ismp.manager.model.snmp.SnmpDeviceHistoryBaseStatus;
import org.infosec.ismp.manager.rmi.snmp.model.NetworkDeviceStatus;
import org.infosec.ismp.manager.rmi.snmp.model.host.CPUStatus;
import org.infosec.ismp.manager.rmi.snmp.model.host.InterfaceStatus;
import org.infosec.ismp.manager.rmi.snmp.model.host.MemoryStatus;
import org.infosec.ismp.manager.rmi.snmp.model.host.NetworkStatus;
import org.infosec.ismp.manager.snmp.SnmpDeviceConstants;
import org.infosec.ismp.manager.snmp.SnmpDeviceLocator;
import org.infosec.ismp.model.snmp.Result;
import org.infosec.ismp.model.snmp.Results;
import org.infosec.ismp.util.ThreadCategory;
/**
* @author guoxianwei
* @date 2010-12-23 上午10:27:29
*
*/
public final class NetworkMessageProcessor {
// 持久化基本信息类
private SnmpDeviceHistoryBaseEntity m_baseEntity = null;
// 持久化思科信息类,是基本信息类的子集
private List<NetworkHistoryEntity> networkEntityList = new ArrayList<NetworkHistoryEntity>();
public SnmpDeviceHistoryBaseStatus process(Results results) {
NetworkDeviceStatus networkDeviceStatus = networkDeviceStatus(results);
SnmpDeviceHistoryBaseStatus baseStatus = null;// 保存状态和入库信息
if (!networkEntityList.isEmpty()) {
baseStatus = new SnmpDeviceHistoryBaseStatus();
// 把网络设备状态由MAP转化为POJO类
baseStatus.setNetworkDeviceStatus(networkDeviceStatus);
// SnmpDeviceHistoryBaseEntity 属性赋值
copyProperties(results.getNodeid(), results.getIpAddr(), results
.getBrand());
baseStatus.setSnmpDeviceHistoryBaseEntity(m_baseEntity);
}
return baseStatus;
}
private NetworkDeviceStatus networkDeviceStatus(Results results) {
NetworkDeviceStatus networkDeviceStatus = new NetworkDeviceStatus();// 状态信息
// ,
// 供前台调用
if(results!=null && results.getResultList()!=null){
for (Result result : results.getResultList()) {
String deviceName = result.getTrackerName();
String ipAddr = results.getIpAddr();
if ("memory".equals(deviceName)) {
// 内存状态
networkDeviceStatus
.setMemoryStatus(convertMemoryStatus(result));
continue;
} else if ("cpu".equals(deviceName)) {
// CPU状态
networkDeviceStatus.setCpuStatus(convertCPUStatus(result));
continue;
} else if ("ifTable".equals(deviceName)) {
// 网络设备状态
networkDeviceStatus
.setNetworkStatus(convertNetworkStatus(result,ipAddr));
continue;
}else if ("ipAddrTable".equals(deviceName)) {
// 网络设备状态
extra(networkDeviceStatus,result);
continue;
}
}
}
if (!networkEntityList.isEmpty()) {
networkDeviceStatus.setActive(true);
networkDeviceStatus.setNodeid(results.getNodeid());
networkDeviceStatus.setDomain(SnmpDeviceLocator.getDomainId(results
.getNodeid()));
networkDeviceStatus.setIpAddr(results.getIpAddr());
}
return networkDeviceStatus;
}
// convert network status
private NetworkStatus convertNetworkStatus(Result result,String ipAddress) {
NetworkStatus networkStatus = new NetworkStatus();
int size = result.getListResults().size();
InterfaceStatus[] interfaceStatus = new InterfaceStatus[size];
int i = 0;
for (Map<String, Object> properties : result.getListResults()) {
InterfaceStatus bean = new InterfaceStatus();
populate(bean, properties);
// log().info(bean.toString());
bean.setIpAddress(ipAddress);
interfaceStatus[i++] = bean;
// 加入到历史信息集合,便于后面存入DB
networkEntityList.add(converHostHistory(properties,
SnmpDeviceConstants.NETWORK));
}
networkStatus.setInterfaceStatus(interfaceStatus);
return networkStatus;
}
// convert memory status
private MemoryStatus convertMemoryStatus(Result result) {
MemoryStatus memoryStatus = new MemoryStatus();
for (Map<String, Object> properties : result.getListResults()) {
log().info(properties.toString());
populate(memoryStatus, properties);
log().info(memoryStatus.toString());
// 加入到历史信息集合,便于后面存入DB
networkEntityList.add(converHostHistory(properties,
SnmpDeviceConstants.MEMORY));
break;
}
return memoryStatus;
}
// convert CPU status
private CPUStatus convertCPUStatus(Result result) {
CPUStatus cpuStatus = new CPUStatus();
int[] loads = new int[result.getListResults().size()];
int i = 0;
for (Map<String, Object> properties : result.getListResults()) {
int load = Integer.parseInt(String.valueOf(properties
.get("cpuLoad")));
loads[i++] = load;
log().info(" cpu load " + load);
// 加入到历史信息集合,便于后面存入DB
networkEntityList.add(converHostHistory(properties,
SnmpDeviceConstants.CPU));
}
cpuStatus.setLoads(loads);
return cpuStatus;
}
private NetworkHistoryEntity converHostHistory(Map<String, Object> map,
String type) {
NetworkHistoryEntity bean = new NetworkHistoryEntity();
int keyindex = 1;
for (Entry<String, Object> entry : map.entrySet()) {
bean.setKey(String.valueOf(entry.getKey()));
bean.setValue(String.valueOf(entry.getValue()));
bean.setKeyindex(keyindex++);
bean.setDeviceType(type);
}
bean.setTime(new Date());
return bean;
}
private void extra(NetworkDeviceStatus networkDeviceStatus,Result result){
for (Map<String, Object> properties : result.getListResults()) {
log().info(properties.toString());
String ipAdEntAddr = String.valueOf(properties.get("ipAdEntAddr"));
ipAdEntAddr = StringUtils.removeStart(ipAdEntAddr,"/");
String netMask = String.valueOf(properties.get("ipAdEntNetMask"));
netMask = StringUtils.removeStart(netMask,"/");
for(InterfaceStatus interfaceStatus : networkDeviceStatus.getNetworkStatus().getInterfaceStatus()){
if(interfaceStatus.getIpAddress().equals(ipAdEntAddr)){
interfaceStatus.setNetMask(netMask);
}
}
}
}
// 属性赋值
private void copyProperties(String nodeid, String ipAddr, String brand) {
m_baseEntity = new SnmpDeviceHistoryBaseEntity();
m_baseEntity.setNodeid(nodeid);
m_baseEntity.setIpAddr(ipAddr);
m_baseEntity.setTime(new Date());
m_baseEntity.setType(brand);
m_baseEntity.setDomain(SnmpDeviceLocator.getDomainId(nodeid));
m_baseEntity.setNetworkHistory(networkEntityList);
}
private void populate(Object bean, Map<String, Object> properties) {
try {
BeanUtils.populate(bean, properties);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
ThreadCategory log() {
return ThreadCategory.getInstance(getClass());
}
}