主题网站增加配置导入.

This commit is contained in:
zhangwenqing
2019-01-09 09:18:49 +08:00
parent 90927860f5
commit e793cad976
14 changed files with 577 additions and 12 deletions

View File

@@ -0,0 +1,40 @@
package com.nis.domain.configuration.template;
import com.nis.util.excel.ExcelField;
/**
* 主题网站配置导入模板类
* @author dell
*
*/
public class TopicWebsiteTemplate extends StringAllTemplate{
private Long topicId; // 主题
private Long websiteServiceId; // 网站
private String cfgKeywords; // 域名
@ExcelField(title="topic",dictType="TOPIC",sort=2)
public Long getTopicId() {
return topicId;
}
public void setTopicId(Long topicId) {
this.topicId = topicId;
}
@ExcelField(title="website_server",dictType="WEBSITE_SERVER",sort=3)
public Long getWebsiteServiceId() {
return websiteServiceId;
}
public void setWebsiteServiceId(Long websiteServiceId) {
this.websiteServiceId = websiteServiceId;
}
@ExcelField(title="domain_name",sort=4)
public String getCfgKeywords() {
return cfgKeywords;
}
public void setCfgKeywords(String cfgKeywords) {
this.cfgKeywords = cfgKeywords;
}
}

View File

@@ -448,6 +448,41 @@ public class ExportExcel {
commentStr=msgProp.getProperty("select")+":\n"+commentStr; commentStr=msgProp.getProperty("select")+":\n"+commentStr;
index++; index++;
} }
/*** 主题网站 ***/
if(("topic".equals(headerStr)) && (region.getFunctionId().equals(560))){
commentStr="";
List<SysDataDictionaryItem> dict=DictUtils.getDictList("TOPIC");
if(dict !=null && dict.size()>0){
for (SysDataDictionaryItem sysDataDictionaryItem : dict) {
commentStr=commentStr+" "+msgProp.getProperty(sysDataDictionaryItem.getItemValue(),sysDataDictionaryItem.getItemValue())+"\n";
index++;
}
}
commentStr=msgProp.getProperty("select")+":\n"+commentStr;
index++;
commentStr=commentStr+"\n"+msgProp.getProperty("rule_desc_tip")+":\n";
index++;
//1、非空
commentStr=commentStr+""+msgProp.getProperty("required")+"\n";
index++;
index++;
}
if(("website_server".equals(headerStr)) && (region.getFunctionId().equals(560))){
commentStr=commentStr+msgProp.getProperty("rule_desc_tip")+":\n";
index++;
//1、非空
commentStr=commentStr+""+msgProp.getProperty("required")+"\n";
index++;
}
if(("domain_name".equals(headerStr)) && (region.getFunctionId().equals(560))){
commentStr=commentStr+msgProp.getProperty("rule_desc_tip")+":\n";
index++;
//1、非空
commentStr=commentStr+""+msgProp.getProperty("required")+"\n";
index++;
}
if(region.getRegionType().equals(1)){//IP配置 if(region.getRegionType().equals(1)){//IP配置
//ip配置需要导入的信息srcIp srcPort destIp destPort Protocol Direction //ip配置需要导入的信息srcIp srcPort destIp destPort Protocol Direction
//确定需要导入的srcIp srcPort destIp destPort信息 //确定需要导入的srcIp srcPort destIp destPort信息

View File

@@ -0,0 +1,307 @@
package com.nis.util.excel.thread;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.jets3t.service.ServiceException;
import org.springframework.beans.BeanUtils;
import com.beust.jcommander.internal.Lists;
import com.nis.domain.FunctionRegionDict;
import com.nis.domain.FunctionServiceDict;
import com.nis.domain.configuration.AppTopicDomainCfg;
import com.nis.domain.configuration.WebsiteDomainTopic;
import com.nis.util.Constants;
import com.nis.web.security.UserUtils;
import com.nis.web.service.SpringContextHolder;
import com.nis.web.service.configuration.AppCfgService;
public class CheckTopicWebsiteFormatThread implements Callable<String>{
private Logger logger=Logger.getLogger(CheckTopicWebsiteFormatThread.class);
private BlockingQueue<? extends Object> srcQueue;
private BlockingQueue<AppTopicDomainCfg> destQueue;
private Properties prop;
private FunctionServiceDict serviceDict;
private FunctionRegionDict regionDict;
public CheckTopicWebsiteFormatThread(FunctionServiceDict serviceDict,FunctionRegionDict regionDict,Properties prop,BlockingQueue<? extends Object> srcQueue,BlockingQueue<AppTopicDomainCfg> destQueue) {
this.serviceDict=serviceDict;
this.regionDict=regionDict;
this.srcQueue=srcQueue;
this.destQueue=destQueue;
this.prop=prop;
}
@Override
public String call() throws Exception {
List<Object> dataList=Lists.newArrayList(Constants.MAAT_JSON_SEND_SIZE);
StringBuffer msg=new StringBuffer();
while(!srcQueue.isEmpty()) {
int size=srcQueue.drainTo(dataList,Constants.MAAT_JSON_SEND_SIZE);
if(regionDict.getRegionType().intValue()==2) {
try {
List<AppTopicDomainCfg> cfgs=this.checkTopicWebsiteCfg(msg,dataList);
destQueue.addAll(cfgs);
}catch (Exception e) {
logger.error("check topicDomainCfg error",e);
// TODO: handle exception
//msg=e.getMessage();
//break;
}
}
dataList.clear();
}
return msg.toString();
}
public List<AppTopicDomainCfg> checkTopicWebsiteCfg(StringBuffer msg,List<?> list) throws ServiceException {
logger.warn("start to validate topicDomainCfg data...");
long start=System.currentTimeMillis();
List<AppTopicDomainCfg> stringList = new ArrayList<AppTopicDomainCfg>();
String exprTypeP = regionDict.getConfigExprType();
if (StringUtils.isBlank(exprTypeP)) {
throw new RuntimeException("Found String region,but exprType is Empty");
}
String matchMethodP = regionDict.getConfigMatchMethod();
if (StringUtils.isBlank(matchMethodP)) {
throw new RuntimeException("Found String region,but matchMethod is Empty");
}
String hexP = regionDict.getConfigHex();
if (StringUtils.isBlank(hexP)) {
throw new RuntimeException("Found String region,but hex is Empty");
}
String mulityKeywordsP = regionDict.getConfigMultiKeywords();
if (StringUtils.isBlank(mulityKeywordsP)) {
throw new RuntimeException("Found String region,but mulityKeywords is Empty");
}
StringBuffer errTip = new StringBuffer();
Pattern pattern = Pattern.compile("\t|\r|\n|\b|\f");
Pattern domainPattern = Pattern.compile(Constants.DOMAIN_REGEXP);
for (int i = 0; i < list.size(); i++) {
StringBuffer errInfo = new StringBuffer();
AppTopicDomainCfg baseStringCfg = new AppTopicDomainCfg();
BeanUtils.copyProperties(list.get(i), baseStringCfg);
// 配置描述、关键字长度限制
if(baseStringCfg.getCfgDesc().length() > 128) {
errInfo.append(prop.getProperty("config_describe")+prop.getProperty("length_error")+" "+String.format(prop.getProperty("max_length")+":128") + ";");
}
if (regionDict.getRegionType().equals(2)) {
// 主题、网站校验
Long topicId = baseStringCfg.getTopicId();
Long websiteServiceId = baseStringCfg.getWebsiteServiceId();
if (topicId == null) {
errInfo.append(prop.getProperty("topic") +" "+ prop.getProperty("not_exist") + ";");
}
if (websiteServiceId == null) {
errInfo.append(prop.getProperty("website_server") +" "+ prop.getProperty("not_exist") + ";");
}
String keyword = baseStringCfg.getCfgKeywords();
if (StringUtils.isBlank(keyword)) {
errInfo.append(
String.format(prop.getProperty("can_not_null"), prop.getProperty("domain_name") + " ") + ";");
}else if(keyword.length() < 4 || keyword.length() > 1024){
errInfo.append(prop.getProperty("domain_name")+prop.getProperty("length_error")+" "+String.format(prop.getProperty("min_length")+":4,"+prop.getProperty("max_length")+":1024") + ";");
}else {
Matcher m = pattern.matcher(keyword);
if (m.find()) {
errInfo.append(String.format(prop.getProperty("has_invisible_char"),
prop.getProperty("domain_name") + " '" + keyword + "'") + ";");
}else {
m = domainPattern.matcher(keyword);
if(!m.matches()) {
errInfo.append(String.format(prop.getProperty("not_valid_domain"),
prop.getProperty("domain_name") + " '" + keyword + "'") + ";");
}/*else {
baseStringCfg.setDomain(keyword);
}*/
}
}
Integer exprType = baseStringCfg.getExprType();
boolean has = false;
if (exprType == null) {
if (exprTypeP.indexOf(",") == -1) {
if (mulityKeywordsP.equals("0") && exprTypeP.equals("1")) {
throw new RuntimeException("region dict config error,dict id is " + regionDict.getDictId());
}
baseStringCfg.setExprType(Integer.parseInt(exprTypeP));
} else if (exprTypeP.indexOf("0") > -1 && mulityKeywordsP.equals("0")) {
baseStringCfg.setExprType(0);
} else if (exprTypeP.indexOf("1") > -1 && mulityKeywordsP.equals("1")
&& keyword.indexOf("\n") > -1) {
baseStringCfg.setExprType(1);
} else if (exprTypeP.indexOf("0") > -1 && mulityKeywordsP.equals("1")
&& keyword.indexOf("\n") == -1) {
baseStringCfg.setExprType(0);
} else {
baseStringCfg.setExprType(Integer.parseInt(exprTypeP.split(",")[0]));
}
// errInfo.append(String.format(prop.getProperty("can_not_null"),
// prop.getProperty("expression_type"))+";");
} else {
for (String exp : exprTypeP.split(",")) {
if (exp.equals(exprType.toString())) {
has = true;
break;
}
}
if (!has) {
errInfo.append(
String.format(prop.getProperty("is_incorrect"), prop.getProperty("expression_type"))
+ ";");
}
has = false;
}
exprType = baseStringCfg.getExprType();
Integer matchMethod = baseStringCfg.getMatchMethod();
if (matchMethod == null) {
if (matchMethodP.indexOf(",") == -1) {
if (exprTypeP.equals("1") && !matchMethodP.equals("0")) {
throw new RuntimeException("region dict config error,dict id is " + regionDict.getDictId());
}
baseStringCfg.setMatchMethod(Integer.parseInt(matchMethodP));
} else if (exprType != null && exprType.intValue() == 1) {
if (matchMethodP.indexOf("0") > -1) {
baseStringCfg.setMatchMethod(0);
} else {
throw new RuntimeException("region dict config error,dict id is " + regionDict.getDictId());
}
} else {
baseStringCfg.setMatchMethod(Integer.parseInt(matchMethodP.split(",")[0]));
}
// errInfo.append(String.format(prop.getProperty("can_not_null"),
// prop.getProperty("match_method"))+";");
} else {
for (String exp : matchMethodP.split(",")) {
if (exp.equals(matchMethod.toString())) {
has = true;
break;
}
}
if (!has) {
errInfo.append(String.format(prop.getProperty("is_incorrect"), prop.getProperty("match_method"))
+ ";");
}
}
Integer isHex = baseStringCfg.getIsHex();
Integer isCaseInsenstive = baseStringCfg.getIsCaseInsenstive();
if (isHex == null || isCaseInsenstive == null) {
if (isHex == null) {
if (hexP.indexOf("0")>-1 || hexP.indexOf("2")>-1) {
baseStringCfg.setIsHex(0);
} else if (hexP.indexOf("1")>-1) {
baseStringCfg.setIsHex(1);
} else {
errInfo.append(
String.format(prop.getProperty("can_not_null"), prop.getProperty("is_hex")) + ";");
}
}
if (isCaseInsenstive == null) {
if (hexP.indexOf("0")>-1 || hexP.indexOf("1")>-1) {
baseStringCfg.setIsCaseInsenstive(0);
} else if (hexP.indexOf("2")>-1) {
baseStringCfg.setIsCaseInsenstive(1);
} else {
errInfo.append(String.format(prop.getProperty("can_not_null"),
prop.getProperty("is_case_insenstive")) + ";");
}
}
} else {
if (isHex.intValue() != 0 && isHex.intValue() != 1) {
errInfo.append(
String.format(prop.getProperty("is_incorrect"), prop.getProperty("is_hex")) + ";");
}
if (isCaseInsenstive.intValue() != 0 && isCaseInsenstive.intValue() != 1) {
errInfo.append(
String.format(prop.getProperty("is_incorrect"), prop.getProperty("is_case_insenstive"))
+ ";");
}
if (hexP.indexOf("1") == -1 && isHex.intValue() == 1) {
errInfo.append(
String.format(prop.getProperty("is_incorrect"), prop.getProperty("is_hex")) + ";");
}
if (hexP.equals("1") && isHex.intValue() == 0) {
errInfo.append(
String.format(prop.getProperty("is_incorrect"), prop.getProperty("is_hex")) + ";");
}
if (hexP.indexOf("2") == -1 && isCaseInsenstive.intValue() == 1) {
errInfo.append(
String.format(prop.getProperty("is_incorrect"), prop.getProperty("is_case_insenstive"))
+ ";");
}
if (hexP.equals("2") && isCaseInsenstive.intValue() == 0) {
errInfo.append(
String.format(prop.getProperty("is_incorrect"), prop.getProperty("is_case_insenstive"))
+ ";");
}
// 十六进制 关键字校验
if (hexP.indexOf("1") != -1 && isHex.intValue() == 1) {
boolean bl = Pattern.compile("^([0-9|a-f|A-F]*)$").matcher(keyword).matches();
if(!bl) {
errInfo.append(
prop.getProperty("key_word") + " '" + keyword + "' "+String.format(prop.getProperty("contains_non_hex_char")) + ";");
}
}
}
isHex = baseStringCfg.getIsHex();
isCaseInsenstive = baseStringCfg.getIsCaseInsenstive();
if (isHex != null && isCaseInsenstive != null) {
if (isHex.intValue() == 0 && isCaseInsenstive.intValue() == 0) {
baseStringCfg.setIsHexbin(0);
} else if (isHex.intValue() == 1 && isCaseInsenstive.intValue() == 0) {
baseStringCfg.setIsHexbin(1);
} else if (isHex.intValue() == 0 && isCaseInsenstive.intValue() == 1) {
baseStringCfg.setIsHexbin(2);
} else if (hexP.indexOf("1") != -1 && isHex.intValue() == 1 && isCaseInsenstive.intValue() == 1) {// 只有是十六进制且取值正确的时候, 才进行(十六进制)与(大小写敏感)的校验
errInfo.append(prop.getProperty("hex_case_insensitive")+ ";");
}
}
}
if (errInfo.toString().length() > 0) {
errTip.append(String.format(prop.getProperty("line"), baseStringCfg.getIndex()) + ",");
errTip.append(errInfo);
errTip.append("<br>");
}else {
// 保存到域名关联表中
AppCfgService appCfgService = SpringContextHolder.getBean(AppCfgService.class);
WebsiteDomainTopic websiteDomainTopic = new WebsiteDomainTopic();
websiteDomainTopic.setDomain(baseStringCfg.getCfgKeywords());
List<WebsiteDomainTopic> dictList = appCfgService.getDomainDict(websiteDomainTopic);
if(dictList.size() == 0) {
websiteDomainTopic.setWebsiteServiceId(baseStringCfg.getWebsiteServiceId());
websiteDomainTopic.setTopicId(baseStringCfg.getTopicId());
websiteDomainTopic.setCreateTime(new Date());
websiteDomainTopic.setCreatorId(Integer.valueOf(UserUtils.getUser().getId().toString()));
websiteDomainTopic.setIsValid(Constants.VALID_YES);
appCfgService.saveDomainDict(websiteDomainTopic);
}
stringList.add(baseStringCfg);
}
}
if (errTip.toString().length() > 0) {
msg.append(errTip);
//throw new ServiceException(errTip.toString());
}
long end=System.currentTimeMillis();
logger.warn("validate topicDomainCfg data finish,cost:"+(end-start));
return stringList;
}
}

View File

@@ -105,6 +105,7 @@ import com.nis.domain.configuration.template.IpRateLimitTemplate;
import com.nis.domain.configuration.template.P2pHashStringTemplate; import com.nis.domain.configuration.template.P2pHashStringTemplate;
import com.nis.domain.configuration.template.P2pIpTemplate; import com.nis.domain.configuration.template.P2pIpTemplate;
import com.nis.domain.configuration.template.StringAllTemplate; import com.nis.domain.configuration.template.StringAllTemplate;
import com.nis.domain.configuration.template.TopicWebsiteTemplate;
import com.nis.domain.log.BaseLogEntity; import com.nis.domain.log.BaseLogEntity;
import com.nis.domain.log.SearchReport; import com.nis.domain.log.SearchReport;
import com.nis.domain.maat.MaatCfg; import com.nis.domain.maat.MaatCfg;
@@ -135,6 +136,7 @@ import com.nis.util.excel.thread.CheckComplexStringFormatThread;
import com.nis.util.excel.thread.CheckDnsResStrategyFormatThread; import com.nis.util.excel.thread.CheckDnsResStrategyFormatThread;
import com.nis.util.excel.thread.CheckIpFormatThread; import com.nis.util.excel.thread.CheckIpFormatThread;
import com.nis.util.excel.thread.CheckStringFormatThread; import com.nis.util.excel.thread.CheckStringFormatThread;
import com.nis.util.excel.thread.CheckTopicWebsiteFormatThread;
import com.nis.web.security.UserUtils; import com.nis.web.security.UserUtils;
import com.nis.web.service.ArchiveServcie; import com.nis.web.service.ArchiveServcie;
import com.nis.web.service.AreaService; import com.nis.web.service.AreaService;
@@ -1143,6 +1145,48 @@ public class BaseController {
return queue; return queue;
} }
/**
* 多线程验证
* @param serviceDict
* @param regionDict
* @param list
* @return
* @throws InterruptedException
* @throws ExecutionException
* @throws ServiceException
*/
public BlockingQueue<AppTopicDomainCfg> checkTopicWebsiteCfgMulity(StringBuffer _msg,FunctionServiceDict serviceDict, FunctionRegionDict regionDict, BlockingQueue<? extends Object> list) throws InterruptedException, ExecutionException, ServiceException{
logger.warn("start checkTopicWebsiteCfgMulity ,size "+list.size());
long start=System.currentTimeMillis();
BlockingQueue<AppTopicDomainCfg> queue=new ArrayBlockingQueue<>(list.size());
ExecutorService service=Executors.newFixedThreadPool(Constants.MULITY_THREAD_SIZE);
List<Future<String>> futures=new ArrayList<>();
for(int i=0;i<Constants.MULITY_THREAD_SIZE;i++) {
CheckTopicWebsiteFormatThread t=new CheckTopicWebsiteFormatThread(serviceDict,regionDict, this.getMsgProp(), list, queue);
futures.add(service.submit(t));
}
service.shutdown();
while(!service.isTerminated()) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(Future<String> future:futures) {
String msg = future.get();
if(StringUtils.isNotBlank(msg)) {
//throw new ServiceException(msg);
_msg.append(msg);
}
}
long end=System.currentTimeMillis();
logger.warn("checkTopicWebsiteCfgMulity finish,cost:"+(end-start)+",size:"+queue.size());
return queue;
}
/** /**
* *
* setReportSearchTime(报表查询设置开始时间与结束时间) (这里描述这个方法适用条件 可选) * setReportSearchTime(报表查询设置开始时间与结束时间) (这里描述这个方法适用条件 可选)
@@ -1280,6 +1324,7 @@ public class BaseController {
BlockingQueue<ComplexkeywordCfg> complexkeywordCfgs =null; BlockingQueue<ComplexkeywordCfg> complexkeywordCfgs =null;
BlockingQueue<DnsResStrategy> dnsResStrategies=null; BlockingQueue<DnsResStrategy> dnsResStrategies=null;
BlockingQueue<AppComplexFeatureCfg> appComplexFeatureCfgs=null; BlockingQueue<AppComplexFeatureCfg> appComplexFeatureCfgs=null;
BlockingQueue<AppTopicDomainCfg> appTopicDomainCfgs=null;// 主题网站
List<CfgIndexInfo> cfgIndexInfos = new ArrayList<CfgIndexInfo>(); List<CfgIndexInfo> cfgIndexInfos = new ArrayList<CfgIndexInfo>();
List<AppPolicyCfg> appPolicyCfgs = new ArrayList<AppPolicyCfg>(); List<AppPolicyCfg> appPolicyCfgs = new ArrayList<AppPolicyCfg>();
List<AppFeatureIndex> appFeatureIndexs= new ArrayList<AppFeatureIndex>(); List<AppFeatureIndex> appFeatureIndexs= new ArrayList<AppFeatureIndex>();
@@ -1402,6 +1447,9 @@ public class BaseController {
}else if(regionDict.getFunctionId().equals(209)){// HTTP(s)替换 }else if(regionDict.getFunctionId().equals(209)){// HTTP(s)替换
BlockingQueue<HttpsReplaceTemplate> list = ei.getDataList(HttpsReplaceTemplate.class); BlockingQueue<HttpsReplaceTemplate> list = ei.getDataList(HttpsReplaceTemplate.class);
stringCfgs=this.checkStringCfgMulity(errTip,serviceDict, regionDict, list); stringCfgs=this.checkStringCfgMulity(errTip,serviceDict, regionDict, list);
}else if(regionDict.getFunctionId().equals(560)){// 主题网站
BlockingQueue<TopicWebsiteTemplate> list = ei.getDataList(TopicWebsiteTemplate.class);
appTopicDomainCfgs=this.checkTopicWebsiteCfgMulity(errTip,serviceDict, regionDict, list);
}else { }else {
BlockingQueue<StringAllTemplate> list = ei.getDataList(StringAllTemplate.class ); BlockingQueue<StringAllTemplate> list = ei.getDataList(StringAllTemplate.class );
stringCfgs=this.checkStringCfgMulity(errTip,serviceDict, regionDict, list); stringCfgs=this.checkStringCfgMulity(errTip,serviceDict, regionDict, list);
@@ -1720,6 +1768,7 @@ public class BaseController {
// } // }
// } // }
// } // }
if(!regionDict.getFunctionId().equals(560)) {
List<BaseStringCfg> _stringCfgs=Lists.newArrayList(Constants.MAAT_JSON_SEND_SIZE); List<BaseStringCfg> _stringCfgs=Lists.newArrayList(Constants.MAAT_JSON_SEND_SIZE);
while(!stringCfgs.isEmpty()) { while(!stringCfgs.isEmpty()) {
stringCfgs.drainTo(_stringCfgs, Constants.MAAT_JSON_SEND_SIZE); stringCfgs.drainTo(_stringCfgs, Constants.MAAT_JSON_SEND_SIZE);
@@ -1802,10 +1851,6 @@ public class BaseController {
} else { } else {
if(!regionDict.getFunctionId().equals(403)) { if(!regionDict.getFunctionId().equals(403)) {
CfgIndexInfo cfgIndexInfo = new CfgIndexInfo(); CfgIndexInfo cfgIndexInfo = new CfgIndexInfo();
// 因域名阻断 -限速 -丢包率
if(serviceDict.getFunctionId().equals(201) && serviceDict.getAction().equals(64)){
cfg.setUserRegion1("0");
}
BeanUtils.copyProperties(cfg, cfgIndexInfo, new String[] {"cfgId"}); BeanUtils.copyProperties(cfg, cfgIndexInfo, new String[] {"cfgId"});
cfgIndexInfos.add(cfgIndexInfo); cfgIndexInfos.add(cfgIndexInfo);
} }
@@ -1818,6 +1863,65 @@ public class BaseController {
appPolicyCfgs.clear(); appPolicyCfgs.clear();
_stringCfgs.clear(); _stringCfgs.clear();
} }
}else {
// 主题网站
List<AppTopicDomainCfg> _topicDomainCfgs=Lists.newArrayList(Constants.MAAT_JSON_SEND_SIZE);
while(!appTopicDomainCfgs.isEmpty()) {
appTopicDomainCfgs.drainTo(_topicDomainCfgs, Constants.MAAT_JSON_SEND_SIZE);
List<Integer> compileIds=Lists.newArrayList();
List<Integer> groupIds=Lists.newArrayList();
List<Integer> regionIds=Lists.newArrayList();
try {
compileIds = ConfigServiceUtil.getId(1,_topicDomainCfgs.size());
if(isSend.equals("1")) {
groupIds = ConfigServiceUtil.getId(2,_topicDomainCfgs.size());
regionIds = ConfigServiceUtil.getId(3,_topicDomainCfgs.size());
}
} catch (Exception e) {
e.printStackTrace();
logger.info("获取编译ID出错");
throw new MaatConvertException("<spring:message code=\"request_service_failed\"/>:"+e.getMessage());
}
int ind=0;
for (AppTopicDomainCfg cfg : _topicDomainCfgs) {
cfg.setAction(serviceDict.getAction());
cfg.setCfgRegionCode(regionDict.getConfigRegionCode());
cfg.setCfgType(regionDict.getConfigRegionValue());
cfg.setCreateTime(date);
cfg.setCreatorId(UserUtils.getUser().getId());
cfg.setDoLog(2);
cfg.setFunctionId(regionDict.getFunctionId());
/*if(isSend.equals("1")) {
cfg.setIsAudit(Constants.AUDIT_YES);
cfg.setIsValid(Constants.VALID_YES);
cfg.setAuditorId(UserUtils.getUser().getId());
cfg.setAuditTime(date);
if(groupIds!=null&&groupIds.size()==_topicDomainCfgs.size()) {
cfg.setGroupId(groupIds.get(ind));
}
if(regionIds!=null&&regionIds.size()==_topicDomainCfgs.size()) {
cfg.setRegionId(regionIds.get(ind));
}
}else {*/
cfg.setIsAudit(Constants.AUDIT_NOT_YET);
cfg.setIsValid(Constants.VALID_NO);
//}
cfg.setIsAreaEffective(0);
cfg.setLable("0");
cfg.setRequestId(StringUtil.isEmpty(requestId) ? 0 : requestId);
cfg.setAttribute(attribute);
cfg.setClassify(classify);
cfg.setServiceId(serviceDict.getServiceId());
if(compileIds!=null&&compileIds.size()==_topicDomainCfgs.size()) {
cfg.setCompileId(compileIds.get(ind));
}
ind++;
}
ipCfgService.saveAndSend(regionDict, serviceDict, specificServiceCfg, _topicDomainCfgs, cfgIndexInfos, appPolicyCfgs,appFeatureIndexs,asnNoMaps,isSend.equals("1"));
cfgIndexInfos.clear();
_topicDomainCfgs.clear();
}
}
} else if (regionDict.getRegionType().equals(3)) { } else if (regionDict.getRegionType().equals(3)) {
if(!regionDict.getFunctionId().equals(563)) { if(!regionDict.getFunctionId().equals(563)) {
List<ComplexkeywordCfg> _complexkeywordCfgs=Lists.newArrayList(Constants.MAAT_JSON_SEND_SIZE); List<ComplexkeywordCfg> _complexkeywordCfgs=Lists.newArrayList(Constants.MAAT_JSON_SEND_SIZE);
@@ -2178,6 +2282,8 @@ public class BaseController {
ei.loadInitParams(HttpsRedirectTemplate.class, this.getMsgProp(), regionDict, serviceDict); ei.loadInitParams(HttpsRedirectTemplate.class, this.getMsgProp(), regionDict, serviceDict);
}else if(regionDict.getFunctionId().equals(209)){// HTTP(s)替换 }else if(regionDict.getFunctionId().equals(209)){// HTTP(s)替换
ei.loadInitParams(HttpsReplaceTemplate.class, this.getMsgProp(), regionDict, serviceDict); ei.loadInitParams(HttpsReplaceTemplate.class, this.getMsgProp(), regionDict, serviceDict);
}else if(regionDict.getFunctionId().equals(560)){// 主题网站
ei.loadInitParams(TopicWebsiteTemplate.class, this.getMsgProp(), regionDict, serviceDict);
}else { }else {
ei.loadInitParams(StringAllTemplate.class, msgProp, regionDict, serviceDict); ei.loadInitParams(StringAllTemplate.class, msgProp, regionDict, serviceDict);
} }

View File

@@ -58,6 +58,7 @@ import com.nis.domain.configuration.template.P2pHashStringTemplate;
import com.nis.domain.configuration.template.P2pIpTemplate; import com.nis.domain.configuration.template.P2pIpTemplate;
import com.nis.domain.configuration.template.SnatTemplate; import com.nis.domain.configuration.template.SnatTemplate;
import com.nis.domain.configuration.template.StringAllTemplate; import com.nis.domain.configuration.template.StringAllTemplate;
import com.nis.domain.configuration.template.TopicWebsiteTemplate;
import com.nis.exceptions.MaatConvertException; import com.nis.exceptions.MaatConvertException;
import com.nis.util.Constants; import com.nis.util.Constants;
import com.nis.util.DictUtils; import com.nis.util.DictUtils;
@@ -440,6 +441,11 @@ public class IpController extends BaseController{
ExportExcel excel=new ExportExcel(serviceDict,regionDict,this.getMsgProp(),null, HttpsReplaceTemplate.class, 2); ExportExcel excel=new ExportExcel(serviceDict,regionDict,this.getMsgProp(),null, HttpsReplaceTemplate.class, 2);
excel.setDataList(this.getMsgProp(),classList,null). excel.setDataList(this.getMsgProp(),classList,null).
write(request,response, fileName).dispose(); write(request,response, fileName).dispose();
}else if(regionDict.getFunctionId().equals(560)) {// 主题网站
List<TopicWebsiteTemplate> classList=new ArrayList<TopicWebsiteTemplate>();
ExportExcel excel=new ExportExcel(serviceDict,regionDict,this.getMsgProp(),null, TopicWebsiteTemplate.class, 2);
excel.setDataList(this.getMsgProp(),classList,null).
write(request,response, fileName).dispose();
}else{ }else{
List<StringAllTemplate> classList=new ArrayList<StringAllTemplate>(); List<StringAllTemplate> classList=new ArrayList<StringAllTemplate>();
ExportExcel excel=new ExportExcel(serviceDict,regionDict,pro,null, StringAllTemplate.class, 2); ExportExcel excel=new ExportExcel(serviceDict,regionDict,pro,null, StringAllTemplate.class, 2);

View File

@@ -70,6 +70,7 @@ public interface AppCfgDao {
public List<AppTopicDomainCfg> findAppTopicDomainList(AppTopicDomainCfg entity) ; public List<AppTopicDomainCfg> findAppTopicDomainList(AppTopicDomainCfg entity) ;
public AppTopicDomainCfg getAppTopicDomainCfg(Long cfgId) ; public AppTopicDomainCfg getAppTopicDomainCfg(Long cfgId) ;
public int insertAppTopicDomainCfg(AppTopicDomainCfg entity); public int insertAppTopicDomainCfg(AppTopicDomainCfg entity);
public int insertAppTopicDomainCfgBatch(AppTopicDomainCfg entity);
public int updateAppTopicDomainCfg(AppTopicDomainCfg entity); public int updateAppTopicDomainCfg(AppTopicDomainCfg entity);
//app 字节特征增删改查 //app 字节特征增删改查
public List<AppByteCfg> findAppByteList(AppByteCfg entity) ; public List<AppByteCfg> findAppByteList(AppByteCfg entity) ;

View File

@@ -1855,6 +1855,20 @@
#{isHexbin,jdbcType=INTEGER},#{doLog,jdbcType=INTEGER} #{isHexbin,jdbcType=INTEGER},#{doLog,jdbcType=INTEGER}
) )
</insert> </insert>
<insert id="insertAppTopicDomainCfgBatch" parameterType="com.nis.domain.configuration.AppTopicDomainCfg" >
insert into app_topic_domain_cfg (
TOPIC_ID,WEBSITE_SERVICE_ID,SPEC_SERVICE_ID,CFG_DESC,ACTION,IS_VALID,IS_AUDIT,
CREATOR_ID,CREATE_TIME,EDITOR_ID,EDIT_TIME,AUDITOR_ID,AUDIT_TIME,
SERVICE_ID,REQUEST_ID,COMPILE_ID,IS_AREA_EFFECTIVE,CLASSIFY,
ATTRIBUTE,LABLE,AREA_EFFECTIVE_IDS,RATELIMIT,FUNCTION_ID,CFG_TYPE,CFG_REGION_CODE,
DOMAIN,EXPR_TYPE,MATCH_METHOD,IS_HEXBIN,DO_LOG
)values (
<include refid="AppTopicCommonCfg_Value_List" />,
#{cfgKeywords,jdbcType=VARCHAR},#{exprType,jdbcType=INTEGER},#{matchMethod,jdbcType=INTEGER},
#{isHexbin,jdbcType=INTEGER},#{doLog,jdbcType=INTEGER}
)
</insert>
<insert id="insertAppByteCfg" parameterType="com.nis.domain.configuration.AppByteCfg" > <insert id="insertAppByteCfg" parameterType="com.nis.domain.configuration.AppByteCfg" >
<selectKey resultType="java.lang.Long" order="AFTER" keyProperty="cfgId"> <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="cfgId">
SELECT LAST_INSERT_ID() SELECT LAST_INSERT_ID()

View File

@@ -54,6 +54,7 @@ import com.nis.domain.configuration.AppFeatureIndex;
import com.nis.domain.configuration.AppHttpCfg; import com.nis.domain.configuration.AppHttpCfg;
import com.nis.domain.configuration.AppIpCfg; import com.nis.domain.configuration.AppIpCfg;
import com.nis.domain.configuration.AppPolicyCfg; import com.nis.domain.configuration.AppPolicyCfg;
import com.nis.domain.configuration.AppTopicDomainCfg;
import com.nis.domain.configuration.AreaBean; import com.nis.domain.configuration.AreaBean;
import com.nis.domain.configuration.AreaIpCfg; import com.nis.domain.configuration.AreaIpCfg;
import com.nis.domain.configuration.BaseCfg; import com.nis.domain.configuration.BaseCfg;
@@ -1621,6 +1622,8 @@ public abstract class BaseService {
type="AsnIpCfg"; type="AsnIpCfg";
}else if(list.get(0) instanceof AppComplexFeatureCfg) { }else if(list.get(0) instanceof AppComplexFeatureCfg) {
type="AppComplexFeature"; type="AppComplexFeature";
}else if(list.get(0) instanceof AppTopicDomainCfg) {
type="AppTopicDomain";
} }
if (cfgIndexInfos != null && cfgIndexInfos.size() > 0) { if (cfgIndexInfos != null && cfgIndexInfos.size() > 0) {
this.saveCfgIndexOf(cfgIndexInfos); this.saveCfgIndexOf(cfgIndexInfos);
@@ -1645,6 +1648,9 @@ public abstract class BaseService {
}else if("AppComplexFeature".equals(type)) {// APP Payload }else if("AppComplexFeature".equals(type)) {// APP Payload
List<AppComplexFeatureCfg> listPage = (List<AppComplexFeatureCfg>) list; List<AppComplexFeatureCfg> listPage = (List<AppComplexFeatureCfg>) list;
this.saveAppComplexFeatureBatch(regionDict,serviceDict,listPage,send); this.saveAppComplexFeatureBatch(regionDict,serviceDict,listPage,send);
}else if("AppTopicDomain".equals(type)) {// 主题网站
List<AppTopicDomainCfg> listPage = (List<AppTopicDomainCfg>) list;
this.saveTopicDomainCfgBatch(listPage);
}else if("BaseStringCfg".equals(type)) { }else if("BaseStringCfg".equals(type)) {
List<BaseStringCfg<?>> listPage = (List<BaseStringCfg<?>>) list; List<BaseStringCfg<?>> listPage = (List<BaseStringCfg<?>>) list;
// 调用对应配置的service // 调用对应配置的service
@@ -1924,6 +1930,29 @@ public abstract class BaseService {
} }
/**
* 导入配置时数据批量入库
* @param data
*/
@Transactional(readOnly=false,rollbackFor=RuntimeException.class)
public void saveTopicDomainCfgBatch(List<AppTopicDomainCfg> data) {
SqlSessionFactory sqlSessionFactory=SpringContextHolder.getBean(SqlSessionFactory.class);
SqlSession batchSqlSession = null;
try{
batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
for(int index = 0; index < data.size();index++){
AppTopicDomainCfg cfg = data.get(index);
((AppCfgDao) batchSqlSession.getMapper(AppCfgDao.class)).insertAppTopicDomainCfgBatch(cfg);
}
batchSqlSession.commit();
}finally {
if(batchSqlSession != null){
batchSqlSession.close();
}
}
}
/** /**
* APP Payload导入配置时数据批量入库 * APP Payload导入配置时数据批量入库
* @param serviceDict * @param serviceDict

View File

@@ -1464,3 +1464,4 @@ protocol_statistics=Protocol Statistics
app_statistics=App Statistics app_statistics=App Statistics
service_statistics=Service Statistics service_statistics=Service Statistics
website_statistics=Website Statistics website_statistics=Website Statistics
not_exist=not exist

View File

@@ -1468,3 +1468,4 @@ protocol_statistics=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430
app_statistics=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u041F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 app_statistics=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u041F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439
service_statistics=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u0421\u0435\u0440\u0432\u0438\u0441\u043E\u0432 service_statistics=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u0421\u0435\u0440\u0432\u0438\u0441\u043E\u0432
website_statistics=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u0412\u0435\u0431-\u0441\u0430\u0439\u0442\u043E\u0432 website_statistics=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u0412\u0435\u0431-\u0441\u0430\u0439\u0442\u043E\u0432
not_exist=not exist

View File

@@ -1464,3 +1464,4 @@ protocol_statistics=\u534F\u8BAE\u7EDF\u8BA1
app_statistics=App\u7EDF\u8BA1 app_statistics=App\u7EDF\u8BA1
service_statistics=\u670D\u52A1\u7EDF\u8BA1 service_statistics=\u670D\u52A1\u7EDF\u8BA1
website_statistics=\u7F51\u7AD9\u7EDF\u8BA1 website_statistics=\u7F51\u7AD9\u7EDF\u8BA1
not_exist=\u4E0D\u5B58\u5728

View File

@@ -0,0 +1,2 @@
UPDATE function_region_dict SET is_import = 1 WHERE function_id = 560;
UPDATE function_service_dict SET is_import = 1 WHERE function_id = 560;

View File

@@ -95,10 +95,12 @@
<div for="action"></div> <div for="action"></div>
</div> </div>
<!-- 600 asn ip、 3IP白名单、 405APP协议IP、 403APP域名特征、 563 APP Payload、 565 APP HTTP、 564 APP DNS、 566 APP SSL --> <!-- 600 asn ip、 3IP白名单、 405APP协议IP、 403APP域名特征、 563 APP Payload、 565 APP HTTP、 564 APP DNS、 566 APP SSL -->
<c:if test="${(cfg.functionId eq 600) || (cfg.functionId eq 3) || (cfg.functionId eq 405) || (cfg.functionId eq 403) || (cfg.functionId eq 563) || (cfg.functionId eq 565) || (cfg.functionId eq 564) || (cfg.functionId eq 566) }"> <c:if test="${(cfg.functionId eq 600) || (cfg.functionId eq 3) || (cfg.functionId eq 405) || (cfg.functionId eq 403) || (cfg.functionId eq 563) || (cfg.functionId eq 565) || (cfg.functionId eq 564) || (cfg.functionId eq 566) ||
(cfg.functionId eq 560) }">
<div class="row hidden requestIdSel"> <div class="row hidden requestIdSel">
</c:if> </c:if>
<c:if test="${(cfg.functionId ne 600) && (cfg.functionId ne 3) && (cfg.functionId ne 405) && (cfg.functionId ne 403) && (cfg.functionId ne 563) && (cfg.functionId ne 565) && (cfg.functionId ne 564) && (cfg.functionId ne 566)}"> <c:if test="${(cfg.functionId ne 600) && (cfg.functionId ne 3) && (cfg.functionId ne 405) && (cfg.functionId ne 403) && (cfg.functionId ne 563) && (cfg.functionId ne 565) && (cfg.functionId ne 564) && (cfg.functionId ne 566) &&
(cfg.functionId ne 560) }">
<div class="row requestIdSel"> <div class="row requestIdSel">
</c:if> </c:if>
<label class="control-label col-md-3"><font color="red">*</font><spring:message code="letter"/></label> <label class="control-label col-md-3"><font color="red">*</font><spring:message code="letter"/></label>

View File

@@ -57,6 +57,24 @@
onClick="javascript:window.location='${ctx}/app/topicDomainCfgForm?functionId=${cfg.functionId}'"> onClick="javascript:window.location='${ctx}/app/topicDomainCfgForm?functionId=${cfg.functionId}'">
<i class="fa fa-plus"></i> <i class="fa fa-plus"></i>
<spring:message code="add"></spring:message></button> <spring:message code="add"></spring:message></button>
<c:set var="serviceImport" value="false"></c:set>
<c:set var="regionImport" value="false"></c:set>
<c:forEach items="${serviceList}" var="service" >
<c:if test="${(cfg.functionId eq service.functionId) && service.isImport eq 1}">
<c:set var="serviceImport" value="true"></c:set>
</c:if>
</c:forEach>
<c:forEach items="${regionList}" var="region" >
<c:if test="${(cfg.functionId eq region.functionId) && region.isImport eq 1}">
<c:set var="regionImport" value="true"></c:set>
</c:if>
</c:forEach>
<c:if test="${serviceImport eq 'true' && regionImport eq 'true'}">
<button type="button" class="btn btn-primary import" >
<i class="fa fa-plus"></i>
<spring:message code="import"></spring:message></button>
</c:if>
</shiro:hasPermission> </shiro:hasPermission>
</div> </div>
@@ -476,7 +494,9 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<c:set var="importPath" value="/app/topicDomainCfgList?functionId=${cfg.functionId}"/>
<!-- 模板导入start -->
<%@include file="/WEB-INF/include/excel/importModal.jsp" %>
</body> </body>
</html> </html>