package org.infosec.ismp.manager.winsensor; import java.util.ArrayList; import java.util.Date; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.infosec.ismp.agent.comm.winsensor.model.CommThreshold; import org.infosec.ismp.agent.comm.winsensor.model.CommWinsensorDevice; import org.infosec.ismp.agent.comm.winsensor.model.operation.DutyManager; import org.infosec.ismp.agent.comm.winsensor.model.operation.Problem; import org.infosec.ismp.agent.comm.winsensor.model.status.HostResource; import org.infosec.ismp.agent.comm.winsensor.model.status.RegisterOfflineStatus; import org.infosec.ismp.agent.comm.winsensor.model.status.RegisterOnlineStatus; import org.infosec.ismp.agent.comm.winsensor.model.strategy.CommBaseStrategy; import org.infosec.ismp.agent.comm.winsensor.model.strategy.CommWindowsLogStrategy; import org.infosec.ismp.agent.comm.winsensor.model.windowslog.WindowsLog; import org.infosec.ismp.agent.rmi.winsensor.service.AgentWinsensorService; import org.infosec.ismp.manager.winsensor.alert.HostResourceAlertGenerator; import org.infosec.ismp.manager.winsensor.entity.AgentBO; import org.infosec.ismp.manager.winsensor.entity.ManagerWinsensorDeviceBO; import org.infosec.ismp.manager.winsensor.history.service.HostResourceHistoryService; import org.infosec.ismp.manager.winsensor.operation.entity.ManagerProblemBO; import org.infosec.ismp.manager.winsensor.operation.service.DutyManagerSentHistoryService; import org.infosec.ismp.manager.winsensor.operation.service.DutyManagerService; import org.infosec.ismp.manager.winsensor.operation.service.ManagerProblemService; import org.infosec.ismp.manager.winsensor.patch.service.PatchClientService; import org.infosec.ismp.manager.winsensor.service.AgentService; import org.infosec.ismp.manager.winsensor.service.ManagerWinsensorDeviceService; import org.infosec.ismp.manager.winsensor.service.ThresholdService; import org.infosec.ismp.manager.winsensor.windowslog.entity.PcLogBO; import org.infosec.ismp.manager.winsensor.windowslog.entity.PcLogSourceBO; import org.infosec.ismp.manager.winsensor.windowslog.service.PcLogService; import org.infosec.ismp.manager.winsensor.windowslog.service.PcLogSourceService; import org.springframework.remoting.rmi.RmiProxyFactoryBean; /** * @author Rocky * @version create time:Dec 17, 2010 3:23:02 PM * */ public class ManagerSensorServer { private static Log log = LogFactory.getLog(ManagerSensorServer.class); private AgentService agentService; //Loading by Spring. private ManagerWinsensorDeviceService deviceService; //Loading by Spring. private PcLogSourceService pcLogSourceService; //Loading by Spring. private PcLogService pcLogService; //Loading by Spring. private PatchClientService patchClientService; //Loading by Spring. private ThresholdService thresholdService; //Loading by Spring. private HostResourceHistoryService hostResourceHistoryService; //Loading by Spring. private HostResourceAlertGenerator hostResourceAlertGenerator; //Loading by Spring. private DutyManagerService dutyManagerService; //Loading by Spring. private DutyManagerSentHistoryService dutyManagerSentHistoryService; //Loading by Spring. private ManagerProblemService managerProblemService; /* * 定时启动HostResource状态执行器的周期 */ private int hostResourceStatusScheduledInterval; //Loading by Spring. /* * HostResource状态缓存的时间,为0则永远缓存。单位:毫秒。 */ private long hostResourceCacheTime; //Loading by Spring. /* * Agent RMI registry port. */ private String registryPort; //Loading by Spring. /* * Agent winsensor service name. */ private String agentWinsensorServiceName; //Loading by Spring. /* * 默认的定时启动HostResource状态执行器的周期 */ private static final int DEFAL_HOST_RESOURCE_STATUS_SCHEDULED_INTERVAL = 30; /* * All legal agents's info, include identify and ip address. */ private List<AgentBO> allAgents = new ArrayList<AgentBO>(); /* * All legal device, include all online and off-line device. */ private List<ManagerWinsensorDeviceBO> allManagerWinsensorDevices = new ArrayList<ManagerWinsensorDeviceBO>(); /* * All current monitoring commDevice. */ private List<CommWinsensorDevice> allCurrentMonitoringDevices = new ArrayList<CommWinsensorDevice>(); /* * All sensorId of PcLogSource that sensor basic info was not synchronized. */ private List<String> allUnSynchronizedSensorIdsOfPcLogSource = new ArrayList<String>(); /* * Store all current effective host resources. * key: monitoring device's nodeId(identify in system). */ private Hashtable<String, HostResourceClient> allCurrentEffectiveHostResources = new Hashtable<String, HostResourceClient>(2500); /* * Store all agentId of agent that contains not send dutyManagers. */ private List<String> allAgentIdsContainUnsendDutyManager = new ArrayList<String>(); private LinkedBlockingQueue<HostResource> hostResourceContainer = new LinkedBlockingQueue<HostResource>(2500); private LinkedBlockingQueue<List<WindowsLog>> windowsLogContainer = new LinkedBlockingQueue<List<WindowsLog>>(2500); private LinkedBlockingQueue<RegisterOnlineStatus> registerOnlineStatusContainer = new LinkedBlockingQueue<RegisterOnlineStatus>(2500); private LinkedBlockingQueue<RegisterOfflineStatus> registerOfflineStatusContainer = new LinkedBlockingQueue<RegisterOfflineStatus>(2500); private ScheduledExecutorService service = Executors.newScheduledThreadPool(1); public void init() { log.info("Manager sensor server init starting."); //Load all agent info. allAgents = agentService.getAllAgent(); //Load all legal monitor device. allManagerWinsensorDevices = deviceService.getAllDevice(); //Load all pcLogSource that not synchronized sensor basic info. List<PcLogSourceBO> pcLogSources = pcLogSourceService.getAllUnSynchronizedSource(); for (PcLogSourceBO pcLogSource : pcLogSources) { allUnSynchronizedSensorIdsOfPcLogSource.add(pcLogSource.getSensorId()); } hostResourceHistoryService.init(); hostResourceAlertGenerator.init(); //Load all agentId contains unSend dutyManager. allAgentIdsContainUnsendDutyManager = dutyManagerSentHistoryService.getAllUnSentDutyManagerAgentId(); start(); log.info("Manager sensor server init finish."); } public void start() { OnlineStatusProcessor onlineStatusProcessor = new OnlineStatusProcessor(); new Thread(onlineStatusProcessor, "online status processor thread").start(); HostResourceProcessor hostResourceProcessor = new HostResourceProcessor(); new Thread(hostResourceProcessor, "hostResource processor thread").start(); WindowsLogProcessor windowsLogProcessor = new WindowsLogProcessor(); new Thread(windowsLogProcessor, "windowsLog processor thread").start(); OfflineStatusProcessor offlineStatusProcessor = new OfflineStatusProcessor(); new Thread(offlineStatusProcessor, "offline status processor thread").start(); if (getHostResourceCacheTime() > 0) { HostResourceStatusScheduledExecutor hostResourceStatusScheduledExecutor = new HostResourceStatusScheduledExecutor(); service.scheduleAtFixedRate(new Thread(hostResourceStatusScheduledExecutor, "基本信息状态管理执行器"), 100, (getHostResourceStatusScheduledInterval() <= 0) ? DEFAL_HOST_RESOURCE_STATUS_SCHEDULED_INTERVAL : getHostResourceStatusScheduledInterval(), TimeUnit.SECONDS); } } /* * Get all current online devices, including monitored and not monitor device. * Provided to the topology discovery module calls. */ public List<CommWinsensorDevice> getAllTopoDiscoveryDevices() { return allCurrentMonitoringDevices; } /* * Add the monitor device. */ public void addMonitorDevice(CommWinsensorDevice commDevice) { ManagerWinsensorDeviceBO device = getDeviceFromAllDevicesBySensorId(commDevice.getSensorId()); AgentWinsensorService service = getRmiAgentWinsensorService(device); if (service != null) { //Rmi add monitor device into agent server. service.addMonitorDevice(commDevice); //Update device info(the informations generate by topo manager) in manager server. device.setNodeId(commDevice.getNodeId()); device.setStartMonitorTime(new Date()); device.setDomainId(commDevice.getDomainId()); deviceService.updateDevice(device); //Add pcLogSource. pcLogSourceService.addSource(Integer.valueOf(commDevice.getDomainId()), commDevice.getSensorId(), commDevice.getIp(), commDevice.getMac()); allUnSynchronizedSensorIdsOfPcLogSource.add(commDevice.getSensorId()); //Add patchClient. patchClientService.addClient(commDevice.getSensorId(), commDevice.getIp(), commDevice.getMac(), Integer.valueOf(commDevice.getDomainId())); } } public void addMonitorDevice(List<CommWinsensorDevice> commDevices) { for (CommWinsensorDevice commDevice : commDevices) { addMonitorDevice(commDevice); } } /* * Starting monitor device. */ public void startingMonitor(String nodeId) { ManagerWinsensorDeviceBO device = getDeviceFromAllDeviceByNodeId(nodeId); AgentWinsensorService service = getRmiAgentWinsensorService(device); if (service != null) { service.startingMonitor(nodeId); pcLogSourceService.startMonitorSource(device.getSensorId()); } } public void startingMonitor(List<String> nodeIds) { for (String nodeId : nodeIds) { startingMonitor(nodeId); } } /* * Pause monitor device. */ public void pauseMonitor(String nodeId) { ManagerWinsensorDeviceBO device = getDeviceFromAllDeviceByNodeId(nodeId); AgentWinsensorService service = getRmiAgentWinsensorService(device); if (service != null) { service.pauseMonitor(nodeId); pcLogSourceService.pauseMonitorSource(device.getSensorId()); } } public void pauseMonitor(List<String> nodeIds) { for (String nodeId : nodeIds) { pauseMonitor(nodeId); } } /* * Stop monitor device. */ public void deleteMonitorDevice(String nodeId) { ManagerWinsensorDeviceBO device = getDeviceFromAllDeviceByNodeId(nodeId); AgentWinsensorService service = getRmiAgentWinsensorService(device); if (service != null) { service.stopMonitor(nodeId); deviceService.deleteDevice(device); allManagerWinsensorDevices.remove(device); pcLogSourceService.deleteSource(device.getSensorId()); } } public void deleteMonitorDevice(List<String> nodeIds) { for (String nodeId : nodeIds) { deleteMonitorDevice(nodeId); } } /* * Get monitoring device's current host resource. * return null if nodeId is not exist. */ public HostResource getHostResource(String nodeId) { if (allCurrentEffectiveHostResources.get(nodeId) != null) { return allCurrentEffectiveHostResources.get(nodeId).getHostResource(); } return null; } /* * Update various of strategy. */ public void updateStrategy(ManagerWinsensorDeviceBO device, CommBaseStrategy strategy) { AgentWinsensorService service = getRmiAgentWinsensorService(device); if (service != null) { List<CommBaseStrategy> strategies = new ArrayList<CommBaseStrategy>(); strategies.add(strategy); service.updateStrategy(strategies); } } /* * Add pcLogSource. */ public void addPcLogSource(Map<String, Long> sensors) { Set<String> sensorIdsSet = sensors.keySet(); Object[] sensorIds = sensorIdsSet.toArray(); for (int i = 0; i < sensorIds.length; i++) { String sensorId = (String) sensorIds[i]; ManagerWinsensorDeviceBO device = getDeviceFromAllDevicesBySensorId(sensorId); if (device != null) { CommWindowsLogStrategy strategy = new CommWindowsLogStrategy(); strategy.setAFailure(true); strategy.setApplication(true); strategy.setASuccess(true); strategy.setCreateTime(new Date()); strategy.setError(true); strategy.setInformation(true); strategy.setInterval(sensors.get(sensorId).intValue()); strategy.setIp(device.getSensorIp()); strategy.setRemoteId(0); strategy.setSecurity(true); strategy.setSensorId(sensorId); strategy.setSystem(true); strategy.setWarning(true); //URL not set. updateStrategy(device, strategy); } } } public void deletePclogSource(String sensorId) { if (StringUtils.isBlank(sensorId)) { return; } ManagerWinsensorDeviceBO device = getDeviceFromAllDevicesBySensorId(sensorId); if (device != null) { CommWindowsLogStrategy strategy = new CommWindowsLogStrategy(); strategy.setAFailure(false); strategy.setApplication(false); strategy.setASuccess(false); strategy.setCreateTime(new Date()); strategy.setError(false); strategy.setInformation(false); strategy.setInterval(0); strategy.setIp(device.getSensorIp()); strategy.setRemoteId(0); strategy.setSecurity(false); strategy.setSensorId(sensorId); strategy.setSystem(false); strategy.setWarning(false); //URL not set. updateStrategy(device, strategy); } } /* * Add new threshold. */ public void addThreshold(CommThreshold commThreshold) { thresholdService.addThreshold(commThreshold); hostResourceAlertGenerator.reloadThresholds(); } /* * Update the threshold. */ public void updateThreshold(Long id, Integer level, Long size) { thresholdService.updateThreshold(id, level, size); hostResourceAlertGenerator.reloadThresholds(); } /* * Delete threshold by nodeId. */ public void deleteThresholdByNodeId(String nodeId) { thresholdService.deleteThresholdByNodeId(nodeId); hostResourceAlertGenerator.reloadThresholds(); } /* * Delete threshold by id. */ public void deleteThresholdById(Long id) { thresholdService.deleteThresholdById(id); } /* * Publish DutyManager */ public void publishDutyManager(List<DutyManager> dutyManagers) { //Saved dutyManagers to the database. dutyManagerService.addDutyManager(dutyManagers); //Create dutyManagers history to all agent(exist in system). dutyManagerSentHistoryService.addSentHistory(dutyManagers, allAgents); //Sent dutyManagers to all agent, //when sent successful, then refresh dutyManagers history and mark it sent successful. for (AgentBO agent : allAgents) { AgentWinsensorService agentWinsensorService = getRmiAgentWinsensorService(agent.getAgentId()); if (agentWinsensorService != null) { agentWinsensorService.publishDutyManager(dutyManagers); dutyManagerSentHistoryService.updateSendSuccessHistory(dutyManagers, agent.getAgentId()); } else { allAgentIdsContainUnsendDutyManager.add(agent.getAgentId()); } } } public void republishDutyManager(List<DutyManager> dutyManagers, String agentId) { AgentWinsensorService agentWinsensorService = getRmiAgentWinsensorService(agentId); if (agentWinsensorService != null) { agentWinsensorService.publishDutyManager(dutyManagers); dutyManagerSentHistoryService.updateSendSuccessHistory(dutyManagers, agentId); allAgentIdsContainUnsendDutyManager.remove(agentId); } } /* * Delete DutyManager */ public void deleteDutyManager(String dutyManagerId) { dutyManagerService.deleteDutyManager(dutyManagerId); dutyManagerSentHistoryService.deleteDutyManager(dutyManagerId); for (AgentBO agent : allAgents) { AgentWinsensorService agentWinsensorService = getRmiAgentWinsensorService(agent.getAgentId()); if (agentWinsensorService != null) { agentWinsensorService.deleteDutyManager(dutyManagerId); } } } /* * Locate agent sensor ipAddress */ public String locateAgentIpByNodeId(ManagerWinsensorDeviceBO device) { if (null == device) { return ""; } AgentBO agent = getAgentByAgentId(device.getAgentId()); return ((agent == null) ? "" : agent.getIpAddress()); } /* * Get remote AgentWinsensorService */ public AgentWinsensorService getRmiAgentWinsensorService(ManagerWinsensorDeviceBO device) { if (device != null) { String ip = locateAgentIpByNodeId(device); return generateRmiAgentWinsensorService(ip); } return null; } public AgentWinsensorService generateRmiAgentWinsensorService(String ip) { if (!StringUtils.isBlank(ip)) { String serviceUrl = generateAgentWinsensorServiceUrl(ip); try { RmiProxyFactoryBean rmiProxyFactoryBean = new RmiProxyFactoryBean(); rmiProxyFactoryBean.setServiceInterface(AgentWinsensorService.class); rmiProxyFactoryBean.setServiceUrl(serviceUrl); rmiProxyFactoryBean.afterPropertiesSet(); return (AgentWinsensorService) rmiProxyFactoryBean.getObject(); } catch (Exception e) { //TODO log return null; } } return null; } public AgentWinsensorService getRmiAgentWinsensorService(String agentId) { AgentBO agent = getAgentByAgentId(agentId); if (agent != null) { return generateRmiAgentWinsensorService(agent.getIpAddress()); } return null; } /* * Generate remote agent sensor service URL */ public String generateAgentWinsensorServiceUrl(String ip) { String registryPort = (StringUtils.isBlank(getRegistryPort())) ? "1199" : getRegistryPort(); String serviceName = (StringUtils.isBlank(getAgentWinsensorServiceName())) ? "AgentWinsensorService" : getAgentWinsensorServiceName(); return "rmi://" + ip + ":" + registryPort + "/" + serviceName; } public ManagerWinsensorDeviceBO getDeviceFromAllDevicesBySensorId(String sensorId) { if (StringUtils.isBlank(sensorId)) { return null; } for (ManagerWinsensorDeviceBO device : allManagerWinsensorDevices) { if (device.getSensorId().equals(sensorId)) { return device; } } return null; } public ManagerWinsensorDeviceBO getDeviceFromAllDeviceByNodeId(String nodeId) { if (StringUtils.isBlank(nodeId)) { return null; } for (ManagerWinsensorDeviceBO device : allManagerWinsensorDevices) { if (device.getNodeId() != null && device.getNodeId().equals(nodeId)) { return device; } } return null; } public AgentBO getAgentByAgentId(String agentId) { if (StringUtils.isBlank(agentId)) { return null; } for (AgentBO agent : allAgents) { if (agent.getAgentId().equals(agentId)) { return agent; } } return null; } /* * Add host resource info. */ public void addHostResource(HostResource hostResource) { synchronized (hostResourceContainer) { hostResourceContainer.offer(hostResource); hostResourceContainer.notifyAll(); } } /* * Add windows log. */ public void addWindowsLog(List<WindowsLog> windowsLogs) { synchronized (windowsLogContainer) { windowsLogContainer.offer(windowsLogs); windowsLogContainer.notifyAll(); } } /* * Add register online status. */ public void addRegisterOnlineStatus(RegisterOnlineStatus onlineStatus) { synchronized (registerOnlineStatusContainer) { registerOnlineStatusContainer.offer(onlineStatus); registerOnlineStatusContainer.notifyAll(); } } /* * Add register off-line status. */ public void addRegisterOfflineStatus(RegisterOfflineStatus offlineStatus) { synchronized (registerOfflineStatusContainer) { registerOfflineStatusContainer.offer(offlineStatus); registerOfflineStatusContainer.notifyAll(); } } /* * Commit operation problem. */ public void commitOperationProblem(Problem problem) { if (problem != null) { ManagerWinsensorDeviceBO device = getDeviceFromAllDevicesBySensorId(problem.getSensorId()); if (device != null) { if (managerProblemService.addProblem(problem, device.getDomainId())) { AgentWinsensorService agentWinsensorService = getRmiAgentWinsensorService(device); if (agentWinsensorService != null) { agentWinsensorService.receivedOperationProblem(problem.getProblemId()); } } } } } public void closeOperationProblem(String problemId) { ManagerProblemBO problem = managerProblemService.findByProblemId(problemId); if (problem != null) { managerProblemService.closeOperationProblem(problem); ManagerWinsensorDeviceBO device = getDeviceFromAllDevicesBySensorId(problem.getSensorId()); if (device != null) { AgentWinsensorService agentWinsensorService = getRmiAgentWinsensorService(device); if (agentWinsensorService != null) { //RMI call agent and close problem. agentWinsensorService.closeOperationProblem(problemId); //Refresh database state. managerProblemService.sendProblemClosed(problem); } } } } public void generateWorkOrders(String problemId, String workOrdersId) { ManagerProblemBO problem = managerProblemService.findByProblemId(problemId); if (problem != null) { managerProblemService.generateWorkOrders(problem, workOrdersId); ManagerWinsensorDeviceBO device = getDeviceFromAllDevicesBySensorId(problem.getSensorId()); if (device != null) { AgentWinsensorService agentWinsensorService = getRmiAgentWinsensorService(device); if (agentWinsensorService != null) { agentWinsensorService.generateWorkOrders(problemId, workOrdersId); managerProblemService.sendGenerateWorkOrders(problem); } } } } public void closeWorkOrders(String problemId, String workOrdersId) { ManagerProblemBO problem = managerProblemService.findByProblemId(problemId); if (problem != null) { managerProblemService.closeWorkOrders(problem, workOrdersId); ManagerWinsensorDeviceBO device = getDeviceFromAllDevicesBySensorId(problem.getSensorId()); if (device != null) { AgentWinsensorService agentWinsensorService = getRmiAgentWinsensorService(device); if (agentWinsensorService != null) { agentWinsensorService.closeWorkOrders(problemId, workOrdersId); managerProblemService.sendWorkOrdersClosed(problem); } } } } public void completeWorkOrders(String problemId, String workOrdersId) { ManagerProblemBO problem = managerProblemService.findByProblemId(problemId); if (problem != null) { managerProblemService.completeWorkOrders(problem, workOrdersId); ManagerWinsensorDeviceBO device = getDeviceFromAllDevicesBySensorId(problem.getSensorId()); if (device != null) { AgentWinsensorService agentWinsensorService = getRmiAgentWinsensorService(device); if (agentWinsensorService != null) { agentWinsensorService.completeWorkOrders(problemId, workOrdersId); managerProblemService.sendWorkOrdersCompleted(problem); } } } } private RegisterOnlineStatus getNextRegisterOnlineStatus() { return registerOnlineStatusContainer.poll(); } private HostResource getNextHostResource() { return hostResourceContainer.poll(); } private List<WindowsLog> getNextWindowsLog() { return windowsLogContainer.poll(); } private RegisterOfflineStatus getNextRegisterOfflineStatus() { return registerOfflineStatusContainer.poll(); } /* * Handle hostResource sent by agent server. */ private class HostResourceProcessor implements Runnable { @Override public void run() { while (true) { synchronized (hostResourceContainer) { if (hostResourceContainer.isEmpty()) { try { hostResourceContainer.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else { for (int i = 0; i < hostResourceContainer.size(); i++) { HostResource hostResource = getNextHostResource(); //Update pcLogSource sensor basic info. String sensorId = hostResource.getWinsensorClientStatus().getSensorId(); if (allUnSynchronizedSensorIdsOfPcLogSource.contains(sensorId)) { pcLogSourceService.updateSourceBaseInfo(sensorId, hostResource.getLocalSystemlStatus().getComputerName(), hostResource.getLocalSystemlStatus().getOsInfo()); allUnSynchronizedSensorIdsOfPcLogSource.remove(sensorId); } //Handle hostResource history. hostResourceHistoryService.addHostResource(hostResource); //Handle hostResource threshold. hostResourceAlertGenerator.addHostResource(hostResource); HostResourceClient hostResourceClient = new HostResourceClient(hostResource); allCurrentEffectiveHostResources.remove(hostResource.getDevice().getNodeId()); allCurrentEffectiveHostResources.put(hostResource.getDevice().getNodeId(), hostResourceClient); } } } } } } /* * Handle windowsLog sent by agent server. */ private class WindowsLogProcessor implements Runnable { private long lastProcessTime; @Override public void run() { lastProcessTime = System.currentTimeMillis(); while (true) { synchronized (windowsLogContainer) { if ((windowsLogContainer.size() < Constants.WINDOWS_LOG_BATCH_SAVE_MEMORY_SIZE) && ((System.currentTimeMillis() - lastProcessTime) < Constants.WINDOWS_LOG_BATCH_SAVE_INTERVAL)) { try { windowsLogContainer.wait(10000); } catch (InterruptedException e) { e.printStackTrace(); } } else { List<PcLogBO> pcLogs = new ArrayList<PcLogBO>(); for (int i = 0; i < windowsLogContainer.size(); i++) { List<WindowsLog> windowsLogs = getNextWindowsLog(); for (WindowsLog windowsLog : windowsLogs) { pcLogs.add(PcLogBO.convert(windowsLog)); } } pcLogService.addLog(pcLogs); lastProcessTime = System.currentTimeMillis(); } } } } } /* * Handle online status sent by agent server. */ private class OnlineStatusProcessor implements Runnable { @Override public void run() { while (true) { synchronized (registerOnlineStatusContainer) { if (registerOnlineStatusContainer.isEmpty()) { try { registerOnlineStatusContainer.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else { for (int i = 0; i < registerOnlineStatusContainer.size(); i++) { RegisterOnlineStatus onlineStatus = getNextRegisterOnlineStatus(); CommWinsensorDevice commDevice = onlineStatus.getCommDevice(); //Add to cuurent monitoring devices list. if (!allCurrentMonitoringDevices.contains(commDevice)) { allCurrentMonitoringDevices.add(commDevice); } ManagerWinsensorDeviceBO device = getDeviceFromAllDevicesBySensorId(commDevice.getSensorId()); //It will be saved to the database when first register. if (device == null) { device = new ManagerWinsensorDeviceBO(); device.setAgentId(commDevice.getAgentId()); device.setRegisterTime(new Date()); device.setSensorId(commDevice.getSensorId()); device.setSensorIp(commDevice.getIp()); deviceService.addDevice(device); allManagerWinsensorDevices.add(device); } else if (!device.getAgentId().equals(commDevice.getAgentId())) { //If device agentId is changed, update database. device.setAgentId(commDevice.getAgentId()); deviceService.updateDevice(device); } AgentBO agent = getAgentByAgentId(commDevice.getAgentId()); //Add agent info, when the agent is not exist. if (agent == null) { agent = new AgentBO(); agent.setAgentId(commDevice.getAgentId()); agent.setIpAddress(commDevice.getAgentAddress()); agent.setCreateTime(new Date()); agentService.addAgent(agent); allAgents.add(agent); allAgentIdsContainUnsendDutyManager.add(agent.getAgentId()); //TODO Insert DutyManager and Agent mapping into database, //And before that should be refresh DutyManager table and DutyManagerHistory table, //update expired column when endDate large than current time. } else if (!agent.getIpAddress().equals(commDevice.getAgentAddress())) { //If agent ipAddress is changed, update database. agent.setIpAddress(commDevice.getAgentAddress()); agent.setUpdateTime(new Date()); agentService.updateAgent(agent); } //Handle operation dutyManager info that unsent to agent. if (allAgentIdsContainUnsendDutyManager.contains(agent.getAgentId())) { List<String> dutyManagerIds = dutyManagerSentHistoryService.getAllUnsentDutyManagerId(agent.getAgentId(), false); List<DutyManager> dutyManagers = dutyManagerService.getAllDutyManagerById(dutyManagerIds); republishDutyManager(dutyManagers, agent.getAgentId()); } } } } } } } private class OfflineStatusProcessor implements Runnable { @Override public void run() { while (true) { synchronized (registerOfflineStatusContainer) { if (registerOfflineStatusContainer.isEmpty()) { try { registerOfflineStatusContainer.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else { for (int i = 0; i < registerOfflineStatusContainer.size(); i++) { RegisterOfflineStatus offlineStatus = getNextRegisterOfflineStatus(); CommWinsensorDevice commDevice = offlineStatus.getCommDevice(); allCurrentMonitoringDevices.remove(commDevice); } } } } } } private class HostResourceStatusScheduledExecutor implements Runnable { @Override public void run() { synchronized (allCurrentEffectiveHostResources) { Set<String> nodeIds = allCurrentEffectiveHostResources.keySet(); Iterator<String> iterator = nodeIds.iterator(); while (iterator.hasNext()) { String nodeId = iterator.next(); HostResourceClient client = allCurrentEffectiveHostResources.get(nodeId); if ((client.getCreateTime() - System.currentTimeMillis()) > getHostResourceCacheTime()) { allCurrentEffectiveHostResources.remove(nodeId); } } } } } private class HostResourceClient { private HostResource hostResource; private long createTime; public HostResourceClient(HostResource vHostResource) { this.hostResource = vHostResource; this.createTime = System.currentTimeMillis(); } public HostResource getHostResource() { return hostResource; } public long getCreateTime() { return createTime; } } // ********************* GETTER SETTER METHOD ********************* public AgentService getAgentService() { return agentService; } public void setAgentService(AgentService agentService) { this.agentService = agentService; } public ManagerWinsensorDeviceService getDeviceService() { return deviceService; } public void setDeviceService(ManagerWinsensorDeviceService deviceService) { this.deviceService = deviceService; } public PcLogSourceService getPcLogSourceService() { return pcLogSourceService; } public void setPcLogSourceService(PcLogSourceService pcLogSourceService) { this.pcLogSourceService = pcLogSourceService; } public PcLogService getPcLogService() { return pcLogService; } public void setPcLogService(PcLogService pcLogService) { this.pcLogService = pcLogService; } public PatchClientService getPatchClientService() { return patchClientService; } public void setPatchClientService(PatchClientService patchClientService) { this.patchClientService = patchClientService; } public ThresholdService getThresholdService() { return thresholdService; } public void setThresholdService(ThresholdService thresholdService) { this.thresholdService = thresholdService; } public HostResourceHistoryService getHostResourceHistoryService() { return hostResourceHistoryService; } public void setHostResourceHistoryService( HostResourceHistoryService hostResourceHistoryService) { this.hostResourceHistoryService = hostResourceHistoryService; } public int getHostResourceStatusScheduledInterval() { return hostResourceStatusScheduledInterval; } public void setHostResourceStatusScheduledInterval( int hostResourceStatusScheduledInterval) { this.hostResourceStatusScheduledInterval = hostResourceStatusScheduledInterval; } public long getHostResourceCacheTime() { return hostResourceCacheTime; } public void setHostResourceCacheTime(long hostResourceCacheTime) { this.hostResourceCacheTime = hostResourceCacheTime; } public HostResourceAlertGenerator getHostResourceAlertGenerator() { return hostResourceAlertGenerator; } public void setHostResourceAlertGenerator( HostResourceAlertGenerator hostResourceAlertGenerator) { this.hostResourceAlertGenerator = hostResourceAlertGenerator; } public DutyManagerService getDutyManagerService() { return dutyManagerService; } public void setDutyManagerService(DutyManagerService dutyManagerService) { this.dutyManagerService = dutyManagerService; } public DutyManagerSentHistoryService getDutyManagerSentHistoryService() { return dutyManagerSentHistoryService; } public void setDutyManagerSentHistoryService( DutyManagerSentHistoryService dutyManagerSentHistoryService) { this.dutyManagerSentHistoryService = dutyManagerSentHistoryService; } public String getRegistryPort() { return registryPort; } public void setRegistryPort(String registryPort) { this.registryPort = registryPort; } public String getAgentWinsensorServiceName() { return agentWinsensorServiceName; } public void setAgentWinsensorServiceName(String agentWinsensorServiceName) { this.agentWinsensorServiceName = agentWinsensorServiceName; } public ManagerProblemService getManagerProblemService() { return managerProblemService; } public void setManagerProblemService(ManagerProblemService managerProblemService) { this.managerProblemService = managerProblemService; } }