1. application.yml修改为application-dev.yml和application-prod.yml

2. 添加更多Exception拦截器
3. 编写状态模式处理task状态的更改
4. 添加StateChangeService,用以处理所有任务状态转换相关的内容
5. 添加StateEnum, ProtocolEnum,TaskTypeEnum用以处理任务和协议相关的所有状态和类型
This commit is contained in:
EnderByEndera
2024-01-11 19:49:07 +08:00
parent 930ba8b5ac
commit 0f712618f2
70 changed files with 1209 additions and 400 deletions

4
gradlew.bat vendored
View File

@@ -44,7 +44,7 @@ set JAVA_EXE=java.exe
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo ERROR: JAVA_HOME is not set and no 'java' commandInfo could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
@@ -66,7 +66,7 @@ echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
@rem Setup the commandInfo line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

View File

@@ -1,13 +1,20 @@
package com.realtime.protection;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableAsync
public class ProtectionApplication {
public static void main(String[] args) {
SpringApplication.run(ProtectionApplication.class, args);
SpringApplicationBuilder builder = new SpringApplicationBuilder(ProtectionApplication.class);
// 在实际环境中应该修改为prod
builder.application().setAdditionalProfiles("dev");
builder.run(args);
}
}

View File

@@ -4,8 +4,6 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;
@Data
public class Template {
@JsonProperty("template_id")
@@ -37,6 +35,12 @@ public class Template {
@NotNull(message = "protect_level_high should not be empty. ")
private ProtectLevel protectLevelHigh;
@JsonProperty("template_used_times")
private Integer usedTimes;
@JsonProperty("running_tasks")
private Integer runningTasks;
private Integer createUserId;
private String createUsername;

View File

@@ -26,7 +26,7 @@ public class DynamicRuleObject {
@JsonProperty("dynamic_rule_create_username")
private String dynamicRuleCreateUsername;
// @JsonProperty("dynamic_rule_audit_status")
// @JsonProperty("dynamic_rule_audit_status")
// private Integer dynamicRuleAuditStatus;
@JsonProperty("dynamic_rule_create_depart")
private String dynamicRuleCreateDepart;

View File

@@ -1,25 +1,32 @@
package com.realtime.protection.configuration.entity.task;
import com.realtime.protection.configuration.utils.enums.ProtocolEnum;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class Command {
private Integer id;
private FiveTupleWithMask fiveTupleWithMask;
private Long taskId;
private Integer type;
private String sourceIP;
private String sourcePort;
private String destinationIP;
private String destinationPort;
private Integer protocol;
private String operation;
private LocalDateTime validTime;
private LocalDateTime invalidTime;
private String maskSourceIP;
private String maskSourcePort;
private String maskDestinationIP;
private String maskDestinationPort;
private Integer direction;
public static Command generateCommand(TaskCommandInfo info, LocalDateTime validTime) {
Command command = new Command();
private LocalDateTime datetime;
FiveTupleWithMask fiveTupleWithMask = info.getFiveTupleWithMask();
if (fiveTupleWithMask.getProtocol() != null)
fiveTupleWithMask.setProtocolNum(ProtocolEnum.valueOf(fiveTupleWithMask.getProtocol()).getProtocolNumber());
command.setFiveTupleWithMask(fiveTupleWithMask);
command.setTaskId(info.getTaskId());
command.setOperation(info.getOperation());
command.setValidTime(validTime);
command.setInvalidTime(info.getEndTime());
return command;
}
}

View File

@@ -0,0 +1,19 @@
package com.realtime.protection.configuration.entity.task;
import lombok.Data;
@Data
public class FiveTupleWithMask {
private Integer addrType;
private String sourceIP;
private String sourcePort;
private String destinationIP;
private String destinationPort;
private String protocol;
private Integer protocolNum;
private String maskSourceIP;
private String maskSourcePort;
private String maskDestinationIP;
private String maskDestinationPort;
}

View File

@@ -11,7 +11,7 @@ import java.util.List;
@Data
public class Task {
@JsonProperty("task_id")
private Integer taskId;
private Long taskId;
@JsonProperty("task_name")
@NotNull(message = "task_name should not be empty. ")
@@ -19,6 +19,7 @@ public class Task {
@JsonProperty("task_start_time")
@NotNull(message = "task_start_time should not be empty. ")
@Future(message = "task_start_time should be a future time")
private LocalDateTime taskStartTime;
@JsonProperty("task_end_time")
@@ -34,7 +35,7 @@ public class Task {
@JsonProperty("task_type")
@NotNull(message = "task_type should not be empty. ")
private String taskType;
private Integer taskType;
@JsonProperty("task_act")
@NotNull(message = "task_act should not be empty. ")
@@ -47,13 +48,13 @@ public class Task {
private String taskCreateDepart;
@JsonProperty("task_create_userid")
private Integer taskCreateUserId;
private Long taskCreateUserId;
@JsonProperty("static_rule_ids")
private List<Integer> staticRuleIds;
private List<Long> staticRuleIds;
@JsonProperty("dynamic_rule_ids")
private List<Integer> dynamicRuleIds;
private List<Long> dynamicRuleIds;
@JsonProperty("task_status")
private Integer taskStatus;

View File

@@ -0,0 +1,19 @@
package com.realtime.protection.configuration.entity.task;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class TaskCommandInfo {
private FiveTupleWithMask fiveTupleWithMask;
private Long taskId;
private Long ruleId;
// 额外字段
private String operation;
private Integer frequency;
private LocalDateTime startTime;
private LocalDateTime endTime;
}

View File

@@ -0,0 +1,19 @@
package com.realtime.protection.configuration.exception;
public class DorisStartException extends Exception {
public Long taskId;
public DorisStartException(Exception e, Long taskId) {
super(e.getMessage(), e.getCause());
this.taskId = taskId;
}
public DorisStartException(Exception e) {
super(e.getMessage(), e.getCause());
}
public DorisStartException(String message, Long taskId) {
super(message);
this.taskId = taskId;
}
}

View File

@@ -3,6 +3,8 @@ package com.realtime.protection.configuration.exception;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.SaTokenException;
import com.realtime.protection.configuration.response.ResponseResult;
import com.realtime.protection.configuration.utils.enums.StateEnum;
import com.realtime.protection.server.task.status.StateChangeService;
import org.apache.ibatis.exceptions.PersistenceException;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.core.annotation.Order;
@@ -16,20 +18,18 @@ import java.util.stream.Collectors;
@RestControllerAdvice
public class GlobalExceptionHandler {
private final StateChangeService stateChangeService;
public GlobalExceptionHandler(StateChangeService stateChangeService) {
this.stateChangeService = stateChangeService;
}
@Order(3)
@ExceptionHandler(value = Exception.class)
public ResponseResult handleGlobalException(Exception e) {
return ResponseResult.error().setMessage(e.getMessage());
}
@Order(2)
@ExceptionHandler(value = NotLoginException.class)
public ResponseResult handleNotLoginException(NotLoginException e) {
return new ResponseResult(
401,
e.getMessage()
);
}
@Order(2)
@ExceptionHandler(value = PersistenceException.class)
@@ -48,14 +48,42 @@ public class GlobalExceptionHandler {
}
@Order(2)
@ExceptionHandler(value = {HandlerMethodValidationException.class, IllegalArgumentException.class})
public ResponseResult handleHandlerMethodValidationException(HandlerMethodValidationException e) {
@ExceptionHandler(value = {
HandlerMethodValidationException.class,
IllegalArgumentException.class,
IllegalStateException.class
})
public ResponseResult handleHandlerMethodValidationException(Exception e) {
return ResponseResult.invalid().setMessage(e.getMessage());
}
@Order(2)
@ExceptionHandler(value = NotLoginException.class)
public ResponseResult handleNotLoginException(NotLoginException e) {
return new ResponseResult(
401,
e.getMessage()
);
}
@Order(2)
@ExceptionHandler(value = SaTokenException.class)
public ResponseResult handleSaTokenException(SaTokenException e) {
return ResponseResult.unAuthorized().setMessage(e.getMessage());
}
@Order(2)
@ExceptionHandler(value = DorisStartException.class)
public ResponseResult handleDorisStartException(DorisStartException e) {
ResponseResult responseResult = ResponseResult.error()
.setMessage("Doris command creation meets error: " + e.getMessage());
try {
stateChangeService.changeState(StateEnum.FAILED.getStateNum(), e.taskId);
} catch (Exception another) {
responseResult.setAnother(ResponseResult.error().setMessage(e.getMessage()));
}
return responseResult;
}
}

View File

@@ -12,6 +12,7 @@ public class ResponseResult implements Serializable {
private int code;
private String message;
private Map<String, Object> data;
private ResponseResult another;
public ResponseResult(int code, String message, LinkedHashMap<String, Object> data) {
this.code = code;

View File

@@ -0,0 +1,5 @@
package com.realtime.protection.configuration.satoken;
public interface Nameable {
String name();
}

View File

@@ -1,11 +1,9 @@
package com.realtime.protection.configuration.satoken;
import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import com.realtime.protection.configuration.satoken.permission.Permission;
import com.realtime.protection.configuration.satoken.permission.SystemConfiguration;
import com.realtime.protection.configuration.satoken.permission.WhiteList;
import com.realtime.protection.configuration.satoken.role.Role;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@@ -15,13 +13,15 @@ public class SaTokenConfigure implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SaInterceptor(handler -> {
SaRouter.match("/whiteobj/new", r ->
this.checkPermissions(SystemConfiguration.NEW, WhiteList.NEW));
SaRouter.match("/whiteobj/update", r ->
this.checkPermissions(SystemConfiguration.UPDATE, WhiteList.UPDATE));
}))
.addPathPatterns("/**")
.excludePathPatterns("/user/doLogin");
// SaRouter.match("/**")
// .notMatch("/user/doLogin")
// .check(r -> StpUtil.checkLogin());
// SaRouter.match("/whiteobj/new", r ->
// this.checkPermissions(WhiteList.NEW));
// SaRouter.match("/whiteobj/{id}/update", r ->
// this.checkPermissions(WhiteList.UPDATE));
})).addPathPatterns("/**");
}
void checkPermissions(Permission... permissions) {
@@ -30,5 +30,10 @@ public class SaTokenConfigure implements WebMvcConfigurer {
}
}
void checkRole(Role... roles) {
for (Role role : roles) {
StpUtil.checkRole(role.getName());
}
}
}

View File

@@ -1,5 +0,0 @@
package com.realtime.protection.configuration.satoken.permission;
public interface Nameable {
String name();
}

View File

@@ -1,5 +1,7 @@
package com.realtime.protection.configuration.satoken.permission;
import com.realtime.protection.configuration.satoken.Nameable;
public interface Permission extends Nameable {
default String getName() {
return this.getClass().getSimpleName() + ":" + this.name();

View File

@@ -0,0 +1,5 @@
package com.realtime.protection.configuration.satoken.role;
public enum Admin implements Role {
ADMIN
}

View File

@@ -0,0 +1,10 @@
package com.realtime.protection.configuration.satoken.role;
import com.realtime.protection.configuration.satoken.Nameable;
public interface Role extends Nameable {
default String getName() {
return this.getClass().getSimpleName() + ":" + this.name();
}
}

View File

@@ -0,0 +1,18 @@
package com.realtime.protection.configuration.utils;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
public class EntityUtils {
public static Map<String, Object> entityToMap(Object object) throws IllegalAccessException {
Map<String, Object> resultMap = new HashMap<>();
for (Field field : object.getClass().getDeclaredFields()) {
field.setAccessible(true);
Object o = field.get(object);
resultMap.put(field.getName(), o);
}
return resultMap;
}
}

View File

@@ -16,13 +16,15 @@ public class SqlSessionWrapper {
this.sqlSessionFactory = sqlSessionFactory;
}
/** 启动批量SQL会话
* @param mapperClass MyBatis Mapper类型
/**
* 启动批量SQL会话
*
* @param mapperClass MyBatis Mapper类型
* @param batchFunction 批量函数(批量添加、批量删除、批量更新等)
* @param arguments 函数附带的所有参数可以使用Map进行包装
* @param <M> Mapper class
* @param <I> Function input
* @param <O> Function output
* @param arguments 函数附带的所有参数可以使用Map进行包装
* @param <M> Mapper class
* @param <I> Function input
* @param <O> Function output
* @return 被包装的批量函数返回值
*/
public <M, I, O> O startBatchSession(Class<M> mapperClass,

View File

@@ -0,0 +1,30 @@
package com.realtime.protection.configuration.utils.enums;
import java.util.HashMap;
import java.util.Map;
public enum ProtocolEnum {
TCP(6),
UDP(17);
private final Integer number;
private static final Map<Integer, ProtocolEnum> map = new HashMap<>();
static {
for (ProtocolEnum protocol : ProtocolEnum.values()) {
map.put(protocol.getProtocolNumber(), protocol);
}
}
ProtocolEnum(int protocolNumber) {
this.number = protocolNumber;
}
public Integer getProtocolNumber() {
return this.number;
}
public static ProtocolEnum getProtocolEnumByNumber(Integer protocolNum) {
return map.get(protocolNum);
}
}

View File

@@ -0,0 +1,51 @@
package com.realtime.protection.configuration.utils.enums;
import com.realtime.protection.configuration.utils.status.State;
import com.realtime.protection.server.task.status.states.*;
import lombok.Getter;
import java.util.HashMap;
import java.util.Map;
@Getter
public enum StateEnum {
// 仅需修改此处即可将任务状态以及对应的State和Num进行对应
PENDING(0, new PendingState()),
RUNNING(1, new RunningState()),
PAUSED(2, new PauseState()),
STOP(3, new StopState()),
FINISHED(4, new FinishedState()),
FAILED(5, new FailedState());
// ----------------------------------------------
private final State state;
private final Integer stateNum;
private static final Map<Integer, State> numToStateMap = new HashMap<>();
private static final Map<State, Integer> stateToNumMap = new HashMap<>();
private static final Map<State, StateEnum> stateToStateEnumMap = new HashMap<>();
static {
for (StateEnum stateEnum : StateEnum.values()) {
numToStateMap.put(stateEnum.getStateNum(), stateEnum.getState());
stateToNumMap.put(stateEnum.getState(), stateEnum.getStateNum());
stateToStateEnumMap.put(stateEnum.getState(), stateEnum);
}
}
StateEnum(int stateNum, State state) {
this.stateNum = stateNum;
this.state = state;
}
public static State getStateByNum(Integer stateNum) {
return numToStateMap.get(stateNum);
}
public static Integer getNumByState(State state) {
return stateToNumMap.get(state);
}
public static StateEnum getStateEnumByState(State state) {
return stateToStateEnumMap.get(state);
}
}

View File

@@ -0,0 +1,33 @@
package com.realtime.protection.configuration.utils.enums;
import lombok.Getter;
import java.util.HashMap;
import java.util.Map;
@Getter
public enum TaskTypeEnum {
STATIC(1),
DYNAMIC(2),
JUDGED(3);
private final int taskType;
private static final Map<Integer, TaskTypeEnum> map = new HashMap<>();
static {
for (TaskTypeEnum taskType : TaskTypeEnum.values()) {
map.put(taskType.getTaskType(), taskType);
}
}
TaskTypeEnum(int taskType) {
this.taskType = taskType;
}
public static TaskTypeEnum getTaskTypeByNum(Integer taskType) {
if (taskType == null) {
return null;
}
return map.get(taskType);
}
}

View File

@@ -0,0 +1,17 @@
package com.realtime.protection.configuration.utils.status;
import lombok.Getter;
@Getter
public enum AuditStatus {
PENDING(0),
UNAUDITED(1),
AUDITED(2);
private final int auditStatus;
AuditStatus(int auditStatus) {
this.auditStatus = auditStatus;
}
}

View File

@@ -14,9 +14,15 @@ public class AuditStatusValidator {
public Boolean checkValidate(Integer auditStatusNow) {
switch (auditStatusNow) {
case 0, 1 -> {return auditStatusOriginal != 2;}
case 2 -> {return auditStatusOriginal != 1;}
default -> {return false;}
case 0, 1 -> {
return auditStatusOriginal != 2;
}
case 2 -> {
return auditStatusOriginal != 1;
}
default -> {
return false;
}
}
}
}

View File

@@ -0,0 +1,9 @@
package com.realtime.protection.configuration.utils.status;
import com.realtime.protection.configuration.exception.DorisStartException;
import com.realtime.protection.server.command.CommandService;
import com.realtime.protection.server.task.TaskService;
public interface State {
Boolean handle(State newState, CommandService commandService, TaskService taskService, Long taskId) throws DorisStartException;
}

View File

@@ -0,0 +1,20 @@
package com.realtime.protection.configuration.utils.status;
import lombok.Getter;
@Getter
public enum StateNum {
PENDING(0),
RUNNING(1),
PAUSED(2),
STOPPED(3),
FAILED(4),
FINISHED(5);
private final int stateNum;
StateNum(int stateNum) {
this.stateNum = stateNum;
}
}

View File

@@ -0,0 +1,22 @@
package com.realtime.protection.server.command;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.realtime.protection.configuration.entity.task.Command;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@DS("doris")
@Mapper
public interface CommandMapper {
Boolean createCommand(@Param("command") Command command);
void createCommands(@Param("commands") List<Command> commands);
Boolean stopCommandsByTaskId(@Param("task_id") Long taskId);
Boolean removeCommandsByTaskId(@Param("task_id") Long taskId);
Boolean startCommandsByTaskId(@Param("task_id") Long taskId);
}

View File

@@ -0,0 +1,101 @@
package com.realtime.protection.server.command;
import com.alibaba.excel.util.ListUtils;
import com.realtime.protection.configuration.entity.task.Command;
import com.realtime.protection.configuration.entity.task.TaskCommandInfo;
import com.realtime.protection.configuration.exception.DorisStartException;
import com.realtime.protection.configuration.utils.SqlSessionWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.function.Function;
@Service
@Slf4j
public class CommandService {
private final CommandMapper commandMapper;
private final SqlSessionWrapper sqlSessionWrapper;
private static final int BatchSize = 1000;
private final Function<CommandMapper, Function<TaskCommandInfo, Void>> createCommandBatchFunction;
public CommandService(CommandMapper commandMapper, SqlSessionWrapper sqlSessionWrapper) {
this.commandMapper = commandMapper;
this.sqlSessionWrapper = sqlSessionWrapper;
this.createCommandBatchFunction = mapper -> info -> {
if (info.getFrequency() == null) {
Command command = Command.generateCommand(info, info.getStartTime());
commandMapper.createCommand(command);
}
List<Command> commandBatch = ListUtils.newArrayListWithExpectedSize(BatchSize);
LocalDateTime validTime = info.getStartTime();
while (validTime.isBefore(info.getEndTime())) {
Command command = Command.generateCommand(info, validTime);
commandBatch.add(command);
validTime = validTime.plusMinutes(info.getFrequency());
if (commandBatch.size() < BatchSize) {
continue;
}
commandMapper.createCommands(commandBatch);
commandBatch.clear();
}
if (!commandBatch.isEmpty()) {
commandMapper.createCommands(commandBatch);
commandBatch.clear();
}
log.debug(String.format("create all the commands from task(%d), rule(%d)",
info.getTaskId(), info.getRuleId()));
return null;
};
}
@Async
public void createCommand(TaskCommandInfo commandInfo) throws DorisStartException {
try {
sqlSessionWrapper.startBatchSession(CommandMapper.class, createCommandBatchFunction, commandInfo);
} catch (Exception e) {
throw new DorisStartException(e);
}
}
@Async
public void createCommands(List<TaskCommandInfo> taskCommandInfos) throws DorisStartException {
Function<CommandMapper, Function<List<TaskCommandInfo>, Void>> function = mapper -> list -> {
if (list == null || list.isEmpty()) {
return null;
}
for (TaskCommandInfo info : list) {
createCommandBatchFunction.apply(mapper).apply(info);
}
return null;
};
try {
sqlSessionWrapper.startBatchSession(CommandMapper.class, function, taskCommandInfos);
} catch (Exception e) {
throw new DorisStartException(e);
}
}
public Boolean startCommandsByTaskId(Long taskId) {
return commandMapper.startCommandsByTaskId(taskId);
}
public Boolean stopCommandsByTaskId(Long taskId) {
return commandMapper.stopCommandsByTaskId(taskId);
}
public Boolean removeCommandsByTaskId(Long taskId) {
return commandMapper.removeCommandsByTaskId(taskId);
}
}

View File

@@ -3,6 +3,7 @@ package com.realtime.protection.server.defense.object;
import com.alibaba.excel.EasyExcel;
import com.realtime.protection.configuration.entity.defense.object.ProtectObject;
import com.realtime.protection.configuration.response.ResponseResult;
import com.realtime.protection.configuration.utils.EntityUtils;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
@@ -76,21 +77,15 @@ public class ProtectObjectController {
}
@GetMapping("/{id}/query")
public ResponseResult queryProtectObject(@PathVariable("id") Integer protectObjectId) {
@GetMapping("/{protectObjectId}/query")
public ResponseResult queryProtectObject(@PathVariable Integer protectObjectId) throws IllegalAccessException {
ProtectObject protectObject = protectObjectService.queryProtectObject(protectObjectId);
return ResponseResult.ok()
.setData("proobj_id", protectObject.getProtectObjectId())
.setData("proobj_name", protectObject.getProtectObjectName())
.setData("proobj_system_name", protectObject.getProtectObjectSystemName())
.setData("proobj_ip_address", protectObject.getProtectObjectIPAddress())
.setData("proobj_port", protectObject.getProtectObjectPort())
.setData("proobj_url", protectObject.getProtectObjectURL())
.setData("proobj_protocol", protectObject.getProtectObjectProtocol());
.setDataMap(EntityUtils.entityToMap(protectObject));
}
@PostMapping("/{id}/update")
public ResponseResult updateProtectObject(@PathVariable("id") Integer protectObjectId,
@PostMapping("/{protectObjectId}/update")
public ResponseResult updateProtectObject(@PathVariable Integer protectObjectId,
@RequestBody @Valid ProtectObject protectObject) {
protectObject.setProtectObjectId(protectObjectId);
return ResponseResult.ok()
@@ -98,8 +93,8 @@ public class ProtectObjectController {
.setData("success", protectObjectService.updateProtectObject(protectObject));
}
@DeleteMapping("/{id}/delete")
public ResponseResult deleteProtectObject(@PathVariable("id") Integer protectObjectId) {
@DeleteMapping("/{protectObjectId}/delete")
public ResponseResult deleteProtectObject(@PathVariable Integer protectObjectId) {
return ResponseResult.ok()
.setData("proobj_id", protectObjectId)
.setData("success", protectObjectService.deleteProtectObject(protectObjectId));
@@ -112,9 +107,9 @@ public class ProtectObjectController {
.setData("success", protectObjectService.deleteProtectObjects(protectObjectIds));
}
@PostMapping("/{id}/audit/{status}")
public ResponseResult changeProtectObjectAuditStatus(@PathVariable("id") Integer protectObjectId,
@PathVariable("status") Integer auditStatus) {
@PostMapping("/{protectObjectId}/audit/{auditStatus}")
public ResponseResult changeProtectObjectAuditStatus(@PathVariable Integer protectObjectId,
@PathVariable Integer auditStatus) {
return ResponseResult.ok()
.setDataMap(protectObjectService.changeProtectObjectAuditStatus(protectObjectId, auditStatus))
.setData("proobj_id", protectObjectId);

View File

@@ -2,8 +2,8 @@ package com.realtime.protection.server.defense.object;
import com.alibaba.excel.util.ListUtils;
import com.realtime.protection.configuration.entity.defense.object.ProtectObject;
import com.realtime.protection.configuration.utils.status.AuditStatusValidator;
import com.realtime.protection.configuration.utils.SqlSessionWrapper;
import com.realtime.protection.configuration.utils.status.AuditStatusValidator;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -90,7 +90,7 @@ public class ProtectObjectService {
protectObjectBatch.clear();
}
if (!protectObjectBatch.isEmpty()) {
mapper.deleteProtectObjects(protectObjectBatch);;
mapper.deleteProtectObjects(protectObjectBatch);
}
return success;
};

View File

@@ -2,6 +2,7 @@ package com.realtime.protection.server.defense.template;
import com.realtime.protection.configuration.entity.defense.template.Template;
import com.realtime.protection.configuration.response.ResponseResult;
import com.realtime.protection.configuration.utils.EntityUtils;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import org.springframework.web.bind.annotation.*;
@@ -43,16 +44,22 @@ public class TemplateController {
@GetMapping("/query")
public ResponseResult queryTemplates(@RequestParam(value = "template_name", required = false) String templateName,
@RequestParam("page") @Min(1) Integer page,
@RequestParam("page_size") @Min(1) Integer pageSize) {
@RequestParam("page") @Min(1) Integer page,
@RequestParam("page_size") @Min(1) Integer pageSize) {
List<Template> templates = templateService.queryTemplates(templateName, page, pageSize);
return ResponseResult.ok()
.setData("templates", templates);
}
@PostMapping("/{id}/update")
public ResponseResult updateTemplate(@PathVariable("id") @Min(1) Integer templateId,
@GetMapping("/{templateId}/query")
public ResponseResult queryTemplate(@PathVariable Integer templateId) throws IllegalAccessException {
return ResponseResult.ok()
.setDataMap(EntityUtils.entityToMap(templateService.queryTemplate(templateId)));
}
@PostMapping("/{templateId}/update")
public ResponseResult updateTemplate(@PathVariable @Min(1) Integer templateId,
@RequestBody @Valid Template template) {
Boolean success = templateService.updateTemplate(templateId, template);
return ResponseResult.ok()
@@ -60,14 +67,10 @@ public class TemplateController {
.setData("success", success);
}
@GetMapping("/{id}/addUsedTimes")
public ResponseResult addTemplateUsedTimes(@PathVariable("id") @Min(1) Integer templateId,
@RequestParam(value = "add_num") @Min(0) Integer addNum) {
Boolean success = templateService.addTemplateUsedTimes(templateId, addNum);
@DeleteMapping("/{templateId}/delete")
public ResponseResult deleteTemplate(@PathVariable @Min(1) Integer templateId) {
return ResponseResult.ok()
.setData("template_id", templateId)
.setData("success", success);
.setData("success", templateService.deleteTemplate(templateId));
}
}

View File

@@ -21,7 +21,7 @@ public interface TemplateMapper {
Boolean updateTemplateInformation(@Param("template") Template template);
void countTemplateRunningTasks(@Param("template_id") Integer templateId);
Template queryTemplate(@Param("template_id") Integer templateId);
Boolean addTemplateUsedTimes(@Param("template_id") Integer templateId, @Param("add_times") Integer addTimes);
Boolean deleteTemplate(@Param("template_id") Integer templateId);
}

View File

@@ -4,8 +4,6 @@ import com.realtime.protection.configuration.entity.defense.template.Template;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.beans.Transient;
import java.util.Arrays;
import java.util.List;
@Service
@@ -41,8 +39,11 @@ public class TemplateService {
return templateMapper.updateTemplateInformation(template);
}
public Boolean addTemplateUsedTimes(Integer templateId, Integer addTimes) {
return templateMapper.addTemplateUsedTimes(templateId, addTimes);
public Template queryTemplate(Integer templateId) {
return templateMapper.queryTemplate(templateId);
}
public Boolean deleteTemplate(Integer templateId) {
return templateMapper.deleteTemplate(templateId);
}
}

View File

@@ -43,11 +43,9 @@ public class DynamicRuleController {
}
//id删除
@RequestMapping("/{dynamicRuleId}/delete")
public ResponseResult deleteDynamicRuleObject(@PathVariable Integer dynamicRuleId ) {
public ResponseResult deleteDynamicRuleObject(@PathVariable Integer dynamicRuleId) {
log.info("删除动态规则: {}", dynamicRuleId);
//调用service删除
dynamicRuleService.deleteDynamicRuleObject(dynamicRuleId);
@@ -62,7 +60,7 @@ public class DynamicRuleController {
//调用service删除
return ResponseResult.ok()
.setData("success",dynamicRuleService.deleteDynamicRuleObjects(dynamicRuleIds));
.setData("success", dynamicRuleService.deleteDynamicRuleObjects(dynamicRuleIds));
}
//修改

View File

@@ -4,7 +4,6 @@ import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.realtime.protection.configuration.entity.rule.dynamicrule.DynamicRuleObject;
import lombok.extern.slf4j.Slf4j;
import java.util.List;

View File

@@ -16,13 +16,13 @@ public interface DynamicRuleMapper {
//新建动态规则与保护对象关联
void newDynamicRulProtectObjectConcat(long dynamicRuleId, Integer protectObjectId);
void deleteDynamicRuleObject( Integer dynamicRuleId);
void deleteDynamicRuleObject(Integer dynamicRuleId);
DynamicRuleObject queryDynamicRuleById(Integer dynamicRuleId);
List<ProtectObject> queryProtectObjectByRuleId(Integer dynamicRuleId);
void updateDynamicRuleObject(@Param("dynamicRuleId") Integer dynamicRuleId,@Param("object") DynamicRuleObject dynamicRuleObject);
void updateDynamicRuleObject(@Param("dynamicRuleId") Integer dynamicRuleId, @Param("object") DynamicRuleObject dynamicRuleObject);
void newDynamicRules(List<DynamicRuleObject> dynamicRuleObjects);

View File

@@ -6,8 +6,8 @@ import com.realtime.protection.configuration.entity.rule.staticrule.StaticRuleOb
import com.realtime.protection.configuration.response.ResponseResult;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@@ -22,6 +22,7 @@ import java.util.List;
public class StaticRuleController {
private final StaticRuleService staticRuleService;
public StaticRuleController(StaticRuleService staticRuleService) {
this.staticRuleService = staticRuleService;
}
@@ -30,11 +31,11 @@ public class StaticRuleController {
* 新增静态规则
*/
@PostMapping("/new")
public ResponseResult newStaticRuleObject(@RequestBody @Valid StaticRuleObject object){
log.info("新增静态规则: {}" , object);
public ResponseResult newStaticRuleObject(@RequestBody @Valid StaticRuleObject object) {
log.info("新增静态规则: {}", object);
//调用service新增
staticRuleService.newStaticRuleObject(object);
return ResponseResult.ok().setData("static_rule_name",object.getStaticRuleName());
return ResponseResult.ok().setData("static_rule_name", object.getStaticRuleName());
}
//以Excel方式批量导入静态规则
@@ -44,6 +45,7 @@ public class StaticRuleController {
new StaticRuleDataListener(staticRuleService)).sheet().doRead();
return ResponseResult.ok();
}
//下载模板文件
@GetMapping("/download")
public void downloadTemplate(HttpServletResponse response) throws IOException {
@@ -62,20 +64,20 @@ public class StaticRuleController {
* 删除静态规则有的删了有的没删也返回false
*/
@DeleteMapping("/{ids}")
public ResponseResult delete(@PathVariable List<Integer> ids){
log.info("根据id删除静态规则:{}",ids);
//
public ResponseResult delete(@PathVariable List<Integer> ids) {
log.info("根据id删除静态规则:{}", ids);
//
return ResponseResult.ok()
.setData("static_rule_id",ids)
.setData("success",staticRuleService.deleteStaticRules(ids));
.setData("static_rule_id", ids)
.setData("success", staticRuleService.deleteStaticRules(ids));
}
/**
* 修改静态规则
*/
@PutMapping("/update")
public ResponseResult updateStaticRule(@RequestBody @Valid StaticRuleObject object){
log.info("修改静态规则: {}" , object);
public ResponseResult updateStaticRule(@RequestBody @Valid StaticRuleObject object) {
log.info("修改静态规则: {}", object);
//调用service修改
staticRuleService.updateStaticRule(object);
return ResponseResult.ok();
@@ -86,11 +88,11 @@ public class StaticRuleController {
* 路径参数通过请求URL直接传递参数使用{…}来标识该路径参数,需要使用 @PathVariable 获取路径参数
*/
@RequestMapping("/{id}/query")
public ResponseResult queryStaticRuleById(@PathVariable Integer id){
log.info("根据id查询静态规则:{}",id);
StaticRuleObject object = staticRuleService.queryStaticRuleById(id);
return ResponseResult.ok().setData("static_rule",object);
}
public ResponseResult queryStaticRuleById(@PathVariable Integer id) {
log.info("根据id查询静态规则:{}", id);
StaticRuleObject object = staticRuleService.queryStaticRuleById(id);
return ResponseResult.ok().setData("static_rule", object);
}
/**
* 分页查询静态规则
@@ -99,10 +101,10 @@ public class StaticRuleController {
public ResponseResult queryStaticRule(String static_rule_name, Integer static_rule_id,
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer pageSize
){
log.info("多查询静态规则: {},{},{},{}", static_rule_name,static_rule_id,page,pageSize);
) {
log.info("多查询静态规则: {},{},{},{}", static_rule_name, static_rule_id, page, pageSize);
//调用service新增
List<StaticRuleObject> pageResult = staticRuleService.queryStaticRule(static_rule_name,static_rule_id,page,pageSize);
return ResponseResult.ok().setData("static_rule_list",pageResult);
List<StaticRuleObject> pageResult = staticRuleService.queryStaticRule(static_rule_name, static_rule_id, page, pageSize);
return ResponseResult.ok().setData("static_rule_list", pageResult);
}
}

View File

@@ -6,7 +6,6 @@ import com.alibaba.excel.util.ListUtils;
import com.realtime.protection.configuration.entity.rule.staticrule.StaticRuleObject;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
@Slf4j

View File

@@ -16,8 +16,6 @@ public interface StaticRuleMapper {
//根据主键删除静态规则
@Delete("delete from t_static_rule where static_rule_id = #{id}")
Boolean deleteStaticRuleById(Integer id);
//修改静态规则

View File

@@ -2,9 +2,8 @@ package com.realtime.protection.server.rule.staticrule;
import com.alibaba.excel.util.ListUtils;
import com.realtime.protection.configuration.entity.rule.staticrule.StaticRuleObject;
import org.springframework.stereotype.Service;
import com.realtime.protection.configuration.utils.SqlSessionWrapper;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
@@ -88,7 +87,7 @@ public class StaticRuleService {
*/
public List<StaticRuleObject> queryStaticRule(String static_rule_name, Integer static_rule_id, Integer page, Integer pageSize) {
return staticRuleMapper.queryStaticRule(static_rule_name,static_rule_id,page,pageSize);
return staticRuleMapper.queryStaticRule(static_rule_name, static_rule_id, page, pageSize);
}
public Boolean newStaticRuleObjects(List<StaticRuleObject> staticRuleList) {

View File

@@ -1,20 +0,0 @@
package com.realtime.protection.server.task;
import com.realtime.protection.server.task.state.State;
public class StatusChanger {
private final State state;
public StatusChanger(State state) {
this.state = state;
}
public static StatusChanger setOriginal(State original) {
return new StatusChanger(original);
}
public Boolean changeState(State newState) {
return this.state.handle(newState);
}
}

View File

@@ -1,9 +1,14 @@
package com.realtime.protection.server.task;
import com.realtime.protection.configuration.entity.task.Task;
import com.realtime.protection.configuration.exception.DorisStartException;
import com.realtime.protection.configuration.response.ResponseResult;
import com.realtime.protection.configuration.utils.EntityUtils;
import com.realtime.protection.server.task.status.StateChangeService;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -13,14 +18,16 @@ import java.util.List;
public class TaskController {
private final TaskService taskService;
private final StateChangeService stateChangeService;
public TaskController(TaskService taskService) {
public TaskController(TaskService taskService, StateChangeService stateChangeService) {
this.taskService = taskService;
this.stateChangeService = stateChangeService;
}
@PostMapping("/new")
public ResponseResult newTask(@RequestBody @Valid Task task) {
Integer taskId = taskService.newTask(task);
Long taskId = taskService.newTask(task);
if (taskId > 0) {
return ResponseResult.ok()
@@ -48,7 +55,7 @@ public class TaskController {
}
@GetMapping("/{id}/query")
public ResponseResult queryTask(@PathVariable("id") @Min(1) Integer id) {
public ResponseResult queryTask(@PathVariable @Min(1) Long id) throws IllegalAccessException {
Task task = taskService.queryTask(id);
if (task == null) {
@@ -56,44 +63,39 @@ public class TaskController {
}
return ResponseResult.ok()
.setData("task_id", task.getTaskId())
.setData("task_name", task.getTaskName())
.setData("task_type", task.getTaskType())
.setData("task_status", task.getTaskStatus())
.setData("task_creator", task.getTaskCreateUsername())
.setData("task_creator_depart", task.getTaskCreateDepart())
.setData("task_start_time", task.getTaskStartTime())
.setData("task_end_time", task.getTaskEndTime())
.setData("task_static_rule_ids", task.getStaticRuleIds())
.setData("task_dynamic_rule_ids", task.getDynamicRuleIds());
.setDataMap(EntityUtils.entityToMap(task));
}
@PostMapping("/{id}/update")
public ResponseResult updateTask(@PathVariable("id") @Min(1) Integer taskId, @RequestBody @Valid Task task) {
task.setTaskId(taskId);
@PostMapping("/update")
public ResponseResult updateTask(@RequestBody @Valid Task task) {
return ResponseResult.ok()
.setData("task_id", taskId)
.setData("task_id", task.getTaskId())
.setData("success", taskService.updateTask(task));
}
@GetMapping("/{taskId}/audit/{auditStatus}")
public ResponseResult changeTaskAuditStatus(@PathVariable Integer auditStatus, @PathVariable Integer taskId) {
public ResponseResult changeTaskAuditStatus(@PathVariable @NotNull @Max(10) Integer auditStatus,
@PathVariable @NotNull @Min(1) Long taskId) {
return ResponseResult.ok()
.setData("task_id", taskId)
.setData("success", taskService.changeTaskAuditStatus(taskId, auditStatus));
.setData("success", taskService.changeTaskAuditStatus(taskId, auditStatus))
.setData("audit_status", taskService.queryTaskAuditStatus(taskId));
}
@GetMapping("/{id}/delete")
public ResponseResult deleteTask(@PathVariable("id") Integer taskId) {
@GetMapping("/{taskId}/delete")
public ResponseResult deleteTask(@PathVariable @NotNull @Min(1) Long taskId) {
return ResponseResult.ok()
.setData("task_id", taskId)
.setData("success", taskService.deleteTask(taskId));
}
@GetMapping("/{taskId}/running/{state}")
public ResponseResult changeTaskStatus(@PathVariable Integer state, @PathVariable Integer taskId) {
@GetMapping("/{taskId}/running/{stateNum}")
public ResponseResult changeTaskStatus(@PathVariable @NotNull Integer stateNum,
@PathVariable @NotNull Long taskId) throws DorisStartException {
return ResponseResult.ok()
.setData("task_id", taskId)
.setData("success", taskService.changeTaskStatus(taskId, state));
.setData("success", stateChangeService.changeState(stateNum, taskId))
.setData("status_now", taskService.queryTaskStatus(taskId));
}
}

View File

@@ -1,6 +1,7 @@
package com.realtime.protection.server.task;
import com.realtime.protection.configuration.entity.task.Task;
import com.realtime.protection.configuration.entity.task.TaskCommandInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -10,25 +11,33 @@ import java.util.List;
public interface TaskMapper {
void newTask(@Param("task") Task task);
void newTaskStaticRuleConcat(@Param("task_id") Integer taskId,
@Param("rule_ids") List<Integer> staticRuleIds);
void newTaskStaticRuleConcat(@Param("task_id") Long taskId,
@Param("rule_ids") List<Long> staticRuleIds);
void newTaskDynamicRuleConcat(@Param("task_id") Integer taskId,
@Param("rule_ids") List<Integer> dynamicRuleIds);
void newTaskDynamicRuleConcat(@Param("task_id") Long taskId,
@Param("rule_ids") List<Long> dynamicRuleIds);
List<Task> queryTasks(@Param("task_status") Integer taskStatus, @Param("task_type") String task_type,
@Param("task_name") String taskName, @Param("task_creator") String taskCreator,
@Param("page") Integer page, @Param("page_size") Integer pageSize);
Task queryTask(@Param("task_id") Integer taskId);
Task queryTask(@Param("task_id") Long taskId);
void updateTask(@Param("task") Task task);
void clearTaskConnectedStaticRule(@Param("task_id") Integer taskId);
void clearTaskConnectedStaticRule(@Param("task_id") Long taskId);
void clearTaskConnectedDynamicRule(@Param("task_id") Integer taskId);
void clearTaskConnectedDynamicRule(@Param("task_id") Long taskId);
void changeTaskAuditStatus(@Param("task_id") Integer taskId, @Param("audit_status") Integer auditStatus);
void changeTaskAuditStatus(@Param("task_id") Long taskId, @Param("audit_status") Integer auditStatus);
Boolean deleteTask(@Param("task_id") Integer taskId);
Boolean deleteTask(@Param("task_id") Long taskId);
Boolean changeTaskStatus(@Param("task_id") Long taskId, @Param("state") Integer stateNum);
List<TaskCommandInfo> getStaticCommands(@Param("task_id") Long taskId);
Integer queryTaskAuditStatus(@Param("task_id") Long taskId);
Integer queryTaskStatus(@Param("task_id") Long taskId);
}

View File

@@ -1,11 +1,8 @@
package com.realtime.protection.server.task;
import com.realtime.protection.configuration.entity.task.Task;
import com.realtime.protection.configuration.entity.task.TaskCommandInfo;
import com.realtime.protection.configuration.utils.status.AuditStatusValidator;
import com.realtime.protection.server.task.state.PauseState;
import com.realtime.protection.server.task.state.RunningState;
import com.realtime.protection.server.task.state.State;
import com.realtime.protection.server.task.state.StopState;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -20,7 +17,7 @@ public class TaskService {
}
@Transactional
public Integer newTask(Task task) {
public Long newTask(Task task) {
taskMapper.newTask(task);
taskMapper.newTaskStaticRuleConcat(task.getTaskId(), task.getStaticRuleIds());
@@ -35,7 +32,7 @@ public class TaskService {
return taskMapper.queryTasks(taskStatus, taskType, taskName, taskCreator, page, pageSize);
}
public Task queryTask(Integer id) {
public Task queryTask(Long id) {
return taskMapper.queryTask(id);
}
@@ -46,47 +43,46 @@ public class TaskService {
taskMapper.clearTaskConnectedStaticRule(task.getTaskId());
taskMapper.clearTaskConnectedDynamicRule(task.getTaskId());
taskMapper.newTaskStaticRuleConcat(task.getTaskId(), task.getStaticRuleIds());
taskMapper.newTaskDynamicRuleConcat(task.getTaskId(), task.getDynamicRuleIds());
if (task.getStaticRuleIds() != null && !task.getStaticRuleIds().isEmpty())
taskMapper.newTaskStaticRuleConcat(task.getTaskId(), task.getStaticRuleIds());
if (task.getDynamicRuleIds() != null && !task.getDynamicRuleIds().isEmpty())
taskMapper.newTaskDynamicRuleConcat(task.getTaskId(), task.getDynamicRuleIds());
return true;
}
@Transactional
public Boolean changeTaskAuditStatus(Integer taskId, Integer taskAuditStatus) {
if (AuditStatusValidator.setOriginal(taskMapper.queryTask(taskId).getTaskAuditStatus()).checkValidate(taskAuditStatus))
public Boolean changeTaskAuditStatus(Long taskId, Integer taskAuditStatus) {
Integer originalAuditStatus = taskMapper.queryTaskAuditStatus(taskId);
if (originalAuditStatus == null) {
throw new IllegalArgumentException("cannot find audit status of task " + taskId + ", maybe task doesn't exist?");
}
if (AuditStatusValidator.setOriginal(originalAuditStatus).checkValidate(taskAuditStatus))
taskMapper.changeTaskAuditStatus(taskId, taskAuditStatus);
else return false;
return true;
}
public Boolean deleteTask(Integer taskId) {
public Boolean deleteTask(Long taskId) {
return taskMapper.deleteTask(taskId);
}
@Transactional
public Boolean changeTaskStatus(Integer taskId, Integer stateNum) {
State originalState = switch (taskMapper.queryTask(taskId).getTaskStatus()) {
// 运行中
case 1 -> new RunningState();
// 暂停中
case 2 -> new PauseState();
// 停止中
case 3 -> new StopState();
default -> throw new IllegalArgumentException();
};
public Boolean changeTaskStatus(Long taskId, Integer stateNum) {
return taskMapper.changeTaskStatus(taskId, stateNum);
}
State newState = switch (stateNum) {
// 运行中
case 1 -> new RunningState();
// 暂停中
case 2 -> new PauseState();
// 停止中
case 3 -> new StopState();
default -> throw new IllegalArgumentException();
};
public List<TaskCommandInfo> getStaticCommandInfos(Long taskId) {
return taskMapper.getStaticCommands(taskId);
}
return StatusChanger.setOriginal(originalState).changeState(newState);
public Integer queryTaskAuditStatus(Long taskId) {
return taskMapper.queryTaskAuditStatus(taskId);
}
public Integer queryTaskStatus(Long taskId) {
return taskMapper.queryTaskStatus(taskId);
}
}

View File

@@ -1,19 +0,0 @@
package com.realtime.protection.server.task.state;
import com.baomidou.dynamic.datasource.annotation.DS;
public class PauseState implements State {
@Override
public Boolean handle(State newState) {
if (newState instanceof RunningState) {
return handleRun();
}
return false;
}
@DS("oracle")
private Boolean handleRun() {
return true;
}
}

View File

@@ -1,28 +0,0 @@
package com.realtime.protection.server.task.state;
public class RunningState implements State {
@Override
public Boolean handle(State newState) {
if (newState instanceof RunningState) {
return false;
}
if (newState instanceof PauseState) {
return handlePause();
}
if (newState instanceof StopState) {
return handleStop();
}
return false;
}
private Boolean handlePause() {
return true;
}
private Boolean handleStop() {
return true;
}
}

View File

@@ -1,6 +0,0 @@
package com.realtime.protection.server.task.state;
public interface State {
Boolean handle(State newState);
}

View File

@@ -1,8 +0,0 @@
package com.realtime.protection.server.task.state;
import com.realtime.protection.configuration.entity.task.Command;
import org.apache.ibatis.annotations.Param;
public interface StateMapper {
Boolean sendCommand(@Param("command") Command command);
}

View File

@@ -1,17 +0,0 @@
package com.realtime.protection.server.task.state;
public class StopState implements State {
@Override
public Boolean handle(State newState) {
if (newState instanceof RunningState) {
return handleRun();
}
return false;
}
public Boolean handleRun() {
return true;
}
}

View File

@@ -0,0 +1,46 @@
package com.realtime.protection.server.task.status;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.realtime.protection.configuration.exception.DorisStartException;
import com.realtime.protection.configuration.utils.enums.StateEnum;
import com.realtime.protection.configuration.utils.status.State;
import com.realtime.protection.server.command.CommandService;
import com.realtime.protection.server.task.TaskService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class StateChangeService {
private final CommandService commandService;
private final TaskService taskService;
public StateChangeService(CommandService commandService, TaskService taskService) {
this.commandService = commandService;
this.taskService = taskService;
}
@DSTransactional
public Boolean changeState(Integer stateNum, Long taskId) throws DorisStartException {
Integer originalStateNum = taskService.queryTaskStatus(taskId);
if (originalStateNum == null) {
throw new IllegalArgumentException("cannot find status of task " + taskId + ", maybe task doesn't exist?");
}
State originalState = StateEnum.getStateByNum(originalStateNum);
State newState = StateEnum.getStateByNum(stateNum);
if (!originalState.handle(newState, commandService, taskService, taskId)) {
return false;
}
log.debug(String.format("successfully let task(%d) change state from %s to %s",
taskId,
originalState.getClass().getSimpleName(),
newState.getClass().getSimpleName()));
// 这里一定是handle成功的状态我们再进行task status的修改如果handle失败要么返回false要么抛出异常不会进入此处
return taskService.changeTaskStatus(taskId, stateNum);
}
}

View File

@@ -0,0 +1,89 @@
package com.realtime.protection.server.task.status;
import com.realtime.protection.configuration.entity.task.Task;
import com.realtime.protection.configuration.entity.task.TaskCommandInfo;
import com.realtime.protection.configuration.exception.DorisStartException;
import com.realtime.protection.configuration.utils.enums.TaskTypeEnum;
import com.realtime.protection.configuration.utils.status.AuditStatus;
import com.realtime.protection.server.command.CommandService;
import com.realtime.protection.server.task.TaskService;
import java.util.List;
public class StateHandler {
protected Boolean handleStart(TaskService taskService, CommandService commandService, Long taskId) throws DorisStartException {
Task task = taskService.queryTask(taskId);
if (task == null) {
throw new IllegalArgumentException("invalid task id");
}
Integer taskAuditStatus = task.getTaskAuditStatus();
if (taskAuditStatus == null) {
throw new IllegalArgumentException("invalid task id, because task_audit_status is null");
}
// 如果审核状态不为已通过审核,则无效
if (taskAuditStatus != AuditStatus.AUDITED.getAuditStatus()) {
return false;
}
return switch (TaskTypeEnum.getTaskTypeByNum(task.getTaskType())) {
case STATIC -> handleStaticTaskStart(commandService, taskService, taskId);
case DYNAMIC -> handleDynamicTaskStart(commandService, taskService, taskId);
case JUDGED -> handleJudgedTaskStart(commandService, taskService, taskId);
};
}
protected Boolean handleResume(CommandService commandService, Long taskId) {
commandService.startCommandsByTaskId(taskId);
return true;
}
protected Boolean handlePause(CommandService commandService, Long taskId) {
commandService.stopCommandsByTaskId(taskId);
return true;
}
protected Boolean handleStop(CommandService commandService, Long taskId) {
commandService.removeCommandsByTaskId(taskId);
return true;
}
protected Boolean handleFinish(CommandService commandService, Long taskId) {
commandService.removeCommandsByTaskId(taskId);
return true;
}
protected Boolean handleFailed(CommandService commandService, Long taskId) {
commandService.removeCommandsByTaskId(taskId);
return true;
}
private Boolean handleJudgedTaskStart(CommandService commandService, TaskService taskService, Long taskId) {
return true;
}
private Boolean handleDynamicTaskStart(CommandService commandService, TaskService taskService, Long taskId) {
return true;
}
private Boolean handleStaticTaskStart(CommandService commandService, TaskService taskService, Long taskId) throws DorisStartException {
// 如果未能获取staticTaskCommandInfos需要报错
List<TaskCommandInfo> staticTaskCommandInfos = taskService.getStaticCommandInfos(taskId);
if (staticTaskCommandInfos == null || staticTaskCommandInfos.isEmpty()) {
throw new IllegalArgumentException("static rules are empty, need to choose at least one static rule");
}
try {
commandService.createCommands(staticTaskCommandInfos);
} catch (DorisStartException e) {
e.taskId = taskId;
throw e;
}
return true;
}
}

View File

@@ -0,0 +1,20 @@
package com.realtime.protection.server.task.status.states;
import com.realtime.protection.configuration.exception.DorisStartException;
import com.realtime.protection.configuration.utils.enums.StateEnum;
import com.realtime.protection.configuration.utils.status.State;
import com.realtime.protection.server.command.CommandService;
import com.realtime.protection.server.task.TaskService;
import com.realtime.protection.server.task.status.StateHandler;
public class FailedState extends StateHandler implements State {
@Override
public Boolean handle(State newState, CommandService commandService, TaskService taskService, Long taskId) throws DorisStartException {
return switch (StateEnum.getStateEnumByState(newState)) {
case RUNNING -> handleStart(taskService, commandService, taskId);
case STOP -> handleStop(commandService, taskId);
case FAILED -> true;
default -> throw new IllegalStateException("Unexpected value: " + StateEnum.getStateEnumByState(newState));
};
}
}

View File

@@ -0,0 +1,12 @@
package com.realtime.protection.server.task.status.states;
import com.realtime.protection.configuration.utils.status.State;
import com.realtime.protection.server.command.CommandService;
import com.realtime.protection.server.task.TaskService;
public class FinishedState implements State {
@Override
public Boolean handle(State newState, CommandService commandService, TaskService taskService, Long taskId) {
return newState instanceof FinishedState;
}
}

View File

@@ -0,0 +1,20 @@
package com.realtime.protection.server.task.status.states;
import com.realtime.protection.configuration.utils.enums.StateEnum;
import com.realtime.protection.configuration.utils.status.State;
import com.realtime.protection.server.command.CommandService;
import com.realtime.protection.server.task.TaskService;
import com.realtime.protection.server.task.status.StateHandler;
public class PauseState extends StateHandler implements State {
@Override
public Boolean handle(State newState, CommandService commandService, TaskService taskService, Long taskId) {
return switch (StateEnum.getStateEnumByState(newState)) {
case RUNNING -> handleResume(commandService, taskId);
case STOP -> handleStop(commandService, taskId);
case FINISHED -> handleFinish(commandService, taskId);
case FAILED -> handleFailed(commandService, taskId);
default -> throw new IllegalStateException("Unexpected value: " + StateEnum.getStateEnumByState(newState));
};
}
}

View File

@@ -0,0 +1,19 @@
package com.realtime.protection.server.task.status.states;
import com.realtime.protection.configuration.exception.DorisStartException;
import com.realtime.protection.configuration.utils.enums.StateEnum;
import com.realtime.protection.configuration.utils.status.State;
import com.realtime.protection.server.command.CommandService;
import com.realtime.protection.server.task.TaskService;
import com.realtime.protection.server.task.status.StateHandler;
public class PendingState extends StateHandler implements State {
@Override
public Boolean handle(State newState, CommandService commandService, TaskService taskService, Long taskId) throws DorisStartException {
return switch (StateEnum.getStateEnumByState(newState)) {
case RUNNING -> handleStart(taskService, commandService, taskId);
case FAILED -> handleFailed(commandService, taskId);
default -> throw new IllegalStateException("Unexpected value: " + StateEnum.getStateEnumByState(newState));
};
}
}

View File

@@ -0,0 +1,21 @@
package com.realtime.protection.server.task.status.states;
import com.realtime.protection.configuration.utils.enums.StateEnum;
import com.realtime.protection.configuration.utils.status.State;
import com.realtime.protection.server.command.CommandService;
import com.realtime.protection.server.task.TaskService;
import com.realtime.protection.server.task.status.StateHandler;
public class RunningState extends StateHandler implements State {
@Override
public Boolean handle(State newState, CommandService commandService, TaskService taskService, Long taskId) {
return switch(StateEnum.getStateEnumByState(newState)) {
case RUNNING -> true;
case PAUSED -> handlePause(commandService, taskId);
case STOP -> handleStop(commandService, taskId);
case FINISHED -> handleFinish(commandService, taskId);
case FAILED -> handleFailed(commandService, taskId);
default -> throw new IllegalStateException("Unexpected value: " + StateEnum.getStateEnumByState(newState));
};
}
}

View File

@@ -0,0 +1,20 @@
package com.realtime.protection.server.task.status.states;
import com.realtime.protection.configuration.exception.DorisStartException;
import com.realtime.protection.configuration.utils.enums.StateEnum;
import com.realtime.protection.configuration.utils.status.State;
import com.realtime.protection.server.command.CommandService;
import com.realtime.protection.server.task.TaskService;
import com.realtime.protection.server.task.status.StateHandler;
public class StopState extends StateHandler implements State {
@Override
public Boolean handle(State newState, CommandService commandService, TaskService taskService, Long taskId) throws DorisStartException {
return switch (StateEnum.getStateEnumByState(newState)) {
case RUNNING -> handleStart(taskService, commandService, taskId);
case FAILED -> handleFailed(commandService, taskId);
default -> throw new IllegalStateException("Unexpected value: " + StateEnum.getStateEnumByState(newState));
};
}
}

View File

@@ -7,7 +7,6 @@ import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@@ -40,6 +39,7 @@ public class WhiteListController {
new WhiteListDataListener(whiteListService)).sheet().doRead();
return ResponseResult.ok();
}
//下载模板文件
@GetMapping("/download")
public void downloadTemplate(HttpServletResponse response) throws IOException {
@@ -54,10 +54,10 @@ public class WhiteListController {
}
@RequestMapping("/query")
public ResponseResult queryWhiteListObject(@RequestParam(value = "whiteobj_name", required = false)String whiteListName,
@RequestParam(value = "page_size", required = false)Integer whiteListId,
@RequestParam(value = "page", defaultValue = "1")Integer page,
@RequestParam(value = "page_size", defaultValue = "10")Integer pageSize) {
public ResponseResult queryWhiteListObject(@RequestParam(value = "whiteobj_name", required = false) String whiteListName,
@RequestParam(value = "page_size", required = false) Integer whiteListId,
@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "page_size", defaultValue = "10") Integer pageSize) {
if (page <= 0 || pageSize <= 0) {
return new ResponseResult(400, "page or page_size is invalid")
.setData("whiteobj_list", null);
@@ -103,7 +103,7 @@ public class WhiteListController {
}
@PostMapping("/delete")
public ResponseResult deleteWhiteListObjects( @RequestBody List<Integer> whiteListObjIds) {
public ResponseResult deleteWhiteListObjects(@RequestBody List<Integer> whiteListObjIds) {
//Post不支持body为json。。。 body只能是[9,10]
return ResponseResult.ok()
@@ -111,7 +111,7 @@ public class WhiteListController {
.setData("success", whiteListService.deleteWhiteListObjects(whiteListObjIds));
}
@PostMapping ("/{id}/update")
@PostMapping("/{id}/update")
public ResponseResult updateWhiteListObject(@PathVariable Integer id,
@RequestBody WhiteListObject object) {
object.setWhiteListId(id);
@@ -124,7 +124,6 @@ public class WhiteListController {
}
//查询ip是否存在于白名单
@PostMapping("/exist")
public ResponseResult existWhiteListObject(@RequestBody List<Integer> ruleIds) {
@@ -155,5 +154,4 @@ public class WhiteListController {
}
}

View File

@@ -5,12 +5,11 @@ import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.realtime.protection.configuration.entity.whitelist.WhiteListObject;
import lombok.extern.slf4j.Slf4j;
//import com.alibaba.fastjson2.JSON;
import java.util.List;
@Slf4j
public class WhiteListDataListener implements ReadListener<WhiteListObject> {
public class WhiteListDataListener implements ReadListener<WhiteListObject> {
private static final int batchCount = 100;
private final List<WhiteListObject> cachedDataList = ListUtils.newArrayListWithExpectedSize(batchCount);

View File

@@ -13,23 +13,26 @@ public interface WhiteListMapper {
//新建
void newWhiteListObject(@Param("object") WhiteListObject object);
//分页查询
List<WhiteListObject> queryWhiteListObject(String whiteListName, Integer whiteListId, Integer page, Integer pageSize);
//根据主键查询
WhiteListObject queryWhiteListObjectById(Integer id);
//根据主键删除
@Delete("delete from t_white_list where white_list_id = #{id}")
Integer deleteWhiteListObject(Integer id);
Integer updateWhiteListObject(@Param("object") WhiteListObject object);
String existWhiteListObject(@Param("staticRuleObject")StaticRuleObject staticRuleObject);
String existWhiteListObject(@Param("staticRuleObject") StaticRuleObject staticRuleObject);
Integer queryWhiteListObjectAuditStuatusById(Integer id);
Boolean updateWhiteListObjectAuditStatus(Integer id, Integer status);
void newWhiteListObjects(@Param("whiteListObjects")List<WhiteListObject> whiteListBatch);
void newWhiteListObjects(@Param("whiteListObjects") List<WhiteListObject> whiteListBatch);
void deleteWhiteListObjects(@Param("whiteListIds") List<Integer> whiteListBatch);
}

View File

@@ -3,8 +3,8 @@ package com.realtime.protection.server.whitelist;
import com.alibaba.excel.util.ListUtils;
import com.realtime.protection.configuration.entity.rule.staticrule.StaticRuleObject;
import com.realtime.protection.configuration.entity.whitelist.WhiteListObject;
import com.realtime.protection.configuration.utils.status.AuditStatusValidator;
import com.realtime.protection.configuration.utils.SqlSessionWrapper;
import com.realtime.protection.configuration.utils.status.AuditStatusValidator;
import com.realtime.protection.server.rule.staticrule.StaticRuleMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -38,6 +38,7 @@ public class WhiteListService {
return object.getWhiteListId();
}
//批量新建多个whitelist
public Boolean newWhiteListObjects(List<WhiteListObject> whiteListObjectList) {
Function<WhiteListMapper, Function<List<WhiteListObject>, Boolean>> newWhiteListObjectFunction =

View File

@@ -1,6 +1,10 @@
server:
port: 8080
logging:
level:
com.realtime.protection: debug
spring:
datasource:
dynamic:
@@ -12,17 +16,10 @@ spring:
url: jdbc:mysql://192.168.107.89:3306/realtime_protection
hikari:
is-auto-commit: false
oracle:
driver-class-name: oracle.jdbc.driver.OracleDriver
username: z2_509pz
password: 123
url: jdbc:oracle:thin:@//10.26.22.45:1521/ORCL
hikari:
is-auto-commit: false
doris:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
url: jdbc:mysql://10.26.22.133:9030
url: jdbc:mysql://10.26.22.133:9030/command
hikari:
is-auto-commit: false
aop:

View File

@@ -0,0 +1,37 @@
server:
port: 80
logging:
level:
com.realtime.protection: warning
spring:
datasource:
dynamic:
datasource:
mysql:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: aiihhbfcsy123!@#
url: jdbc:mysql://192.168.107.89:3306/realtime_protection
hikari:
is-auto-commit: false
doris:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
url: jdbc:mysql://10.26.22.133:9030/command
hikari:
is-auto-commit: false
aop:
enabled: true
primary: mysql
strict: true
grace-destroy: true
mvc:
servlet:
path: /api/v1
jackson:
default-property-inclusion: non_null
mybatis:
mapper-locations: classpath:mappers/*

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.realtime.protection.server.command.CommandMapper">
<insert id="createCommand" parameterType="com.realtime.protection.configuration.entity.task.Command">
insert into t_command(COMMAND_ID, ADDR_TYPE, SRC_IP, SRC_PORT, DST_IP, DST_PORT, PROTOCOL, MASK_SRC_IP, MASK_SRC_PORT,
MASK_DST_IP, MASK_DST_PORT, IS_VALID, VALID_TIME, INVALID_TIME, IS_SENT,
CREATE_TIME, LAST_UPDATE, IS_DELETED, TASK_ID)
values (UUID(), DEFAULT,
#{command.fiveTupleWithMask.sourceIP},
#{command.fiveTupleWithMask.sourcePort}, #{command.fiveTupleWithMask.destinationIP},
#{command.fiveTupleWithMask.destinationPort},
#{command.fiveTupleWithMask.protocolNum}, #{command.fiveTupleWithMask.maskSourceIP},
#{command.fiveTupleWithMask.maskSourcePort},
#{command.fiveTupleWithMask.maskDestinationIP}, #{command.fiveTupleWithMask.maskDestinationPort}, TRUE,
#{command.validTime}, #{command.invalidTime}, FALSE, NOW(), NOW(), FALSE, #{command.taskId})
</insert>
<insert id="createCommands" parameterType="com.realtime.protection.configuration.entity.task.Command">
insert into t_command(COMMAND_ID, ADDR_TYPE, SRC_IP, SRC_PORT, DST_IP, DST_PORT, PROTOCOL, MASK_SRC_IP, MASK_SRC_PORT,
MASK_DST_IP, MASK_DST_PORT, IS_VALID, VALID_TIME, INVALID_TIME, IS_SENT,
CREATE_TIME, LAST_UPDATE, IS_DELETED, TASK_ID)
values
<foreach collection="commands" item="command" separator=",">
(UUID(), DEFAULT,
#{command.fiveTupleWithMask.sourceIP},
#{command.fiveTupleWithMask.sourcePort}, #{command.fiveTupleWithMask.destinationIP},
#{command.fiveTupleWithMask.destinationPort},
#{command.fiveTupleWithMask.protocolNum}, #{command.fiveTupleWithMask.maskSourceIP},
#{command.fiveTupleWithMask.maskSourcePort},
#{command.fiveTupleWithMask.maskDestinationIP}, #{command.fiveTupleWithMask.maskDestinationPort}, TRUE,
#{command.validTime}, #{command.invalidTime}, FALSE, NOW(), NOW(), FALSE, #{command.taskId})
</foreach>
</insert>
<update id="stopCommandsByTaskId">
UPDATE t_command
SET IS_VALID = FALSE
WHERE TASK_ID = #{task_id} AND IS_DELETED = FALSE
</update>
<update id="startCommandsByTaskId">
UPDATE t_command
SET IS_VALID = TRUE
WHERE TASK_ID = #{task_id} AND IS_DELETED = FALSE
</update>
<update id="removeCommandsByTaskId">
UPDATE t_command
SET IS_DELETED = TRUE
WHERE TASK_ID = #{task_id}
</update>
</mapper>
<!--
-->

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.realtime.protection.server.task.state.StateMapper">
<insert id="sendCommand" useGeneratedKeys="true" keyProperty="id">
</insert>
</mapper>

View File

@@ -17,9 +17,7 @@
<update id="newTaskStaticRuleConcat">
UPDATE t_static_rule
<set>
<if test="task_id != null">static_rule_used_task_id = #{task_id},</if>
</set>
SET static_rule_used_task_id = #{task_id}
<where>
<if test="rule_ids != null and rule_ids.size() > 0">
AND static_rule_id IN
@@ -32,9 +30,7 @@
<update id="newTaskDynamicRuleConcat">
UPDATE t_dynamic_rule
<set>
<if test="task_id != null">dynamic_rule_used_task_id = #{task_id},</if>
</set>
SET dynamic_rule_used_task_id = #{task_id}
<where>
<if test="rule_ids != null and rule_ids.size() > 0">
AND dynamic_rule_id IN
@@ -97,22 +93,34 @@
WHERE t_task.task_id = #{task_id}
</select>
<select id="queryTaskAuditStatus" resultType="java.lang.Integer">
SELECT task_audit_status
FROM t_task
WHERE task_id = #{task_id}
</select>
<select id="queryTaskStatus" resultType="java.lang.Integer">
SELECT task_status
FROM t_task
WHERE task_id = #{task_id}
</select>
<update id="updateTask">
UPDATE t_task
<set>
<if test="task.taskName != null">task_name = #{task.taskName},</if>
<if test="task.taskType != null">task_type = #{task.taskType},</if>
<if test="task.taskAct != null">task_act = #{task.taskAct},</if>
<if test="task.taskCreateTime != null">task_create_time = #{task.taskCreateTime},</if>
<if test="task.taskStartTime != null">task_start_time = #{task.taskStartTime},</if>
<if test="task.taskEndTime != null">task_end_time = #{task.taskEndTime},</if>
task_modify_time = NOW()
task_modify_time = NOW(),
</set>
WHERE task_id = #{task.taskId}
</update>
<update id="clearTaskConnectedStaticRule">
UPDATE t_static_rule
SET static_rule_used_task_id = null
SET static_rule_used_task_id = null, static_rule_modify_time = NOW()
WHERE static_rule_used_task_id = #{task_id}
</update>
@@ -124,7 +132,13 @@
<update id="changeTaskAuditStatus">
UPDATE t_task
SET task_audit_status = #{audit_status}
SET task_audit_status = #{audit_status}, task_modify_time = NOW()
WHERE task_id = #{task_id}
</update>
<update id="changeTaskStatus">
UPDATE t_task
SET task_status = #{state}, task_modify_time = NOW()
WHERE task_id = #{task_id}
</update>
@@ -132,4 +146,47 @@
DELETE FROM t_task
WHERE task_id = #{task_id}
</delete>
<resultMap id="staticCommandMap" type="com.realtime.protection.configuration.entity.task.TaskCommandInfo">
<result column="task_act" property="operation"/>
<result column="task_id" property="taskId"/>
<result column="static_rule_id" property="ruleId"/>
<result column="static_rule_frequency" property="frequency"/>
<result column="task_start_time" property="startTime"/>
<result column="task_end_time" property="endTime"/>
<association property="fiveTupleWithMask">
<result column="addr_type" property="addrType"/>
<result column="static_rule_sip" property="sourceIP"/>
<result column="static_rule_sport" property="sourcePort"/>
<result column="static_rule_dip" property="destinationIP"/>
<result column="static_rule_dport" property="destinationPort"/>
<result column="static_rule_protocol" property="protocol"/>
<result column="static_rule_msip" property="maskSourceIP"/>
<result column="static_rule_msport" property="maskSourcePort"/>
<result column="static_rule_mdip" property="maskDestinationIP"/>
<result column="static_rule_mdport" property="maskDestinationPort"/>
</association>
</resultMap>
<select id="getStaticCommands" resultMap="staticCommandMap">
SELECT t_task.task_id,
tsr.static_rule_id,
t_task.task_act,
t_task.task_start_time,
t_task.task_end_time,
INET_NTOA(tsr.static_rule_sip) as static_rule_sip,
tsr.static_rule_sport,
INET_NTOA(tsr.static_rule_dip) as static_rule_dip,
tsr.static_rule_dport,
tsr.static_rule_protocol,
INET_NTOA(tsr.static_rule_msip) as static_rule_msip,
tsr.static_rule_msport,
INET_NTOA(tsr.static_rule_mdip) as static_rule_mdip,
tsr.static_rule_mdport,
tsr.static_rule_frequency
FROM t_task
LEFT JOIN realtime_protection.t_static_rule tsr on t_task.task_id = tsr.static_rule_used_task_id
WHERE task_id = #{task_id} AND tsr.static_rule_audit_status = 2
</select>
</mapper>

View File

@@ -27,46 +27,48 @@
<resultMap id="templateMap" type="com.realtime.protection.configuration.entity.defense.template.Template">
<id column="strategy_template_id" property="templateId"/>
<result column="strategy_template_name" property="templateName"/>
<result column="strategy_template_used_times" property="templateUsedTimes"/>
<result column="strategy_template_running_tasks" property="templateRunningTasks"/>
<result column="strategy_template_low_level_id" property="protectLevelLow.protectLevelId"/>
<result column="strategy_template_medium_level_id" property="protectLevelMedium.protectLevelId"/>
<result column="strategy_template_high_level_id" property="protectLevelHigh.protectLevelId"/>
<result column="strategy_template_used_times" property="usedTimes"/>
<result column="strategy_template_running_tasks" property="runningTasks"/>
<association property="protectLevelLow"
javaType="com.realtime.protection.configuration.entity.defense.template.ProtectLevel">
<id column="protect_level_id" property="protectLevelId"/>
<result column="has_protect_object_ip" property="hasProtectObjectIP"/>
<result column="has_protect_object_port" property="hasProtectObjectPort"/>
<result column="has_peer_ip" property="hasPeerIP"/>
<result column="has_peer_port" property="hasPeerPort"/>
<result column="has_protocol" property="hasProtocol"/>
<result column="has_url" property="hasURL"/>
<result column="has_dns" property="hasDNS"/>
<id column="low_protect_level_id" property="protectLevelId"/>
<result column="low_has_protect_object_ip" property="hasProtectObjectIP"/>
<result column="low_has_protect_object_port" property="hasProtectObjectPort"/>
<result column="low_has_peer_ip" property="hasPeerIP"/>
<result column="low_has_peer_port" property="hasPeerPort"/>
<result column="low_has_protocol" property="hasProtocol"/>
<result column="low_has_url" property="hasURL"/>
<result column="low_has_dns" property="hasDNS"/>
</association>
<association property="protectLevelMedium"
javaType="com.realtime.protection.configuration.entity.defense.template.ProtectLevel">
<id column="protect_level_id" property="protectLevelId"/>
<result column="has_protect_object_ip" property="hasProtectObjectIP"/>
<result column="has_protect_object_port" property="hasProtectObjectPort"/>
<result column="has_peer_ip" property="hasPeerIP"/>
<result column="has_peer_port" property="hasPeerPort"/>
<result column="has_protocol" property="hasProtocol"/>
<result column="has_url" property="hasURL"/>
<result column="has_dns" property="hasDNS"/>
<id column="medium_protect_level_id" property="protectLevelId"/>
<result column="medium_has_protect_object_ip" property="hasProtectObjectIP"/>
<result column="medium_has_protect_object_port" property="hasProtectObjectPort"/>
<result column="medium_has_peer_ip" property="hasPeerIP"/>
<result column="medium_has_peer_port" property="hasPeerPort"/>
<result column="medium_has_protocol" property="hasProtocol"/>
<result column="medium_has_url" property="hasURL"/>
<result column="medium_has_dns" property="hasDNS"/>
</association>
<association property="protectLevelHigh"
javaType="com.realtime.protection.configuration.entity.defense.template.ProtectLevel">
<id column="protect_level_id" property="protectLevelId"/>
<result column="has_protect_object_ip" property="hasProtectObjectIP"/>
<result column="has_protect_object_port" property="hasProtectObjectPort"/>
<result column="has_peer_ip" property="hasPeerIP"/>
<result column="has_peer_port" property="hasPeerPort"/>
<result column="has_protocol" property="hasProtocol"/>
<result column="has_url" property="hasURL"/>
<result column="has_dns" property="hasDNS"/>
<id column="high_protect_level_id" property="protectLevelId"/>
<result column="high_has_protect_object_ip" property="hasProtectObjectIP"/>
<result column="high_has_protect_object_port" property="hasProtectObjectPort"/>
<result column="high_has_peer_ip" property="hasPeerIP"/>
<result column="high_has_peer_port" property="hasPeerPort"/>
<result column="high_has_protocol" property="hasProtocol"/>
<result column="high_has_url" property="hasURL"/>
<result column="high_has_dns" property="hasDNS"/>
</association>
</resultMap>
@@ -82,17 +84,10 @@
</resultMap>
<select id="queryTemplates" resultMap="templateMap">
<!-- 关联查询 -->
SELECT * FROM t_strategy_template AS tst
LEFT JOIN realtime_protection.t_protect_level low_tpl on low_tpl.protect_level_id =
tst.strategy_template_low_level_id
LEFT JOIN realtime_protection.t_protect_level medium_tpl on medium_tpl.protect_level_id =
tst.strategy_template_medium_level_id
LEFT JOIN realtime_protection.t_protect_level high_tpl on high_tpl.protect_level_id =
tst.strategy_template_high_level_id
SELECT * FROM template_view
<where>
<if test="template_name != null">
AND tst.strategy_template_name LIKE CONCAT('%', #{template_name}, '%')
AND strategy_template_name LIKE CONCAT('%', #{template_name}, '%')
</if>
</where>
LIMIT ${(page - 1) * page_size}, #{page_size}
@@ -115,10 +110,4 @@
AND strategy_template_id = #{template.templateId}
</where>
</update>
<update id="addTemplateUsedTimes">
UPDATE t_strategy_template
SET strategy_template_used_times = strategy_template_used_times + #{add_times}
WHERE strategy_template_id = #{template_id}
</update>
</mapper>

View File

@@ -2,6 +2,7 @@ package com.realtime.protection.server.defense.template;
import com.realtime.protection.configuration.entity.defense.template.ProtectLevel;
import com.realtime.protection.configuration.entity.defense.template.Template;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -16,6 +17,8 @@ class TemplateServiceTest {
private final TemplateService templateService;
private Template template;
private Long startTime;
@Autowired
TemplateServiceTest(TemplateService templateService) {
@@ -42,6 +45,14 @@ class TemplateServiceTest {
template.setProtectLevelLow(protectLevelLow);
template.setProtectLevelMedium(protectLevelMedium);
template.setProtectLevelHigh(protectLevelHigh);
startTime = System.currentTimeMillis();
}
@AfterEach
void summary() {
Long endTime = System.currentTimeMillis();
System.out.printf("total time: %d ms", endTime - startTime);
}
@Test
@@ -56,6 +67,8 @@ class TemplateServiceTest {
assertEquals(5, templates.size());
for (Template template : templates) {
assertTrue(template.getTemplateId() > 0);
assertNotNull(template.getTemplateRunningTasks());
assertNotNull(template.getTemplateUsedTimes());
}
}
@@ -68,16 +81,4 @@ class TemplateServiceTest {
assertTrue(templateService.updateTemplate(testTemplate.getTemplateId(), testTemplate));
}
@Test
void testAddTemplateUsedTimes() {
template.setTemplateName("add test");
templateService.newTemplate(template);
List<Template> templates = templateService.queryTemplates("add", 1, 1);
Template originalTemplate = templates.get(0);
Boolean success = templateService.addTemplateUsedTimes(originalTemplate.getTemplateId(), 4);
templates = templateService.queryTemplates("add", 1, 1);
assertEquals(originalTemplate.getTemplateUsedTimes() + 4, templates.get(0).getTemplateUsedTimes());
assertTrue(success);
}
}

View File

@@ -1,5 +1,6 @@
package com.realtime.protection.server.task;
import com.realtime.protection.configuration.entity.task.TaskCommandInfo;
import com.realtime.protection.configuration.entity.task.Task;
import org.apache.ibatis.exceptions.PersistenceException;
import org.junit.jupiter.api.BeforeEach;
@@ -27,31 +28,37 @@ class TaskServiceTest {
this.task = new Task();
task.setTaskName("静态测试");
LocalDateTime taskStartTime = LocalDateTime.parse("2023-12-24T11:45:14");
LocalDateTime taskEndTime = LocalDateTime.parse("2023-12-29T11:45:12");
LocalDateTime taskStartTime = LocalDateTime.now().plusDays(1);
LocalDateTime taskEndTime = LocalDateTime.now().plusDays(5);
task.setTaskStartTime(taskStartTime);
task.setTaskEndTime(taskEndTime);
task.setTaskAct("阻断");
task.setTaskType("静态任务");
task.setStaticRuleIds(List.of(1, 2));
task.setTaskType(1);
task.setStaticRuleIds(List.of(1L, 2L));
task.setDynamicRuleIds(List.of());
task.setTaskCreateUserId(1);
task.setTaskCreateUserId(1L);
task.setTaskCreateUsername("xxx");
task.setTaskCreateDepart("xxx");;
task.setTaskCreateDepart("xxx");
}
@Test
void testNewTaskSuccess() {
assertDoesNotThrow(() -> {Integer taskId = taskService.newTask(task); assertTrue(taskId > 0);});
assertTrue(task.getTaskId() > 0);
for (int i = 0; i < 100; i++){
LocalDateTime taskStartTime = LocalDateTime.now().plusDays(i);
LocalDateTime taskEndTime = LocalDateTime.now().plusDays(i+10);
task.setTaskStartTime(taskStartTime);
task.setTaskEndTime(taskEndTime);
assertDoesNotThrow(() -> {Long taskId = taskService.newTask(task); assertTrue(taskId > 0);});
assertTrue(task.getTaskId() > 0);
}
}
@Test
void testNewTaskLostData() {
this.task.setTaskStartTime(null);
assertThrows(PersistenceException.class, () -> {
Integer taskId = taskService.newTask(task);
Long taskId = taskService.newTask(task);
assertTrue(taskId > 0);
});
}
@@ -64,30 +71,37 @@ class TaskServiceTest {
@Test
void testUpdateTasks() {
task.setStaticRuleIds(List.of(6, 7, 8));
task.setTaskId(26);
task.setTaskName("修改测试");
Task originalTask = taskService.queryTask(38L);
assertTrue(taskService.updateTask(task));
assertEquals("修改测试", taskService.queryTask(26).getTaskName());
originalTask.setStaticRuleIds(List.of(16L, 17L, 18L, 19L));
originalTask.setTaskName("修改测试");
assertTrue(taskService.updateTask(originalTask));
assertEquals("修改测试", taskService.queryTask(38L).getTaskName());
}
@Test
void testDeleteTask() {
int testNum = taskService.queryTasks(null, null, null, null, 1, 10)
long testNum = taskService.queryTasks(null, null, null, null, 1, 10)
.get(0).getTaskId();
assertTrue(taskService.deleteTask(testNum));
assertFalse(taskService.deleteTask(235235));
assertFalse(taskService.deleteTask(235235L));
}
@Test
void testChangeAuditStatus() {
int testNum = taskService.queryTasks(null, null, null, null, 1, 1)
long testNum = taskService.queryTasks(null, null, null, null, 1, 1)
.get(0).getTaskId();
assertTrue(taskService.changeTaskAuditStatus(testNum, 2));
assertFalse(taskService.changeTaskAuditStatus(testNum, 0));
assertFalse(taskService.changeTaskAuditStatus(testNum, 1));
}
@Test
void testGetStaticCommands() {
List<TaskCommandInfo> taskCommandInfos = taskService.getStaticCommandInfos(26L);
assertEquals(3, taskCommandInfos.size());
}
}

View File

@@ -0,0 +1,78 @@
package com.realtime.protection.server.task.status;
import com.realtime.protection.configuration.entity.task.TaskCommandInfo;
import com.realtime.protection.configuration.entity.task.Command;
import com.realtime.protection.configuration.entity.task.FiveTupleWithMask;
import com.realtime.protection.server.command.CommandService;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class CommandServiceTest {
private final CommandService commandService;
private TaskCommandInfo taskCommandInfo;
private Command command;
private Long startTime;
@Autowired
CommandServiceTest(CommandService commandService) {
this.commandService = commandService;
}
@BeforeEach
void mockCommand() {
FiveTupleWithMask fiveTupleWithMask = new FiveTupleWithMask();
fiveTupleWithMask.setMaskSourceIP("192.168.155.24");
taskCommandInfo = new TaskCommandInfo();
taskCommandInfo.setFrequency(30);
taskCommandInfo.setTaskId(30L);
taskCommandInfo.setFiveTupleWithMask(fiveTupleWithMask);
taskCommandInfo.setOperation("阻断");
taskCommandInfo.setEndTime(LocalDateTime.now().plusDays(1));
startTime = System.currentTimeMillis();
}
@AfterEach
void summary() {
Long endTime = System.currentTimeMillis();
System.out.printf("total time: %d ms", endTime - startTime);
}
@Test
void createCommand() {
assertDoesNotThrow(() -> commandService.createCommand(taskCommandInfo));
}
@Test
void createCommands() {
List<TaskCommandInfo> taskCommandInfos = new ArrayList<>();
for (int i = 0; i < 100; i++) {
int port = i + 1000;
taskCommandInfo = new TaskCommandInfo();
taskCommandInfo.setFiveTupleWithMask(new FiveTupleWithMask());
taskCommandInfo.setTaskId(24L);
taskCommandInfo.getFiveTupleWithMask().setSourcePort(Integer.toString(port));
taskCommandInfo.setStartTime(LocalDateTime.now().plusDays(5));
taskCommandInfo.setEndTime(LocalDateTime.now().plusDays(10));
taskCommandInfo.setFrequency(20);
taskCommandInfos.add(taskCommandInfo);
}
assertDoesNotThrow(() -> commandService.createCommands(taskCommandInfos));
}
}