diff --git a/src/main/java/com/realtime/protection/configuration/entity/task/Task.java b/src/main/java/com/realtime/protection/configuration/entity/task/Task.java index 00f9dc5..c0f5115 100644 --- a/src/main/java/com/realtime/protection/configuration/entity/task/Task.java +++ b/src/main/java/com/realtime/protection/configuration/entity/task/Task.java @@ -152,5 +152,7 @@ public class Task { @Schema(description = "审核意见", example = "审核不同意", accessMode = Schema.AccessMode.READ_ONLY) private String auditInfo; - + @JsonProperty("task_ip_num") + @Schema(description = "任务涉及ip数量", example = "1000", accessMode = Schema.AccessMode.READ_ONLY) + private Integer taskIpNum; } diff --git a/src/main/java/com/realtime/protection/configuration/entity/task/TaskCommandInfo.java b/src/main/java/com/realtime/protection/configuration/entity/task/TaskCommandInfo.java index 21729ec..401e90d 100644 --- a/src/main/java/com/realtime/protection/configuration/entity/task/TaskCommandInfo.java +++ b/src/main/java/com/realtime/protection/configuration/entity/task/TaskCommandInfo.java @@ -127,6 +127,8 @@ public class TaskCommandInfo { @Schema(description = "目的ip整数形式", accessMode = Schema.AccessMode.READ_ONLY) private Long dipInt; + private Long rcpHitCount; + // private String hashValue; diff --git a/src/main/java/com/realtime/protection/configuration/utils/Subnet.java b/src/main/java/com/realtime/protection/configuration/utils/Subnet.java new file mode 100644 index 0000000..90486bf --- /dev/null +++ b/src/main/java/com/realtime/protection/configuration/utils/Subnet.java @@ -0,0 +1,78 @@ +package com.realtime.protection.configuration.utils; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +public class Subnet { + public final String ip; + public final String subnetMask; + public final long startIp; + public final long endIp; + public final int numberOfHosts; + + public Subnet(String ip, String subnetMask) throws UnknownHostException { + this.ip = ip; + this.subnetMask = subnetMask; + this.startIp = calculateStartIp(ip, subnetMask); + this.endIp = calculateEndIp(startIp, subnetMask); + this.numberOfHosts = getNumberOfHosts(subnetMask); + } + + private static long ipToLong(String ip) throws UnknownHostException { + InetAddress inetAddress = InetAddress.getByName(ip); + byte[] bytes = inetAddress.getAddress(); + long result = 0; + for (byte b : bytes) { + result = (result << 8) | (b & 0xFF); + } + return result; + } + + private long calculateStartIp(String ip, String subnetMask) throws UnknownHostException { + long ipLong = ipToLong(ip); + long maskLong = ipToLong(subnetMask); + return ipLong & maskLong; + } + + private long calculateEndIp(long startIp, String subnetMask) throws UnknownHostException { + long maskLong = ipToLong(subnetMask); + long hostPart = ~maskLong & 0xFFFFFFFFL; + return startIp + hostPart; + } + + public static int getNumberOfHosts(String subnetMask) throws UnknownHostException { + long maskLong = ipToLong(subnetMask); + long hostPart = ~maskLong & 0xFFFFFFFFL; + return (int) (hostPart + 1); + } + + public boolean overlapsWith(Subnet other) { + return this.startIp <= other.endIp && other.startIp <= this.endIp; + } + + public Subnet mergeWith(Subnet other) throws UnknownHostException { + long newStartIp = Math.min(this.startIp, other.startIp); + long newEndIp = Math.max(this.endIp, other.endIp); + long newRange = newEndIp - newStartIp + 1; + int newPrefixLength = 32 - Integer.numberOfTrailingZeros((int) newRange); + long mask = 0xFFFFFFFFL << (32 - newPrefixLength); + long newNetworkIp = newStartIp & mask; + String newSubnetMask = longToIp(mask); + return new Subnet(longToIp(newNetworkIp), newSubnetMask); + } + + private String longToIp(long value) { + return ((value >> 24) & 0xFF) + "." + ((value >> 16) & 0xFF) + "." + ((value >> 8) & 0xFF) + "." + (value & 0xFF); + } + + @Override + public String toString() { + return "Subnet{" + + "ip='" + ip + '\'' + + ", subnetMask='" + subnetMask + '\'' + + ", startIp=" + longToIp(startIp) + + ", endIp=" + longToIp(endIp) + + ", numberOfHosts=" + numberOfHosts + + '}'; + } +} diff --git a/src/main/java/com/realtime/protection/server/command/CommandMapper.java b/src/main/java/com/realtime/protection/server/command/CommandMapper.java index 2f2c910..93b7860 100644 --- a/src/main/java/com/realtime/protection/server/command/CommandMapper.java +++ b/src/main/java/com/realtime/protection/server/command/CommandMapper.java @@ -80,5 +80,7 @@ public interface CommandMapper { void insertCommandTrafficBatch(@Param("command_infos")List taskCommandInfoBatch); - Object setCommandValid(String commandId, Integer isValid); + Boolean setCommandValid(String commandId, Integer isValid); + + List queryAllDistributingCommandInfo(); } diff --git a/src/main/java/com/realtime/protection/server/command/CommandService.java b/src/main/java/com/realtime/protection/server/command/CommandService.java index e8132a3..d22a9c1 100644 --- a/src/main/java/com/realtime/protection/server/command/CommandService.java +++ b/src/main/java/com/realtime/protection/server/command/CommandService.java @@ -230,6 +230,11 @@ public class CommandService { return commandMapper.queryCommandInfoByUUID(uuid); } + public List queryAllDistributingCommandInfo() { + return commandMapper.queryAllDistributingCommandInfo(); + } + + public Boolean startCommandsByTaskId(Long taskId) { return commandMapper.startCommandsByTaskId(taskId); } @@ -247,6 +252,8 @@ public class CommandService { //设置指令是否已经研判 Boolean success = commandMapper.setCommandJudged(commandId, isJudged); + //研判状态也写入历史表 + insertCommandHistory(commandId); try { List commandUUIDs = Collections.singletonList(commandId); @@ -302,7 +309,10 @@ public class CommandService { commandMapper.insertCommandHistoryBatch(commandIds); } - public Object setCommandValid(String commandId, Integer isValid) { - return commandMapper.setCommandValid(commandId, isValid); + //指令提前撤回下发 + public Boolean setCommandValid(String commandId, Integer isValid) { + Boolean isture = commandMapper.setCommandValid(commandId, isValid); + insertCommandHistory(commandId); + return isture; } } diff --git a/src/main/java/com/realtime/protection/server/task/TaskController.java b/src/main/java/com/realtime/protection/server/task/TaskController.java index 7d8dc94..3bb1720 100644 --- a/src/main/java/com/realtime/protection/server/task/TaskController.java +++ b/src/main/java/com/realtime/protection/server/task/TaskController.java @@ -92,9 +92,7 @@ public class TaskController implements TaskControllerApi { taskService.eventTypeValid(task); //冲突性 - taskService.chongtuValid(task); - - +// taskService.chongtuValid(task); Long taskId = taskService.newTask(task); @@ -519,6 +517,21 @@ public class TaskController implements TaskControllerApi { .setData("task_id", auditInfo.get("task_id")); } + @Override + @GetMapping("/query/log/status") + public ResponseResult queryTaskStausLog(@RequestParam("id") @Min(1) Long id , + @RequestParam("page") @Min(1) Integer page, + @RequestParam("page_size") @Min(1) Integer pageSize) { + List taskLog = taskService.queryTaskStausLog(id,page,pageSize); + + if (taskLog == null) { + return ResponseResult.invalid().setMessage("无效Task ID,也许该ID对应的任务不存在?"); + } + + return ResponseResult.ok().setData("task_log", taskLog) + .setData("total_num", taskService.queryTaskStausLogTotalNum(id)); + } + } \ No newline at end of file diff --git a/src/main/java/com/realtime/protection/server/task/TaskControllerApi.java b/src/main/java/com/realtime/protection/server/task/TaskControllerApi.java index 29cd3f7..b5696bf 100644 --- a/src/main/java/com/realtime/protection/server/task/TaskControllerApi.java +++ b/src/main/java/com/realtime/protection/server/task/TaskControllerApi.java @@ -988,4 +988,43 @@ public interface TaskControllerApi { @PostMapping("/result/{systemName}") ResponseResult receiveOtherSystemResult(@PathVariable String systemName, @RequestBody Map auditInfo); + + @Operation( + summary = "查询任务历史状态日志", + description = "查询任务历史状态日志", + responses = { + @io.swagger.v3.oas.annotations.responses.ApiResponse( + description = "返回数据", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ResponseResult.class) + ) + ) + }, + requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody( + description = "类比分页查询任务", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = Map.class), + examples = @ExampleObject( + name = "example", + value = """ + { + } + """ + ) + + ) + ), + parameters = { + @Parameter(name = "id", description = "任务id", example = "44047"), + @Parameter(name = "page", description = "页号", example = "1"), + @Parameter(name = "page_size", description = "页大小", example = "5"), + + } + ) + @GetMapping("/query/log/status") + ResponseResult queryTaskStausLog(@RequestParam("id") @Min(1) Long id, + @RequestParam("page") @Min(1) Integer page, + @RequestParam("page_size") @Min(1) Integer pageSize); } diff --git a/src/main/java/com/realtime/protection/server/task/TaskMapper.java b/src/main/java/com/realtime/protection/server/task/TaskMapper.java index 8653551..bfd0317 100644 --- a/src/main/java/com/realtime/protection/server/task/TaskMapper.java +++ b/src/main/java/com/realtime/protection/server/task/TaskMapper.java @@ -16,6 +16,10 @@ import java.util.Map; @Mapper public interface TaskMapper { + + + void setIpTotalNum(@Param("ip_total_num")Long ipTotalNum, @Param("task_id")Long taskId) ; + void newTask(@Param("task") Task task); void newTaskStaticRuleConcat(@Param("task_id") Long taskId, @@ -139,4 +143,8 @@ public interface TaskMapper { File selectFileById(Integer id); List selectFilesByStaticRuleId(Long taskId); + + List queryTaskStausLog(Long id, Integer page, Integer pageSize); + + Integer queryTaskStausLogTotalNum(Long id); } diff --git a/src/main/java/com/realtime/protection/server/task/TaskService.java b/src/main/java/com/realtime/protection/server/task/TaskService.java index 5a50582..dce270c 100644 --- a/src/main/java/com/realtime/protection/server/task/TaskService.java +++ b/src/main/java/com/realtime/protection/server/task/TaskService.java @@ -11,6 +11,7 @@ import com.realtime.protection.configuration.entity.task.TaskCommandInfo; import com.realtime.protection.configuration.utils.Counter; import com.realtime.protection.configuration.utils.File; import com.realtime.protection.configuration.utils.SqlSessionWrapper; +import com.realtime.protection.configuration.utils.Subnet; import com.realtime.protection.configuration.utils.enums.StateEnum; import com.realtime.protection.configuration.utils.enums.TaskTypeEnum; import com.realtime.protection.configuration.utils.enums.audit.AuditStatusEnum; @@ -27,6 +28,7 @@ import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClientResponseException; import reactor.core.publisher.Mono; +import java.net.UnknownHostException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.HashMap; @@ -59,16 +61,54 @@ public class TaskService { this.commandMapper = commandMapper; } + + public static List mergeOverlappingSubnets(List subnets) throws UnknownHostException { + if (subnets.isEmpty()) { + return new ArrayList<>(); + } + + subnets.sort(Comparator.comparingLong(subnet -> subnet.startIp)); + List mergedSubnets = new ArrayList<>(); + Subnet current = subnets.get(0); + + for (int i = 1; i < subnets.size(); i++) { + Subnet next = subnets.get(i); + if (current.overlapsWith(next)) { + current = current.mergeWith(next); + } else { + mergedSubnets.add(current); + current = next; + } + } + mergedSubnets.add(current); + return mergedSubnets; + } + + public Long ipWithMaskToIpNums(List subnets) { + + Long totalIPs = 0L; + try { + List mergedSubnets = mergeOverlappingSubnets(subnets); + for (Subnet subnet : mergedSubnets){ + totalIPs += Subnet.getNumberOfHosts(subnet.subnetMask); + } + +// totalIPs = (long) mergedSubnets.stream().mapToInt(Subnet::getNumberOfHosts).sum(); + log.info("合并后的子网涉及的总IP数量是: " + totalIPs); + + } catch (UnknownHostException e) { + + return null; + } + return totalIPs; + } + + @Transactional public Long newTask(Task task) { - // todo: 目前获取方式还不确定,以后再确定 -// task.setTaskCreateUserId(1); -// task.setTaskCreateUsername("xxx"); -// task.setTaskCreateDepart("xxx"); // eventTypeValid(task); - task.setTaskDisplayId( "RW-" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) @@ -76,6 +116,8 @@ public class TaskService { + String.format("%06d", counter.generateId("task"))); taskMapper.newTask(task); + + List subnetList = new ArrayList<>(); if (task.getStaticRuleIds() != null && !task.getStaticRuleIds().isEmpty()) { staticRuleMapper.queryStaticRuleByIds(task.getStaticRuleIds()).forEach(staticRuleObject -> { if (!staticRuleObject.getAuditStatus().equals(AuditStatusEnum.AUDITED.getNum())) { @@ -84,10 +126,32 @@ public class TaskService { if (staticRuleObject.getStaticRuleUsedTaskId() != null) { throw new IllegalArgumentException("部分静态规则已被其他任务使用"); } + try { + String sip = staticRuleObject.getStaticRuleSip(); + String msip; + if (staticRuleObject.getStaticRuleMsip() != null){ + msip = staticRuleObject.getStaticRuleMsip(); + } + else{ + msip = "255.255.255.255"; + } + String dip = staticRuleObject.getStaticRuleDip(); + String mdip; + if (staticRuleObject.getStaticRuleMdip() != null){ + mdip = staticRuleObject.getStaticRuleMdip(); + } + else{ + mdip = "255.255.255.255"; + } + if (sip != null) subnetList.add(new Subnet(sip,msip)); + if (dip != null) subnetList.add(new Subnet(dip,mdip)); + } catch (UnknownHostException e) { + throw new RuntimeException(e); + } }); taskMapper.newTaskStaticRuleConcat(task.getTaskId(), task.getStaticRuleIds(), AuditStatusEnum.USING.getNum()); } - + if (task.getDynamicRuleIds() != null && !task.getDynamicRuleIds().isEmpty()) { dynamicRuleMapper.queryDynamicRuleByIds(task.getDynamicRuleIds()).forEach(dynamicRuleObject -> { if (!dynamicRuleObject.getAuditStatus().equals(AuditStatusEnum.AUDITED.getNum())) { @@ -113,6 +177,9 @@ public class TaskService { } } + Long ipTotalNum = ipWithMaskToIpNums(subnetList); + taskMapper.setIpTotalNum(ipTotalNum, task.getTaskId()); + //todo 1、存到数据库 2、前端展示。详细信息 insertTaskStatusLog(task.getTaskId()); return task.getTaskId(); } @@ -729,4 +796,11 @@ public class TaskService { } + public List queryTaskStausLog(Long id, Integer page, Integer pageSize) { + return taskMapper.queryTaskStausLog(id,page,pageSize); + } + + public Integer queryTaskStausLogTotalNum(Long id) { + return taskMapper.queryTaskStausLogTotalNum(id); + } } diff --git a/src/main/resources/mappers/CommandMapper.xml b/src/main/resources/mappers/CommandMapper.xml index 4d1ce8f..7b51f89 100644 --- a/src/main/resources/mappers/CommandMapper.xml +++ b/src/main/resources/mappers/CommandMapper.xml @@ -456,6 +456,7 @@ + @@ -465,6 +466,7 @@ + + diff --git a/src/main/resources/mappers/TaskMapper.xml b/src/main/resources/mappers/TaskMapper.xml index 51ddb7c..1b1501a 100644 --- a/src/main/resources/mappers/TaskMapper.xml +++ b/src/main/resources/mappers/TaskMapper.xml @@ -80,6 +80,8 @@ + + @@ -312,6 +314,11 @@ #{taskId} + + UPDATE t_task + SET task_ip_num = #{ip_total_num} + WHERE task_id = #{task_id} + DELETE @@ -754,4 +761,15 @@ FROM t_task_file WHERE task_id = #{taskId} + + \ No newline at end of file