package org.infosec.ismp.manager.agent;
import java.beans.PropertyChangeSupport;
import java.io.File;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.infosec.ismp.manager.agent.servicecheck.AgentRemoveServiceCheckTask;
import org.infosec.ismp.manager.agent.servicecheck.ServiceCheckNode;
import org.infosec.ismp.manager.agent.sitecheck.AgentRemoveSiteCheckTask;
import org.infosec.ismp.manager.agent.sitecheck.AgentResetSiteCheckTask;
import org.infosec.ismp.manager.agent.sitecheck.SiteCheckNode;
import org.infosec.ismp.manager.agent.task.AgentTodoTask;
import org.infosec.ismp.manager.agent.task.AgentTodoTask.AgentTodoType;
import org.infosec.ismp.manager.db.task.AgentRemoveDatabaseTask;
import org.infosec.ismp.manager.db.task.DatabaseNode;
import org.infosec.ismp.manager.ping.AgentRemovePingTask;
import org.infosec.ismp.manager.ping.PingNode;
import org.infosec.ismp.manager.snmp.task.AgentRemoveSnmpDeviceTask;
import org.infosec.ismp.manager.snmp.task.SnmpDeviceNode;
import org.infosec.ismp.manager.snmpTrap.AgentRemoveSnmpTrapTask;
import org.infosec.ismp.manager.syslog.task.AgentRemoveSyslogTask;
import org.infosec.ismp.manager.syslog.task.SyslogNode;
import org.infosec.ismp.util.ThreadCategory;
/**
* 代表远程的Agent对象,不使用Spring管理,因为该对象需要根据Agent对象动态创建,因此 需要手工注入管理Agent对象数据库操作对象。
*
* @author lianglin
*
*/
public class AgentComponent {
private boolean active = false;
// Agent的唯一标识
private final String agentId;
// 标识Agent是否重启,重启后uuid不一样
private String uuid;
// 激活时间
private long activeTime;
private Set<AgentTaskNode> m_taskNodes = new HashSet<AgentTaskNode>();
// /**
// * 所有的Ping任务
// */
// private Set<PingNode> m_pingNodes = new HashSet<PingNode>();
// /**
// * 所有的Syslog任务
// */
// private Set<SyslogNode> m_syslogNodes = new HashSet<SyslogNode>();
//
// /**
// * 所有的网页安全检查任务
// */
// private Set<SiteCheckNode> m_siteCheckNodes = new
// HashSet<SiteCheckNode>();
//
//
// /**
// * 所有的服务检查任务
// */
// private Set<ServiceCheckNode> m_serviceCheckNodes = new
// HashSet<ServiceCheckNode>();
//
// /**
// * 所有的Snmp任务
// */
// private Set<SnmpCollectdNode> m_snmpCollectdNodes = new
// HashSet<SnmpCollectdNode>();
//
// /**
// * 所有的JDBC任务
// */
// private Set<JdbcCollectdNode> m_jdbcCollectdNodes = new
// HashSet<JdbcCollectdNode>();
private PropertyChangeSupport m_support = new PropertyChangeSupport(this);
/**
* 代表有个对应的远程Agent存在或者曾经存在
*/
private AgentCompSnapShot m_snapShot;
/**
* 任务数
*/
private int nodeCount = 0;
/**
* 序列化文件
*/
private File tempFile;
/**
* 创建一个新的AgentComponent
*/
public AgentComponent(String agentId) {
this.agentId = agentId;
}
public boolean isActive() {
return this.active;
}
public void setActive(boolean active) {
boolean newValue = active;
boolean oldValue = this.active;
if (newValue != oldValue) {
this.active = active;
m_support.firePropertyChange("active", oldValue, newValue);
}
}
ThreadCategory log() {
return ThreadCategory.getInstance(getClass());
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Agent的AgentId是: " + agentId);
// builder.append("; Agent的ipaddr是: "+ipAddr);
builder.append("; agent的uuid是: " + uuid);
// builder.append("; agent的port是"+port);
return builder.toString();
}
/**
* 返回该Agent的所有任务数
*
* @return
*/
public int getAllNodeCount() {
return this.nodeCount;
}
protected void increaseNodeCount() {
this.nodeCount += 1;
}
protected void decreaseNodeCount() {
this.nodeCount -= 1;
}
protected void addAgentTodoTask(AgentTodoTask task) {
// m_todoNodes.add(task);
if (m_snapShot != null) {
m_snapShot.addAgentTask(task);
}
}
protected void addTaskNodeDo(AgentTaskNode node) {
m_taskNodes.add(node);
}
/**
* 添加Syslog节点
*
* @param node
*/
public void addSyslogNode(SyslogNode node) {
// increaseNodeCount();
// addTaskNodeDo(node);
// AgentTodoTask task = node.convertToTask();
// addAgentTodoTask(task);
addAgentTaskNode(node);
}
/**
* 添加Ping任务
*/
public void addPingNode(PingNode pingNode) {
addAgentTaskNode(pingNode);
}
public void addAgentTaskNode(AgentTaskNode pingNode) {
increaseNodeCount();
addTaskNodeDo(pingNode);
AgentTodoTask task = pingNode.convertToTask();
addAgentTodoTask(task);
}
/**
* 删除Syslog节点
*
* @param nodeid
*/
public void removeSyslogNode(String nodeid) {
AgentTaskNode node = findTaskNode(nodeid, AgentTodoType.SYSLOG);
if (node != null) {
removeTaskNodeDo(node);
decreaseNodeCount();
AgentRemoveSyslogTask task = new AgentRemoveSyslogTask(nodeid);
addAgentTodoTask(task);
}
}
private void removeTaskNodeDo(AgentTaskNode node) {
m_taskNodes.remove(node);
}
protected AgentTaskNode findTaskNode(String nodeid, AgentTodoType type) {
AgentTaskNode rev = null;
if(m_taskNodes != null){
for (AgentTaskNode node : m_taskNodes) {
if (nodeid.equals(node.getNodeid()) && node.getType() == type) {
rev = node;
break;
}
}
}
return rev;
}
/**
* 添加snmp采集
*
* @param node
*/
public void addSnmpCollectdNode(SnmpDeviceNode node) {
addAgentTaskNode(node);
}
/**
* 删除snmp采集
*
* @param nodeid
*/
public void removeSnmpCollectdNode(String nodeid) {
AgentTaskNode node = findTaskNode(nodeid, AgentTodoType.SNMP);
if (node != null) {
removeTaskNodeDo(node);
decreaseNodeCount();
AgentRemoveSnmpDeviceTask task = new AgentRemoveSnmpDeviceTask(
nodeid);
addAgentTodoTask(task);
}
}
/**
* 添加jdbc采集
*
* @param node
*/
public void addJdbcCollectdNode(DatabaseNode node) {
addAgentTaskNode(node);
}
/**
* 删除jdbc采集
*
* @param nodeid
*/
public void removeJdbcCollectdNode(String nodeid) {
AgentTaskNode node = findTaskNode(nodeid, AgentTodoType.JDBC);
if (node != null) {
removeTaskNodeDo(node);
decreaseNodeCount();
AgentRemoveDatabaseTask task = new AgentRemoveDatabaseTask(nodeid);
addAgentTodoTask(task);
}
}
/**
* 添加网页检测
*
* @param node
*/
public void addSiteCheckNode(SiteCheckNode node) {
addAgentTaskNode(node);
}
/**
* 删除网页检测
*
* @param nodeid
*/
public void removeSiteCheckNode(String nodeid) {
AgentTaskNode node = findTaskNode(nodeid, AgentTodoType.SITECHECK);
if (node != null) {
removeTaskNodeDo(node);
decreaseNodeCount();
AgentRemoveSiteCheckTask task = new AgentRemoveSiteCheckTask(nodeid);
addAgentTodoTask(task);
}
}
public void addServiceCheck(ServiceCheckNode node) {
addAgentTaskNode(node);
}
public void removeServiceCheckNode(String nodeid) {
AgentTaskNode node = findTaskNode(nodeid, AgentTodoType.SERVICECHECK);
if (node != null) {
removeTaskNodeDo(node);
decreaseNodeCount();
AgentRemoveServiceCheckTask task = new AgentRemoveServiceCheckTask(
nodeid);
addAgentTodoTask(task);
}
}
// ///////////////////////////////////////ping
// //////////////////////////////////////////////////
/**
* 删除一个Ping任务
*
* @param nodeid
*/
public void removePingNode(String nodeid) {
AgentTaskNode node = findTaskNode(nodeid, AgentTodoType.PING);
if (node != null) {
removeTaskNodeDo(node);
decreaseNodeCount();
AgentRemovePingTask task = new AgentRemovePingTask(nodeid);
addAgentTodoTask(task);
}
}
// public void removeTaskNode(String nodeid,AgentTodoType type){
//
// }
public void setTempFile(File file) {
this.tempFile = file;
}
/**
* 每次收到注册事件时调用接口
*
* @param uuid
* @param ipaddr
* @param port
*/
public void register(String uuid, String ipaddr, int port) {
activeTime = System.currentTimeMillis();
setActive(true);
if (m_snapShot == null) {// 第一次注册
m_snapShot = new AgentCompSnapShot(this, tempFile);
}
m_snapShot.register(uuid, ipaddr, port);
}
/**
* 返回注册时间
*
* @return
*/
public long getRegisterTime() {
return activeTime;
}
/**
* 将Agent至于不在线状态
*/
public void unactive() {
setActive(false);
if (m_snapShot != null) {
m_snapShot.setActive(false);
}
}
public String getAgentId() {
return agentId;
}
public static void main(String[] args) {
AgentComponent agent = new AgentComponent("test");
agent.setTempFile(new File("test.ser"));
agent.register("xxxx", "192.168.9.254", 192);
// agent.save();
System.out.println("agent is : " + agent);
agent = new AgentComponent("test");
agent.setTempFile(new File("test.ser"));
// agent.init();
System.out.println("agent is : " + agent);
}
public List<AgentTaskNode> getAllTaskNodes() {
List<AgentTaskNode> tasks = new LinkedList<AgentTaskNode>();
tasks.addAll(m_taskNodes);
return tasks;
}
public void resetSiteCheck(String nodeid) {
//FIXME BUG WHEN Agent is offline
AgentResetSiteCheckTask task = new AgentResetSiteCheckTask(nodeid);
addAgentTodoTask(task);
}
public int getAgentPort() {
if(m_snapShot!=null)return m_snapShot.getAgentPort();
return -1;
}
public String getAgentAddress() {
if(m_snapShot!=null)return m_snapShot.getAgentAddress();
return null;
}
/**
* 删除snmpTrap任务节点
* @param nodeid
*/
public void removeSnmpTrapNode(String nodeid) {
AgentTaskNode node = findTaskNode(nodeid, AgentTodoType.SNMPTRAP);
if (node != null) {
removeTaskNodeDo(node);
decreaseNodeCount();
AgentRemoveSnmpTrapTask task = new AgentRemoveSnmpTrapTask(nodeid);
addAgentTodoTask(task);
}
}
// public void init() {
// if(tempFile.exists()){
// m_snapShot = new AgentCompSnapShot(this, tempFile);
// m_snapShot.read();
// log().info("从快照中恢复Agent,快照文件位置是:"+tempFile+",AgentId is : "+agentId);
// }else{
// log().info("该Agent没有快照,Agent is : "+agentId);
// }
//
// }
}