package org.infosec.ismp.sitecheck;
import java.io.IOException;
import java.lang.reflect.UndeclaredThrowableException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.HashMap;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.infosec.ismp.daemon.AbstractServiceDaemon;
import org.infosec.ismp.util.ThreadCategory;
import org.infosec.ismp.util.scheduler.LegacyScheduler;
import org.infosec.ismp.util.scheduler.Schedule;
import org.infosec.ismp.util.scheduler.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
@Qualifier("siteCheck")
public class SiteCheck extends AbstractServiceDaemon {
private final static String LOG4J_CATEGORY = "ISMP.SiteCheck";
private Scheduler m_scheduler;// 调度器
private int m_threads = 10;
private HashMap<String, SiteCheckService> siteMap = new HashMap<String, SiteCheckService>();
private SiteCheckMessageSend siteSend;
public SiteCheckMessageSend getSiteSend() {
return siteSend;
}
@Autowired(required=true)
@Qualifier("siteSend")
public void setSiteSend(SiteCheckMessageSend siteSend) {
this.siteSend = siteSend;
}
protected SiteCheck() {
super(LOG4J_CATEGORY);
}
@Override
protected void onInit() {
log().debug("init: init pingd component");
createScheduler();
}
private void createScheduler() {
ThreadCategory log = log();
// Create a scheduler
try {
log.debug("init: Creating "+LOG4J_CATEGORY+" scheduler");
setScheduler(new LegacyScheduler(LOG4J_CATEGORY, m_threads));
} catch (RuntimeException e) {
log.fatal("init: Failed to create "+LOG4J_CATEGORY+" scheduler", e);
throw e;
}
}
/**
*
* @param nodeid
* @param url
* @param interval
*/
public void siteCheck(String nodeid,String url,long interval){
String urltmp="";
if(null!=url&&!"".equals(url))
{
urltmp=url.toLowerCase().replaceFirst("http://", "");
}
HttpSiteMonitor monitor = new HttpSiteMonitor("http://"+urltmp);
try {
monitor.httpOnline();
} catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
log().warn("网址输入不正确或可能是协议不对或者返回的内容有问题!"+url,e);
return;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
log().warn("发生网络异常!"+url,e);
return;
}
if (siteMap.containsKey(nodeid)) {
log().error("该nodeid:"+nodeid+"已存在!请重新输入!");
return;
}
SiteCheckConfig config = new SiteCheckConfig();
config.setInterval(interval);
SiteCheckModel model = new SiteCheckModel();
model.setNodeid(nodeid);
model.setUrl(url);
SiteCheckService service = new SiteCheckService();
service.setModel(model);
service.setMonitor(monitor);
service.setSiteSend(siteSend);
Schedule schedule =new Schedule(service,config,m_scheduler);
service.setSchedule(schedule);
service.schedule();
siteMap.put(nodeid, service);
}
/**
*
* @param nodeid
*/
public void unSiteCheck(String nodeid){
if (siteMap.containsKey(nodeid)) {
SiteCheckService service = siteMap.get(nodeid);
service.delete();
siteMap.remove(nodeid);
log().debug("取消一个曾SiteCheck服务!nodeId:"+nodeid);
}else
{
log().debug("SiteCheck服务该nodeId:"+nodeid+"不存在服务中!");
}
}
/**
*
* @param nodeid
*/
public void resetSiteCheck(String nodeid){
if (siteMap.containsKey(nodeid)) {
SiteCheckService service = siteMap.get(nodeid);
service.resetSiteCheck();
log().debug(" 重置一个曾SiteCheck服务!nodeId:"+nodeid);
}else
{
log().debug("重置SiteCheck服务该nodeId:"+nodeid+"不存在服务中!");
}
}
@Override
protected void onStart() {
try {
if (log().isDebugEnabled())
log().debug("start: Starting snmp collectd scheduler");
getScheduler().start();
} catch (RuntimeException e) {
if (log().isEnabledFor(ThreadCategory.Level.FATAL))
log().fatal("start: Failed to start scheduler", e);
throw e;
}
try{
BroadcastEventProcessor processor = new BroadcastEventProcessor(this);
}catch (Exception ex) {
log().error("Failed to setup event reader", ex);
throw new UndeclaredThrowableException(ex);
}
}
public Scheduler getScheduler() {
return m_scheduler;
}
public void setScheduler(Scheduler scheduler) {
m_scheduler = scheduler;
}
public int getThreads() {
return m_threads;
}
public void setThreads(int threads) {
m_threads = threads;
}
@Override
protected void onStop() {
if (log().isDebugEnabled())
log().debug("stop: stoping snmp collectd scheduler");
if (getScheduler() != null) {
getScheduler().stop();
}
}
}