(1)审核修正userregion,定时userregion修正

(2)form表单monit修正,list group为空报错修复
(3)删除组下的域配置相关逻辑修正
This commit is contained in:
wangxin
2019-06-14 18:47:31 +08:00
parent 0f06c49b48
commit 1d64a1bc0f
11 changed files with 392 additions and 135 deletions

View File

@@ -860,6 +860,8 @@ public class ConfigConvertUtil {
userRegionMap.put("decrypt_mirror", map); userRegionMap.put("decrypt_mirror", map);
} }
return gsonToJson(userRegionMap); return gsonToJson(userRegionMap);
}else if(serviceId.equals(592)){
return "{}";
} }
return null; return null;
} }

View File

@@ -201,12 +201,7 @@ public class SchedulerTaskUtil {
if(StringUtils.isNotBlank(cfg.getCommonGroupIds())){//公共分组 if(StringUtils.isNotBlank(cfg.getCommonGroupIds())){//公共分组
//处理自定义域 //处理自定义域
StringBuffer userRegion = new StringBuffer(); StringBuffer userRegion = new StringBuffer();
if(cfg.getServiceId().equals(512)){ userRegion.append(ConfigConvertUtil.generateCommonGroupDefaultUserRegion(null,cfg.getServiceId()));
cfg.setAction(2);
userRegion.append(ConfigConvertUtil.generateCommonGroupDefaultUserRegion(null,cfg.getServiceId()));
}else if(cfg.getServiceId().equals(576)){
userRegion.append(ConfigConvertUtil.generateCommonGroupDefaultUserRegion(null,cfg.getServiceId()));
}
//子配置 //子配置
Map<String,Object> maatTableMap=ConfigConvertUtil.convertCommonGroupMaatTable(cfg,cfgList); Map<String,Object> maatTableMap=ConfigConvertUtil.convertCommonGroupMaatTable(cfg,cfgList);
//IP公共分组 //IP公共分组

View File

@@ -19,14 +19,13 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.function.Predicate;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.nis.web.service.configuration.*;
import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
@@ -172,43 +171,6 @@ import com.nis.web.service.basics.IpReuseIpCfgService;
import com.nis.web.service.basics.PolicyGroupInfoService; import com.nis.web.service.basics.PolicyGroupInfoService;
import com.nis.web.service.basics.ServiceDictInfoService; import com.nis.web.service.basics.ServiceDictInfoService;
import com.nis.web.service.basics.SysDictInfoService; import com.nis.web.service.basics.SysDictInfoService;
import com.nis.web.service.configuration.AppBuiltInFeatureService;
import com.nis.web.service.configuration.AppCfgService;
import com.nis.web.service.configuration.AppMultiFeatureCfgService;
import com.nis.web.service.configuration.AsnPolicyCfgService;
import com.nis.web.service.configuration.AvCfgService;
import com.nis.web.service.configuration.AvContentCfgService;
import com.nis.web.service.configuration.BgpCfgService;
import com.nis.web.service.configuration.CachePolicyService;
import com.nis.web.service.configuration.CommonPolicyService;
import com.nis.web.service.configuration.ComplexStringCfgService;
import com.nis.web.service.configuration.ConfigSynchronizationService;
import com.nis.web.service.configuration.ControlPolicyService;
import com.nis.web.service.configuration.DdosCfgService;
import com.nis.web.service.configuration.DnsIpCfgService;
import com.nis.web.service.configuration.DnsResStrategyService;
import com.nis.web.service.configuration.DomainService;
import com.nis.web.service.configuration.FileTransferCfgService;
import com.nis.web.service.configuration.GroupAreaService;
import com.nis.web.service.configuration.HttpRedirectCfgService;
import com.nis.web.service.configuration.InterceptCfgService;
import com.nis.web.service.configuration.IpAddrPoolCfgService;
import com.nis.web.service.configuration.IpCfgService;
import com.nis.web.service.configuration.IpMultiplexPoolCfgService;
import com.nis.web.service.configuration.MailCfgService;
import com.nis.web.service.configuration.ManipulatPolicyService;
import com.nis.web.service.configuration.NumCfgService;
import com.nis.web.service.configuration.ProxyFileHijackService;
import com.nis.web.service.configuration.ProxyFileInsertScriptService;
import com.nis.web.service.configuration.ProxyFileResponsePageService;
import com.nis.web.service.configuration.ProxyFileStrategyService;
import com.nis.web.service.configuration.ProxyFileTrafficMirrorService;
import com.nis.web.service.configuration.PxyObjKeyringService;
import com.nis.web.service.configuration.PxyObjSpoofingIpPoolService;
import com.nis.web.service.configuration.RequestInfoService;
import com.nis.web.service.configuration.UserManageService;
import com.nis.web.service.configuration.WebsiteCfgService;
import com.nis.web.service.configuration.XmppCfgService;
import com.nis.web.service.configuration.statistics.ConfigureStatisticsService; import com.nis.web.service.configuration.statistics.ConfigureStatisticsService;
import com.nis.web.service.specific.ConfigGroupInfoService; import com.nis.web.service.specific.ConfigGroupInfoService;
import com.nis.web.service.specific.SpecificServiceCfgService; import com.nis.web.service.specific.SpecificServiceCfgService;
@@ -365,7 +327,8 @@ public class BaseController {
@Autowired @Autowired
protected CommonGroupManageService commonGroupManageService; protected CommonGroupManageService commonGroupManageService;
@Autowired
protected ObjectGroupService objectGroupService;
/** /**
* 管理基础路径 * 管理基础路径
*/ */
@@ -3971,6 +3934,8 @@ public class BaseController {
||baseCfg.getFunctionId().equals(566)//app ssl ||baseCfg.getFunctionId().equals(566)//app ssl
||baseCfg.getFunctionId().equals(567)) {//dk_gl ||baseCfg.getFunctionId().equals(567)) {//dk_gl
pageResult=appMultiFeatureCfgService.findAppFeatureIndexList(searchPage,searchAppFeatureIndex); pageResult=appMultiFeatureCfgService.findAppFeatureIndexList(searchPage,searchAppFeatureIndex);
}else if(baseCfg.getFunctionId().equals(888)){
pageResult=objectGroupService.getPolicyListList(searchPage,searchCfg);
} }
return pageResult.getList(); return pageResult.getList();
} }

