package org.infosec.ismp.collectd.services; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.infosec.ismp.collectd.snmp.tracker.GenericColumnTracker; import org.infosec.ismp.collectd.snmp.tracker.SnmpCollectionDispatcher; import org.infosec.ismp.collectd.snmp.tracker.SnmpTableTracker; import org.infosec.ismp.model.snmp.Result; import org.infosec.ismp.model.snmp.Results; import org.infosec.ismp.snmp.AggregateTracker; import org.infosec.ismp.snmp.SnmpAgentConfig; import org.infosec.ismp.snmp.SnmpUtils; import org.infosec.ismp.snmp.SnmpWalker; import org.infosec.ismp.util.ThreadCategory; import org.infosec.ismp.util.scheduler.ReadyRunnable; import org.infosec.ismp.util.scheduler.Schedule; public class SnmpCollectableService implements ReadyRunnable { private Schedule m_schedule; /** * delete flag */ private volatile boolean m_deleted = false; private volatile boolean m_collectFailed = false; private volatile long m_lastSuccessTime = -1L; private SnmpAgentConfig m_agentConfig; private SnmpNetwork m_network; public SnmpCollectableService(SnmpAgentConfig agentConfig, SnmpNetwork network) { this.m_agentConfig = agentConfig; this.m_network = network; } private AggregateTracker[] m_trackers = null; public void onInit() { SnmpCollectionDispatcher dispatcher = new SnmpCollectionDispatcher( m_agentConfig.getAddress()); m_trackers = dispatcher.getAggregateTrackers(m_agentConfig.getType(),m_agentConfig.getBrand()); } @Override public void run() { if (m_trackers == null || m_trackers.length == 0) { log().warn("不支持该类型"); return; } SnmpWalker walker = SnmpUtils.createWalker(m_agentConfig, "snmpInfoCollectd", m_trackers); walker.start(); try { walker.waitFor(60 * 1000); } catch (InterruptedException e) { log().debug("waler.waitfor exception " + e); } Results results = new Results(); for (AggregateTracker tracker : m_trackers) { Result mssage = new Result(); if (!tracker.failed()) { if (tracker instanceof SnmpTableTracker) { SnmpTableTracker t = (SnmpTableTracker) tracker; List<Map<String, Object>> result = t.getStoreResult(); mssage.setListResults(result); mssage.setTrackerName(t.getTrackerName()); } else if (tracker instanceof GenericColumnTracker) { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); GenericColumnTracker t = (GenericColumnTracker) tracker; Map<String, Object> result = t.getStoreResult(); list.add(result); mssage.setListResults(list); mssage.setTrackerName(t.getTrackerName()); } else { throw new RuntimeException( "not support tracker,please check"); } }else{ System.out.println("AggregateTracker collect failed"); m_collectFailed = true; } results.addResult(mssage); } results.setNodeid(m_agentConfig.getNodeid()); results.setType(m_agentConfig.getType()); results.setBrand(m_agentConfig.getBrand()); results.setIpAddr(m_agentConfig.getAddress().getHostAddress()); m_network.getSnmpContext().dispatch(results); } @Override public boolean isReady() { return true; } /** * 将该服务放入调度池中 */ public void schedule() { if (m_schedule == null) throw new IllegalStateException( "Cannot schedule a service whose schedule is set to null"); m_schedule.schedule(); } /** * 取消该服务 */ public void delete() { if (m_schedule == null) throw new IllegalStateException( "Cannot unschedule a service whose schedule is set to null"); m_schedule.unschedule(); m_deleted = true; } /** * 判断snmp是否可达 * * @return */ public boolean isSnmpAvailable() { SnmpAvailabler availabler = new SnmpAvailabler(m_agentConfig); availabler.run(); return availabler.isAvailable(); } //////////////////////////////////////////////////////////////////////////// public Schedule getSchedule() { return m_schedule; } public void setSchedule(Schedule schedule) { m_schedule = schedule; } public boolean isDeleted() { return m_deleted; } public boolean isCollectFailed() { return m_collectFailed; } public long getLastSuccessTime() { return m_lastSuccessTime; } public SnmpAgentConfig getAgentConfig() { return m_agentConfig; } ThreadCategory log() { return ThreadCategory.getInstance(getClass()); } }