package org.infosec.ismp.manager.syslog;
import java.io.UnsupportedEncodingException;
import org.infosec.ismp.manager.syslog.dao.RawSyslogService;
import org.infosec.ismp.manager.syslog.dao.SyslogParserService;
import org.infosec.ismp.model.syslog.MessageDiscardedException;
import org.infosec.ismp.model.syslog.RawSyslog;
import org.infosec.ismp.model.syslog.SyslogDeepParser;
import org.infosec.ismp.model.syslog.SyslogEntity;
import org.infosec.ismp.model.syslog.SyslogParser;
import org.infosec.ismp.util.ThreadCategory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 管理Agent端的syslog处理
* @author lianglin
*
*/
@Component
public class SyslogProcessorManager {
private SyslogParserService m_parserService;
private RawSyslogService m_rawSyslogService;
@Autowired(required=true)
public void setParserService(SyslogParserService parserService) {
m_parserService = parserService;
}
@Autowired(required=true)
public void setRawSyslogService(RawSyslogService rawSyslogService) {
m_rawSyslogService = rawSyslogService;
}
public void processSyslog(RawSyslog rawSyslog, String type,String domain) {
SyslogParser parser = m_parserService.getRawSyslogParser(type);
if(parser!=null){
byte[] data = rawSyslog.getContents();
int len = data.length;
try {
SyslogEntity syslog = parser.parseSyslog(data, len);
syslog.setNodeid(rawSyslog.getNodeid());
syslog.setIpaddr(rawSyslog.getIpaddr());
saveRawSyslog(syslog);
syslog.setDomain(domain);
SyslogDeepParser deepParser = m_parserService.getSyslogDeepParser(type);
if(deepParser!=null){
deepParser.createProcessRunnable(syslog).run();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (MessageDiscardedException e) {
e.printStackTrace();
}
}
}
private void saveRawSyslog(SyslogEntity syslog){
m_rawSyslogService.saveRawSyslog(syslog);
}
public void processSyslog(RawSyslog rawSyslog,String domain) {
byte[] contents = rawSyslog.getContents();
int len = contents.length;
String txt = new String(contents,0,len);
String type = getSyslogTypeByKeyWord(txt);
if(!"unknown".equals(type)){
processSyslog(rawSyslog,type,domain);
}else{
log().warn("该日志没有找到对应处理类型,抛弃");
}
}
public String getSyslogTypeByKeyWord(String syslogTxt){
//FIXME 此处没有完成
if(syslogTxt.contains("hillstone")){
return "hillstone";
}
return "unknown";
}
ThreadCategory log(){
return ThreadCategory.getInstance(getClass());
}
}