View File

@@ -2,19 +2,21 @@ package com.nis.web.controller.configuration;
import com.beust.jcommander.internal.Lists;
import com.nis.domain.FunctionRegionDict;
import com.nis.domain.FunctionServiceDict; import com.nis.domain.FunctionServiceDict;
import com.nis.domain.Page; import com.nis.domain.Page;
import com.nis.domain.basics.PolicyGroupInfo; import com.nis.domain.basics.PolicyGroupInfo;
import com.nis.domain.configuration.BaseCfg; import com.nis.domain.configuration.BaseCfg;
import com.nis.domain.configuration.CachePolicyUserRegion; import com.nis.domain.configuration.BaseStringCfg;
import com.nis.domain.configuration.CfgIndexInfo; import com.nis.domain.configuration.CfgIndexInfo;
import com.nis.domain.configuration.ObjGroupCfg; import com.nis.domain.configuration.ObjGroupCfg;
import com.nis.domain.configuration.template.ObjGroupListTemplate;
import com.nis.exceptions.CallExternalProceduresException; import com.nis.exceptions.CallExternalProceduresException;
import com.nis.exceptions.MaatConvertException; import com.nis.exceptions.MaatConvertException;
import com.nis.util.Constants; import com.nis.exceptions.ServiceException;
import com.nis.util.DictUtils; import com.nis.util.*;
import com.nis.util.LogUtils; import com.nis.util.excel.ImportBigExcel;
import com.nis.util.StringUtil;
import com.nis.web.controller.BaseController; import com.nis.web.controller.BaseController;
import com.nis.web.security.UserUtils; import com.nis.web.security.UserUtils;
import com.nis.web.service.configuration.ObjectGroupService; import com.nis.web.service.configuration.ObjectGroupService;
@@ -26,21 +28,18 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.*; import java.util.*;
import java.util.concurrent.BlockingQueue;
@Controller @Controller
@RequestMapping("${adminPath}/objgroup") @RequestMapping("${adminPath}/objgroup")
public class ObjectGroupController extends BaseController { public class ObjectGroupController extends BaseController {
@Autowired
private ObjectGroupService objectGroupService;
@RequestMapping(value = { "/list" }) @RequestMapping(value = { "/list" })
public String list(Model model, @ModelAttribute("cfg") CfgIndexInfo cfg, HttpServletRequest request, public String list(Model model, @ModelAttribute("cfg") CfgIndexInfo cfg, HttpServletRequest request,
HttpServletResponse response){ HttpServletResponse response){
@@ -213,15 +212,15 @@ public class ObjectGroupController extends BaseController {
List<BaseCfg> baseCfgList=new ArrayList<>(); List<BaseCfg> baseCfgList=new ArrayList<>();
for (CfgIndexInfo cfg : list) { for (CfgIndexInfo cfg : list) {
if(cfg.getUserRegion()!=null){ if(cfg.getUserRegion()!=null){
for (Object val:cfg.getUserRegion().values()) { for (Object val:cfg.getUserRegion().values()) {
if(StringUtils.isNotBlank(val.toString())){ if(StringUtils.isNotBlank(val.toString())){
if(val.toString().startsWith(",")){ if(val.toString().startsWith(",")){
serviceGroupIds.append(val.toString().substring(1)); serviceGroupIds.append(val.toString().substring(1));
}else{ }else{
serviceGroupIds.append(val.toString()); serviceGroupIds.append(val.toString());
}
} }
} }
}
} }
BaseCfg baseCfg=new BaseCfg(); BaseCfg baseCfg=new BaseCfg();
BeanUtils.copyProperties(cfg, baseCfg); BeanUtils.copyProperties(cfg, baseCfg);
@@ -242,7 +241,7 @@ public class ObjectGroupController extends BaseController {
} }
public List getDataList(Page searchPage public List getDataList(Page searchPage
,CfgIndexInfo searchCfg ,CfgIndexInfo searchCfg
){ ){
BaseCfg baseCfg=new BaseCfg<>(); BaseCfg baseCfg=new BaseCfg<>();
if(!StringUtil.isEmpty(searchCfg)) { if(!StringUtil.isEmpty(searchCfg)) {
BeanUtils.copyProperties(searchCfg, baseCfg); BeanUtils.copyProperties(searchCfg, baseCfg);
@@ -438,4 +437,156 @@ public class ObjectGroupController extends BaseController {
LogUtils.saveLog(request, null, e, null); LogUtils.saveLog(request, null, e, null);
} }
} }
/**
* 批量审核
* @param page
* @param auditType
* @param entity
* @return
*/
public void auditAll(Page page,Integer auditType,CfgIndexInfo entity)throws Exception {
long start=System.currentTimeMillis();
page.setOrderBy("");
page.setPageSize(Constants.MAAT_JSON_SEND_SIZE);
page.setPageNo(1);
page.setLastPage(false);
//携带审核状态信息的BaseCfg
BaseCfg auditBatchCfg=new BaseCfg();
//携带审核条件的BaseCfg
CfgIndexInfo searchCfg=new CfgIndexInfo();
if(entity != null && (entity instanceof CfgIndexInfo)) {
BeanUtils.copyProperties(entity, auditBatchCfg);
BeanUtils.copyProperties(entity, searchCfg);
}
auditType = (Integer)Reflections.invokeGetter(entity, "isAudit");
//全部审核通过,只查询当前条件下的所有未审核的配置 -批量审核通过/不通过
if(auditType.equals(1) || auditType.equals(2)) {
if(auditType.equals(1)) {
auditBatchCfg.setIsAudit(1);
auditBatchCfg.setIsValid(1);
}else {
auditBatchCfg.setIsAudit(2);
auditBatchCfg.setIsValid(0);
}
auditBatchCfg.setAuditTime(new Date());
auditBatchCfg.setAuditorId(UserUtils.getUser().getId());
}else {
auditBatchCfg.setIsAudit(3);
auditBatchCfg.setIsValid(0);
auditBatchCfg.setAuditTime(new Date());
auditBatchCfg.setAuditorId(UserUtils.getUser().getId());
}
ServiceConfigTemplateUtil serviceTemplate = new ServiceConfigTemplateUtil();
Integer functionId=0;
if(auditBatchCfg != null && !StringUtil.isEmpty(auditBatchCfg.getFunctionId())) {
functionId=auditBatchCfg.getFunctionId();
}
List<Map<String,Object>> serviceList = serviceTemplate.getServiceListByFunctionId(functionId);
for(Map<String,Object> service:serviceList){
String tableNameXml = service.get("tableName").toString(); // 获取业务主配置表
String serviceTypeXml = service.get("serviceType").toString(); // 业务类型 1maat 2callback
String classNameXml = service.get("className").toString(); // 主配置Java类
String serviceIdXml = service.get("id").toString(); // service字典表 service_id字段
String serviceIds=service.get("serviceIds").toString();
auditBatchCfg.setServiceId(Integer.valueOf(serviceIdXml));
auditBatchCfg.setTableName(tableNameXml);
//searchCfg.setServiceId(Integer.valueOf(serviceIdXml));
searchCfg.setTableName(tableNameXml);
if("1".equals(serviceTypeXml)){//maat类配置
if(StringUtils.isNotBlank(serviceIds)) {//公共分组
// 存放域配置类型 及 对应表名
Map<Integer,List<Map<String,Object>>> childrenCfgMap=new HashMap<>();
Map<Integer,List<Map<String,Object>>> childrenUserRegionMap=new HashMap<>();
for(String _serviceId:serviceIds.split(",")){
if(StringUtils.isNotBlank(_serviceId)){
Map<String,Object> subService=serviceTemplate.getServiceListByServiceId(Integer.parseInt(_serviceId)).get(0);
childrenCfgMap.put(Integer.parseInt(_serviceId),(List<Map<String,Object>>)subService.get("cfgList"));
}
}
if(childrenCfgMap.size()>0){
for(Map.Entry e:childrenCfgMap.entrySet()){
boolean hasData = true;
while(hasData){
page.setPageNo(1);
page.setLastPage(false);
searchCfg.setServiceId(Integer.parseInt(e.getKey().toString()));
auditBatchCfg.setServiceId(Integer.parseInt(e.getKey().toString()));
List<CfgIndexInfo> list = getDataList(page,searchCfg,null,null,null); // 通过ServiceId获取cfg_index_info主配置表数据
if(!StringUtil.isEmpty(list)){
//配置生效处理 复用全量下发
if(auditBatchCfg.getIsAudit().equals(1)) {
hasData = configSynchronizationService.auditObjGroupListMaatData(childrenCfgMap,childrenUserRegionMap,page,auditBatchCfg,list,hasData,true);
}else {
List<BaseCfg> BaseCfgList=new ArrayList<>();
if(!StringUtil.isEmpty(list)) {
for (CfgIndexInfo cfg : list) {
BaseCfg baseCfg=new BaseCfg();
BeanUtils.copyProperties(cfg, baseCfg);
BaseCfgList.add(baseCfg);
}
}
if(auditBatchCfg.getIsAudit().equals(2)) {// 配置批量审核不通过
hasData = commonPolicyService.batchUnApproveObjGroupListatData(page, auditBatchCfg, BaseCfgList, hasData);
}else {// 配置失效处理 批量处理
hasData = commonPolicyService.auditObjGroupListMaatData(tableNameXml, page, auditBatchCfg, BaseCfgList, hasData);
}
}
}else{
hasData = false;
}
}
}
}
}
}
}
//批量审核通过时如果没有携带isValid检索条件返回界面需要将isValid置为null
if(!StringUtil.isEmpty(entity)) {
BaseCfg base=(BaseCfg)entity ;
base.setBatchAuditValue("");
base.setBatchValidValue("");
//配置目标状态1 1 生效,isAudit条件置为1有selType条件,且不是isValid不改没有sel改为isValid并且为1
if(base.getIsAudit()==1 && base.getIsValid()==1){
base.setIsAudit(1);
if(!StringUtil.isEmpty(base.getSeltype()) && !base.getSeltype().equals("isValid")) {
base.setIsValid(null);
}else{
base.setIsValid(1);
base.setSeltype("isValid");
}
}
//配置目标状态2 0 不通过,isAudit条件置为2有selType条件,且不是isValid不改没有sel改为isValid并且为0
if(base.getIsAudit()==2 && base.getIsValid()==0){
base.setIsAudit(2);
if(!StringUtil.isEmpty(base.getSeltype()) && !base.getSeltype().equals("isValid")) {
base.setIsValid(null);
}else{
base.setIsValid(0);
base.setSeltype("isValid");
}
}
//配置目标状态3 0 取消
if(base.getIsAudit()==3 && base.getIsValid()==0){
base.setIsAudit(3);
if(!StringUtil.isEmpty(base.getSeltype()) && !base.getSeltype().equals("isValid")) {
base.setIsValid(null);
}else{
base.setIsValid(0);
base.setSeltype("isValid");
}
}
BeanUtils.copyProperties(base, entity);
}
long end=System.currentTimeMillis();
logger.warn("配置批量生效/失效耗时:"+(end-start));
}
} }

View File

@@ -1110,16 +1110,29 @@
SELECT SELECT
<include refid="ConfigIndex_Column" /> <include refid="ConfigIndex_Column" />
FROM cfg_index_info a FROM cfg_index_info a
where a.common_group_ids like concat('%,',#{groupIds,jdbcType=VARCHAR},',%') <trim prefix="WHERE" prefixOverrides="AND">
<if test="functionId!=null" > <if test="groupIds!=null">
and function_id=#{functionId,jdbcType=INTEGER} AND (
</if> <foreach collection="groupIds.split(',')" index="index" item="item" >
<if test="isValid!=null" > <if test="index==0">
and is_valid=#{isValid,jdbcType=INTEGER} a.common_group_ids like concat('%,',#{item,jdbcType=INTEGER},',%')
</if> </if>
<if test="isValid==null" > <if test="index!=0">
and is_valid !=-1 OR a.common_group_ids like concat('%,',#{item,jdbcType=INTEGER},',%')
</if> </if>
</foreach>
)
</if>
<if test="functionId!=null" >
AND function_id=#{functionId,jdbcType=INTEGER}
</if>
<if test="isValid!=null" >
AND is_valid=#{isValid,jdbcType=INTEGER}
</if>
<if test="isValid==null" >
AND is_valid !=-1
</if>
</trim>
</select> </select>
<select id="getObjGroupList" resultMap="ObjMap" parameterType="com.nis.domain.configuration.ObjGroupCfg" > <select id="getObjGroupList" resultMap="ObjMap" parameterType="com.nis.domain.configuration.ObjGroupCfg" >
SELECT SELECT

View File

@@ -3332,30 +3332,24 @@ public abstract class BaseService {
//遍历,获取需要下发配置的组 //遍历,获取需要下发配置的组
StringBuffer realGroupIds=new StringBuffer(); StringBuffer realGroupIds=new StringBuffer();
for(PolicyGroupInfo policyGroupInfo:policyGroupInfos){ for(PolicyGroupInfo policyGroupInfo:policyGroupInfos){
//删除的时候
if(policyGroupInfo.getUdFlag().equals(2)){ //if(policyGroupInfo.getUdFlag().equals(2)){
realGroupIds.append(policyGroupInfo.getServiceGroupId()).append(","); realGroupIds.append(policyGroupInfo.getServiceGroupId()).append(",");
//}
//所有域都删除的时候
if(policyGroupInfo.getUdFlag().equals(0)){
if(policyGroupInfo.getGroupType().equals(Constants.IP_OBJ_GROUP_TYPE)){ if(policyGroupInfo.getGroupType().equals(Constants.IP_OBJ_GROUP_TYPE)){
if(policyGroupInfo.getIsValid().equals(0)){ ipDeletedGroups.add(policyGroupInfo.getServiceGroupId().toString());
ipDeletedGroups.add(policyGroupInfo.getServiceGroupId().toString());
}
} }
if(policyGroupInfo.getGroupType().equals(Constants.URL_OBJ_GROUP_TYPE)){ if(policyGroupInfo.getGroupType().equals(Constants.URL_OBJ_GROUP_TYPE)){
if(policyGroupInfo.getIsValid().equals(0)){ urlDeletedGroups.add(policyGroupInfo.getServiceGroupId().toString());
urlDeletedGroups.add(policyGroupInfo.getServiceGroupId().toString());
}
} }
if(policyGroupInfo.getGroupType().equals(Constants.SUBID_OBJ_GROUP_TYPE)){ if(policyGroupInfo.getGroupType().equals(Constants.SUBID_OBJ_GROUP_TYPE)){
if(policyGroupInfo.getIsValid().equals(0)){ subIdDeletedGroups.add(policyGroupInfo.getServiceGroupId().toString());
subIdDeletedGroups.add(policyGroupInfo.getServiceGroupId().toString());
}
} }
if(policyGroupInfo.getGroupType().equals(Constants.DOMAIN_OBJ_GROUP_TYPE)){ if(policyGroupInfo.getGroupType().equals(Constants.DOMAIN_OBJ_GROUP_TYPE)){
if(policyGroupInfo.getIsValid().equals(0)){ domainDeletedGroups.add(policyGroupInfo.getServiceGroupId().toString());
domainDeletedGroups.add(policyGroupInfo.getServiceGroupId().toString());
}
} }
} }
} }
if(realGroupIds.toString().endsWith(",")){ if(realGroupIds.toString().endsWith(",")){
@@ -3363,6 +3357,10 @@ public abstract class BaseService {
} }
List<CfgIndexInfo> toUpdateCfgIndexInfos=new ArrayList<>(); List<CfgIndexInfo> toUpdateCfgIndexInfos=new ArrayList<>();
List<CfgIndexInfo> toCancelCfgIndexInfos=new ArrayList<>(); List<CfgIndexInfo> toCancelCfgIndexInfos=new ArrayList<>();
//没有
if(StringUtils.isBlank(realGroupIds.toString())){
return true;
}
//查询cfg_index_info表获取所有用到了这个group_id的非删除配置 //查询cfg_index_info表获取所有用到了这个group_id的非删除配置
List<CfgIndexInfo> cfgIndexInfos=commonPolicyDao.getObjGroupListByGroupIds(realGroupIds.toString(),null,null); List<CfgIndexInfo> cfgIndexInfos=commonPolicyDao.getObjGroupListByGroupIds(realGroupIds.toString(),null,null);
@@ -3404,10 +3402,14 @@ public abstract class BaseService {
if(CollectionUtils.isEmpty(cfgIndexInfo.getIpCommGroupCfgList())&& if(CollectionUtils.isEmpty(cfgIndexInfo.getIpCommGroupCfgList())&&
CollectionUtils.isEmpty(cfgIndexInfo.getUrlCommGroupList())&&CollectionUtils.isEmpty(cfgIndexInfo.getScriberIdCommGroupList())&& CollectionUtils.isEmpty(cfgIndexInfo.getUrlCommGroupList())&&CollectionUtils.isEmpty(cfgIndexInfo.getScriberIdCommGroupList())&&
CollectionUtils.isEmpty(cfgIndexInfo.getDomainCommGroupList())){ CollectionUtils.isEmpty(cfgIndexInfo.getDomainCommGroupList())){
cfgIndexInfo.setIsValid(Constants.VALID_NO);
cfgIndexInfo.setIsAudit(Constants.AUDIT_NOT_YES);
cfgIndexInfo.setCommonGroupIds(""); cfgIndexInfo.setCommonGroupIds("");
toCancelCfgIndexInfos.add(cfgIndexInfo); if(cfgIndexInfo.getIsValid()==Constants.VALID_NO){//未生效
toUpdateCfgIndexInfos.add(cfgIndexInfo);
}else{//生效
cfgIndexInfo.setIsValid(Constants.VALID_NO);
cfgIndexInfo.setIsAudit(Constants.AUDIT_NOT_YES);
toCancelCfgIndexInfos.add(cfgIndexInfo);
}
}else if(!oldCommonGroupIds.equals(cfgIndexInfo.getCommonGroupIds())){ }else if(!oldCommonGroupIds.equals(cfgIndexInfo.getCommonGroupIds())){
toUpdateCfgIndexInfos.add(cfgIndexInfo); toUpdateCfgIndexInfos.add(cfgIndexInfo);
//commonPolicyDao.updateCfgIndexCommonGroupIds(cfgIndexInfo); //commonPolicyDao.updateCfgIndexCommonGroupIds(cfgIndexInfo);
@@ -3454,14 +3456,8 @@ public abstract class BaseService {
if(service.containsKey("userRegionList")){ if(service.containsKey("userRegionList")){
//Map<String,Object> userregionMap=new HashMap<>(); //Map<String,Object> userregionMap=new HashMap<>();
//userRegionList=(List<Map<String, Object>>) service.get("userRegionList"); //userRegionList=(List<Map<String, Object>>) service.get("userRegionList");
if(serviceId.equals(576)){ String _userregion=ConfigConvertUtil.generateCommonGroupDefaultUserRegion(interceptUserRegionMap,serviceId);
String _userregion=ConfigConvertUtil.generateCommonGroupDefaultUserRegion(interceptUserRegionMap,serviceId); userRegion.append(_userregion);
userRegion.append(_userregion);
}else if(serviceId.equals(512)){
cfgIndexInfo.setAction(2);
String _userregion=ConfigConvertUtil.generateCommonGroupDefaultUserRegion(interceptUserRegionMap,serviceId);
userRegion.append(_userregion);
}
} }
} }
compileIds.add(cfgIndexInfo.getCompileId()); compileIds.add(cfgIndexInfo.getCompileId());
@@ -3539,7 +3535,7 @@ public abstract class BaseService {
maatBean.setVersion(Constants.MAAT_VERSION); maatBean.setVersion(Constants.MAAT_VERSION);
maatBean.setOpAction(Constants.UPDATE_ACTION); maatBean.setOpAction(Constants.UPDATE_ACTION);
} }
}else if(cfgIndexInfo.getIsValid().equals(Constants.VALID_NO)){//生效的配置置为了失效 }else if(cfgIndexInfo.getIsValid().equals(Constants.VALID_NO)&&cfgIndexInfo.getIsAudit().equals(Constants.AUDIT_NOT_YES)){//生效的配置 置为了失效
maatCfg.setCompileId(cfgIndexInfo.getCompileId()); maatCfg.setCompileId(cfgIndexInfo.getCompileId());
maatCfg.setServiceId(cfgIndexInfo.getServiceId()); maatCfg.setServiceId(cfgIndexInfo.getServiceId());
maatCfg.setIsValid(0);//无效 maatCfg.setIsValid(0);//无效

View File

@@ -203,6 +203,87 @@ public class CommonPolicyService extends CrudService<WebsiteCfgDao, CfgIndexInfo
} }
return hasData; return hasData;
} }
/**
* ObjGroupList配置批量失效
* @param tableName
* @param page
* @param entity
* @param list
* @param hasData
* @return
* @throws NoSuchFieldException
* @throws SecurityException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public boolean auditObjGroupListMaatData(String tableName,Page page,
BaseCfg entity,
List<BaseCfg> list,
boolean hasData)throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
long start=System.currentTimeMillis();
long end=System.currentTimeMillis();
ToMaatBean maatBean;
MaatCfg maatCfg;
List<MaatCfg> configCompileList;
maatBean = new ToMaatBean();
configCompileList = new ArrayList();
List<Integer> compileIds = new ArrayList();
List<String> spoofingPoolCfgIds = new ArrayList();
for(BaseCfg cfg:list){
compileIds.add(cfg.getCompileId());
}
if(!StringUtil.isEmpty(compileIds) && !StringUtil.isEmpty(entity.getTableName())) {
List auditHttpCompileIds= new ArrayList();
List deleteHttpCompileIds= new ArrayList();
if(!StringUtil.isEmpty(auditHttpCompileIds)) {
commonPolicyDao.auditCfgBatch("cfg_index_info", entity,auditHttpCompileIds,null);
commonPolicyDao.auditCfgBatch("http_url_cfg", entity,auditHttpCompileIds,null);
}
if(!StringUtil.isEmpty(deleteHttpCompileIds)) {
commonPolicyDao.deleteHttpUrlCfg("cfg_index_info", entity,deleteHttpCompileIds);
commonPolicyDao.deleteHttpUrlCfg("http_url_cfg", entity,deleteHttpCompileIds);
}
commonPolicyDao.auditCfgBatch( entity.getTableName(), entity,compileIds,null);
//更新各配置定时任务信息
handelScheduleCfg(list, entity.getTableName(),entity);
}
commonPolicyDao.auditCfgBatch( tableName, entity,compileIds,null);
for(BaseCfg cfg:list){
maatCfg = new MaatCfg();
maatCfg.setCompileId(cfg.getCompileId());
maatCfg.setServiceId(cfg.getServiceId());
maatCfg.setIsValid(0);//无效
configCompileList.add(maatCfg);
}
page.setList(list);
if(page.isLastPage()){
hasData = false;
}
if(!StringUtil.isEmpty(configCompileList.size())){
maatBean.setConfigCompileList(configCompileList);
maatBean.setAuditTime(entity.getAuditTime());
maatBean.setCreatorName(entity.getCurrentUser().getName());
maatBean.setVersion(Constants.MAAT_VERSION);
maatBean.setOpAction(Constants.UPDATE_ACTION);
//调用服务接口取消配置
String json=gsonToJson(maatBean);
if(!StringUtil.isEmpty(list)) {
logger.warn("批量配置取消("+page.getPageNo()+"次)个数:"+list.size());
}
//调用服务接口下发配置
logger.warn("Maat配置批量失效-下发start()");
//logger.warn("Maat配置批量失效-下发start()"+json);
start=System.currentTimeMillis();
ToMaatResult result = ConfigServiceUtil.put(json,1);
end=System.currentTimeMillis();
logger.warn("配置取消配置响应信息:"+result.getMsg());
logger.warn("Maat配置批量失效-下发end("+(end-start)+")");
}
return hasData;
}
public List<IpPortCfg> getIpDropList(String tabName,List compileIds){ public List<IpPortCfg> getIpDropList(String tabName,List compileIds){
return synchronizationDao.getIpDropList(tabName, compileIds); return synchronizationDao.getIpDropList(tabName, compileIds);
} }
@@ -597,6 +678,40 @@ public class CommonPolicyService extends CrudService<WebsiteCfgDao, CfgIndexInfo
} }
return hasData; return hasData;
}
/**
* ObjGroupList配置批量审核不通过
* @param page
* @param entity // 保存要审核的状态类
* @param list // 主配置表数据(在调用前查出)
* @param hasData // 标识是否还有数据
* @return
*/
public boolean batchUnApproveObjGroupListatData(Page page, BaseCfg entity,
List<BaseCfg> list, boolean hasData) {
// 1.获取所有配置的编译ID
List<Integer> compileIds = new ArrayList();
List<String> spoofingPoolCfgIds = new ArrayList();
for(BaseCfg cfg:list){
compileIds.add(cfg.getCompileId());
}
// 2.更新配置审核状态(主表)
if(!StringUtil.isEmpty(compileIds) && !StringUtil.isEmpty(entity.getTableName())) {
commonPolicyDao.auditCfgBatch( entity.getTableName(), entity,compileIds,null); // 批量审核并修改配置审核状态(主表)
//更新各配置定时任务信息
handelScheduleCfg(list, entity.getTableName(),entity);
}
// 4.判断是否是当前检索条件下最后一页数据 并返回结果
page.setList(list);
if(page.isLastPage()){
hasData = false;
}
return hasData;
} }
public boolean batchDeleteMaatData(List<Map<String, Object>> cfgList, Page page, BaseCfg entity, public boolean batchDeleteMaatData(List<Map<String, Object>> cfgList, Page page, BaseCfg entity,
List<BaseCfg> list, boolean hasData) { List<BaseCfg> list, boolean hasData) {

View File

@@ -178,15 +178,21 @@ public class ConfigSynchronizationService extends BaseService{
} }
/** /**
* 处理ntc业务maat类配置 * 处理ntc业务maat类配置
* @param serviceId * @param cfgList
* @param userRegionList
* @param page
* @param entity
* @param request * @param request
* @param response * @param response
* @throws SecurityException * @param isUpdateCfg
* @throws NoSuchFieldException * @param tableName
* @throws IllegalAccessException * @throws NoSuchFieldException
* @throws IllegalArgumentException * @throws SecurityException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/ */
public void handleNtcMaatData(List<Map<String,Object>>cfgList,List<Map<String,Object>>userRegionList, public void handleNtcMaatData(List<Map<String,Object>>cfgList,List<Map<String,Object>>userRegionList,
Page<T> page,BaseCfg entity,HttpServletRequest request,HttpServletResponse response, Page<T> page,BaseCfg entity,HttpServletRequest request,HttpServletResponse response,
@@ -2280,8 +2286,6 @@ public class ConfigSynchronizationService extends BaseService{
} }
ind++; ind++;
} }
}else{ }else{
logger.info("全量同步未知业务"); logger.info("全量同步未知业务");
hasData = false; hasData = false;
@@ -2379,7 +2383,7 @@ public class ConfigSynchronizationService extends BaseService{
cfg.setDomainCommGroupList(commIds); cfg.setDomainCommGroupList(commIds);
} }
} }
compileIds.add(cfg.getCompileId());
} }
} }
@@ -2414,7 +2418,7 @@ public class ConfigSynchronizationService extends BaseService{
} }
//Intercept Policy、http(s) 监测 、http(s) 白名单 //Intercept Policy、http(s) 监测 、http(s) 白名单
if("HTTPS".equalsIgnoreCase(entity.getUserRegion1())||"INTERCEPT".equalsIgnoreCase(entity.getUserRegion1())&&userRegion.toString().length()==0) { if("HTTPS".equalsIgnoreCase(cfg.getUserRegion1())||"INTERCEPT".equalsIgnoreCase(cfg.getUserRegion1())&&userRegion.toString().length()==0) {
userRegion.append("{}"); userRegion.append("{}");
} }
//子配置 //子配置
@@ -2426,6 +2430,7 @@ public class ConfigSynchronizationService extends BaseService{
if(CollectionUtils.isNotEmpty(cfg.getIpCommGroupCfgList())){ if(CollectionUtils.isNotEmpty(cfg.getIpCommGroupCfgList())){
IpPortCfg _cfg = new IpPortCfg(); IpPortCfg _cfg = new IpPortCfg();
BeanUtils.copyProperties(cfg, _cfg, new String[]{"cfgId"}); BeanUtils.copyProperties(cfg, _cfg, new String[]{"cfgId"});
_cfg.setIsValid(entity.getIsValid());
Map<String,List> map = ConfigConvertUtil.objGroupCfgConvert(ipRegionList,cfg.getIpCommGroupCfgList(),1,_cfg,groupRelationList,maatTableMap,groupIdSet); Map<String,List> map = ConfigConvertUtil.objGroupCfgConvert(ipRegionList,cfg.getIpCommGroupCfgList(),1,_cfg,groupRelationList,maatTableMap,groupIdSet);
groupRelationList=map.get("groupList"); groupRelationList=map.get("groupList");
ipRegionList=map.get("dstList"); ipRegionList=map.get("dstList");
@@ -2438,6 +2443,7 @@ public class ConfigSynchronizationService extends BaseService{
if(CollectionUtils.isNotEmpty(cfg.getUrlCommGroupList())){ if(CollectionUtils.isNotEmpty(cfg.getUrlCommGroupList())){
CommonStringCfg _cfg = new CommonStringCfg(); CommonStringCfg _cfg = new CommonStringCfg();
BeanUtils.copyProperties(cfg, _cfg, new String[]{"cfgId"}); BeanUtils.copyProperties(cfg, _cfg, new String[]{"cfgId"});
_cfg.setIsValid(entity.getIsValid());
Map<String,List> map =ConfigConvertUtil.objGroupCfgConvert(strRegionList,cfg.getUrlCommGroupList(),2,_cfg,groupRelationList,maatTableMap,groupIdSet); Map<String,List> map =ConfigConvertUtil.objGroupCfgConvert(strRegionList,cfg.getUrlCommGroupList(),2,_cfg,groupRelationList,maatTableMap,groupIdSet);
groupRelationList=map.get("groupList"); groupRelationList=map.get("groupList");
strRegionList=map.get("dstList"); strRegionList=map.get("dstList");
@@ -2446,7 +2452,7 @@ public class ConfigSynchronizationService extends BaseService{
if(CollectionUtils.isNotEmpty(cfg.getScriberIdCommGroupList())){ if(CollectionUtils.isNotEmpty(cfg.getScriberIdCommGroupList())){
CommonStringCfg _cfg = new CommonStringCfg(); CommonStringCfg _cfg = new CommonStringCfg();
BeanUtils.copyProperties(cfg, _cfg, new String[]{"cfgId"}); BeanUtils.copyProperties(cfg, _cfg, new String[]{"cfgId"});
_cfg.setIsValid(entity.getIsValid());
Map<String,List> map =ConfigConvertUtil.objGroupCfgConvert(strRegionList,cfg.getScriberIdCommGroupList(),2,_cfg,groupRelationList,maatTableMap,groupIdSet); Map<String,List> map =ConfigConvertUtil.objGroupCfgConvert(strRegionList,cfg.getScriberIdCommGroupList(),2,_cfg,groupRelationList,maatTableMap,groupIdSet);
groupRelationList=map.get("groupList"); groupRelationList=map.get("groupList");
strRegionList=map.get("dstList"); strRegionList=map.get("dstList");
@@ -2456,7 +2462,7 @@ public class ConfigSynchronizationService extends BaseService{
if(CollectionUtils.isNotEmpty(cfg.getDomainCommGroupList())){ if(CollectionUtils.isNotEmpty(cfg.getDomainCommGroupList())){
CommonStringCfg _cfg = new CommonStringCfg(); CommonStringCfg _cfg = new CommonStringCfg();
BeanUtils.copyProperties(cfg, _cfg, new String[]{"cfgId",}); BeanUtils.copyProperties(cfg, _cfg, new String[]{"cfgId",});
_cfg.setIsValid(entity.getIsValid());
Map<String,List> map =ConfigConvertUtil.objGroupCfgConvert(strRegionList,cfg.getDomainCommGroupList(),2,_cfg,groupRelationList,maatTableMap,groupIdSet); Map<String,List> map =ConfigConvertUtil.objGroupCfgConvert(strRegionList,cfg.getDomainCommGroupList(),2,_cfg,groupRelationList,maatTableMap,groupIdSet);
groupRelationList=map.get("groupList"); groupRelationList=map.get("groupList");
strRegionList=map.get("dstList"); strRegionList=map.get("dstList");

View File

@@ -1,5 +1,6 @@
package com.nis.web.service.configuration; package com.nis.web.service.configuration;
import com.nis.domain.FunctionRegionDict;
import com.nis.domain.FunctionServiceDict; import com.nis.domain.FunctionServiceDict;
import com.nis.domain.Page; import com.nis.domain.Page;
import com.nis.domain.basics.*; import com.nis.domain.basics.*;
@@ -9,9 +10,7 @@ import com.nis.domain.maat.ToMaatBean;
import com.nis.domain.maat.ToMaatResult; import com.nis.domain.maat.ToMaatResult;
import com.nis.exceptions.MaatConvertException; import com.nis.exceptions.MaatConvertException;
import com.nis.util.*; import com.nis.util.*;
import com.nis.web.dao.basics.IpCommGroupCfgDao; import com.nis.web.dao.basics.*;
import com.nis.web.dao.basics.PolicyGroupInfoDao;
import com.nis.web.dao.basics.UrlCommGroupDao;
import com.nis.web.dao.configuration.AreaIpCfgDao; import com.nis.web.dao.configuration.AreaIpCfgDao;
import com.nis.web.dao.configuration.CommonPolicyDao; import com.nis.web.dao.configuration.CommonPolicyDao;
import com.nis.web.dao.configuration.ObjectGroupDao; import com.nis.web.dao.configuration.ObjectGroupDao;
@@ -43,6 +42,10 @@ public class ObjectGroupService extends BaseService {
private IpCommGroupCfgDao ipCommGroupCfgDao; private IpCommGroupCfgDao ipCommGroupCfgDao;
@Autowired @Autowired
private UrlCommGroupDao urlCommGroupCfgDao; private UrlCommGroupDao urlCommGroupCfgDao;
@Autowired
private ScriberIdCommGroupDao scriberIdCommGroupDao;
@Autowired
private DomainCommGroupDao domainCommGroupDao;
public Page getPolicyListList(Page searchPage, CfgIndexInfo searchCfg) { public Page getPolicyListList(Page searchPage, CfgIndexInfo searchCfg) {
// 生成数据权限过滤条件dsf为dataScopeFilter的简写在xml中使用 ${sqlMap.dsf}调用权限SQL // 生成数据权限过滤条件dsf为dataScopeFilter的简写在xml中使用 ${sqlMap.dsf}调用权限SQL
searchCfg.getSqlMap().put("dsf", configScopeFilter(searchCfg.getCurrentUser(),"a")); searchCfg.getSqlMap().put("dsf", configScopeFilter(searchCfg.getCurrentUser(),"a"));
@@ -474,7 +477,10 @@ public class ObjectGroupService extends BaseService {
} }
//删除之后恢复组的ud_flag //删除之后恢复组的ud_flag
int size = ipCommGroupCfgDao.getCfgInfoByGroupIds(serviceGroupIds.toString()); int size = ipCommGroupCfgDao.getCfgInfoByGroupIds(serviceGroupIds.toString());
if(size==0){ int size1 = urlCommGroupCfgDao.getCfgInfoByGroupIds(serviceGroupIds.toString());
int size2 = scriberIdCommGroupDao.getCfgInfoByGroupIds(serviceGroupIds.toString());
int size3 = domainCommGroupDao.getCfgInfoByGroupIds(serviceGroupIds.toString());
if((size+size1+size2+size3)==0){
policyGroupInfoDao.updateUdFlag(serviceGroupIds.toString(),0,null); policyGroupInfoDao.updateUdFlag(serviceGroupIds.toString(),0,null);
}else{ }else{
policyGroupInfoDao.updateUdFlag(serviceGroupIds.toString(),1,null); policyGroupInfoDao.updateUdFlag(serviceGroupIds.toString(),1,null);
@@ -653,4 +659,7 @@ public class ObjectGroupService extends BaseService {
page.setList(list); page.setList(list);
return page; return page;
} }
public void saveAndSend(FunctionRegionDict regionDict, FunctionServiceDict serviceDict, List<BaseStringCfg<?>> stringCfgs) {
}
} }

View File

@@ -240,6 +240,9 @@ var delContent = function(contentClassName, addBtnClassName) {
<c:when test="${service.action eq 16}"> <c:when test="${service.action eq 16}">
<spring:message code="block"/> <spring:message code="block"/>
</c:when> </c:when>
<c:when test="${service.action eq 1}">
<spring:message code="monitor"/>
</c:when>
<c:otherwise> <c:otherwise>
<spring:message code="${service.actionCode }"/> <spring:message code="${service.actionCode }"/>
</c:otherwise> </c:otherwise>
@@ -317,7 +320,7 @@ var delContent = function(contentClassName, addBtnClassName) {
<div class="row"> <div class="row">
<div class="col-md-6 ipGroup"> <div class="col-md-6 ipGroup">
<div class="form-group "> <div class="form-group ">
<label class="control-label col-md-3"><font color="red">*</font><spring:message code="ip_group"/></label> <label class="control-label col-md-3"><spring:message code="ip_group"/></label>
<div class="col-md-6"> <div class="col-md-6">
<select name="ipGroup" data-live-search="true" class="selectpicker form-control form-control" multiple data-live-search="true"> <select name="ipGroup" data-live-search="true" class="selectpicker form-control form-control" multiple data-live-search="true">
<c:forEach items="${ipGroups}" var="ipGroup"> <c:forEach items="${ipGroups}" var="ipGroup">
@@ -330,7 +333,7 @@ var delContent = function(contentClassName, addBtnClassName) {
</div> </div>
<div class="col-md-6 subscribeIdGroup"> <div class="col-md-6 subscribeIdGroup">
<div class="form-group "> <div class="form-group ">
<label class="control-label col-md-3"><font color="red">*</font><spring:message code="subscribe_id_group"/></label> <label class="control-label col-md-3"><spring:message code="subscribe_id_group"/></label>
<div class="col-md-6"> <div class="col-md-6">
<select name="subscribeIdGroup" data-live-search="true" class="selectpicker form-control form-control " multiple data-live-search="true"> <select name="subscribeIdGroup" data-live-search="true" class="selectpicker form-control form-control " multiple data-live-search="true">
<c:forEach items="${subscribeIdGroups}" var="subscribeIdGroup"> <c:forEach items="${subscribeIdGroups}" var="subscribeIdGroup">
@@ -346,7 +349,7 @@ var delContent = function(contentClassName, addBtnClassName) {
<div class="row"> <div class="row">
<div class="col-md-6 urlGroup"> <div class="col-md-6 urlGroup">
<div class="form-group "> <div class="form-group ">
<label class="control-label col-md-3"><font color="red">*</font><spring:message code="url_group"/></label> <label class="control-label col-md-3"><spring:message code="url_group"/></label>
<div class="col-md-6"> <div class="col-md-6">
<select name="urlGroup" data-live-search="true" class="selectpicker form-control form-control " multiple data-live-search="true" > <select name="urlGroup" data-live-search="true" class="selectpicker form-control form-control " multiple data-live-search="true" >
<c:forEach items="${urlGroups}" var="urlGroup"> <c:forEach items="${urlGroups}" var="urlGroup">
@@ -359,7 +362,7 @@ var delContent = function(contentClassName, addBtnClassName) {
</div> </div>
<div class="col-md-6 domainGroup"> <div class="col-md-6 domainGroup">
<div class="form-group "> <div class="form-group ">
<label class="control-label col-md-3"><font color="red">*</font><spring:message code="domain_group"/></label> <label class="control-label col-md-3"><spring:message code="domain_group"/></label>
<div class="col-md-6"> <div class="col-md-6">
<select name="domainGroup" data-live-search="true" class="selectpicker form-control " multiple data-live-search="true"> <select name="domainGroup" data-live-search="true" class="selectpicker form-control " multiple data-live-search="true">
<c:forEach items="${domainGroups}" var="domainGroup"> <c:forEach items="${domainGroups}" var="domainGroup">

View File

@@ -55,18 +55,20 @@
if($("td[commonGroupIds]")){ if($("td[commonGroupIds]")){
var groups=[]; var groups=[];
$("td[commonGroupIds]").each(function(){ $("td[commonGroupIds]").each(function(){
var json=JSON.parse($(this).attr("commonGroupIds")); if($(this).attr("commonGroupIds")!=""){
if(json.ipGroup){ var json=JSON.parse($(this).attr("commonGroupIds"));
groups.push(json.ipGroup.substring(1,json.ipGroup.length-1)); if(json.ipGroup){
} groups.push(json.ipGroup.substring(1,json.ipGroup.length-1));
if(json.urlGroup){ }
groups.push(json.urlGroup.substring(1,json.urlGroup.length-1)); if(json.urlGroup){
} groups.push(json.urlGroup.substring(1,json.urlGroup.length-1));
if(json.subscribeIdGroup){ }
groups.push(json.subscribeIdGroup.substring(1,json.subscribeIdGroup.length-1)); if(json.subscribeIdGroup){
} groups.push(json.subscribeIdGroup.substring(1,json.subscribeIdGroup.length-1));
if(json.domainGroup){ }
groups.push(json.domainGroup.substring(1,json.domainGroup.length-1)); if(json.domainGroup){
groups.push(json.domainGroup.substring(1,json.domainGroup.length-1));
}
} }
}); });
if(groups.length>0){ if(groups.length>0){
@@ -102,7 +104,7 @@
} }
} }
}); });
</script> </script>
</head> </head>