ft:任务预评估字段、任务状态日志查询接口
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -127,6 +127,8 @@ public class TaskCommandInfo {
|
||||
@Schema(description = "目的ip整数形式", accessMode = Schema.AccessMode.READ_ONLY)
|
||||
private Long dipInt;
|
||||
|
||||
private Long rcpHitCount;
|
||||
|
||||
|
||||
// private String hashValue;
|
||||
|
||||
|
||||
@@ -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 +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -80,5 +80,7 @@ public interface CommandMapper {
|
||||
|
||||
void insertCommandTrafficBatch(@Param("command_infos")List<TaskCommandInfo> taskCommandInfoBatch);
|
||||
|
||||
Object setCommandValid(String commandId, Integer isValid);
|
||||
Boolean setCommandValid(String commandId, Integer isValid);
|
||||
|
||||
List<TaskCommandInfo> queryAllDistributingCommandInfo();
|
||||
}
|
||||
|
||||
@@ -230,6 +230,11 @@ public class CommandService {
|
||||
return commandMapper.queryCommandInfoByUUID(uuid);
|
||||
}
|
||||
|
||||
public List<TaskCommandInfo> 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<String> 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Task> 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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -988,4 +988,43 @@ public interface TaskControllerApi {
|
||||
@PostMapping("/result/{systemName}")
|
||||
ResponseResult receiveOtherSystemResult(@PathVariable String systemName,
|
||||
@RequestBody Map<String, String> 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);
|
||||
}
|
||||
|
||||
@@ -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<File> selectFilesByStaticRuleId(Long taskId);
|
||||
|
||||
List<Task> queryTaskStausLog(Long id, Integer page, Integer pageSize);
|
||||
|
||||
Integer queryTaskStausLogTotalNum(Long id);
|
||||
}
|
||||
|
||||
@@ -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<Subnet> mergeOverlappingSubnets(List<Subnet> subnets) throws UnknownHostException {
|
||||
if (subnets.isEmpty()) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
subnets.sort(Comparator.comparingLong(subnet -> subnet.startIp));
|
||||
List<Subnet> 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<Subnet> subnets) {
|
||||
|
||||
Long totalIPs = 0L;
|
||||
try {
|
||||
List<Subnet> 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<Subnet> subnetList = new ArrayList<>();
|
||||
if (task.getStaticRuleIds() != null && !task.getStaticRuleIds().isEmpty()) {
|
||||
staticRuleMapper.queryStaticRuleByIds(task.getStaticRuleIds()).forEach(staticRuleObject -> {
|
||||
if (!staticRuleObject.getAuditStatus().equals(AuditStatusEnum.AUDITED.getNum())) {
|
||||
@@ -84,6 +126,28 @@ 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());
|
||||
}
|
||||
@@ -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<Task> queryTaskStausLog(Long id, Integer page, Integer pageSize) {
|
||||
return taskMapper.queryTaskStausLog(id,page,pageSize);
|
||||
}
|
||||
|
||||
public Integer queryTaskStausLogTotalNum(Long id) {
|
||||
return taskMapper.queryTaskStausLogTotalNum(id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -456,6 +456,7 @@
|
||||
<result column="IS_VALID" property="isValid"/>
|
||||
<result column="IS_JUDGED" property="isJudged"/>
|
||||
<!-- <result column="IS_DELETED" property=""/>-->
|
||||
<result column="RCP_HIT_COUNT" property="rcpHitCount"/>
|
||||
|
||||
|
||||
<association property="fiveTupleWithMask">
|
||||
@@ -465,6 +466,7 @@
|
||||
<result column="DST_PORT" property="destinationPort"/>
|
||||
<result column="PROTOCOL" property="protocolNum"/>
|
||||
</association>
|
||||
|
||||
</resultMap>
|
||||
|
||||
<select id="queryCommandInfoByUUID" resultMap="commandStatMap">
|
||||
@@ -706,4 +708,13 @@
|
||||
FROM t_command
|
||||
WHERE COMMAND_ID = #{uuid}
|
||||
</select>
|
||||
<select id="queryAllDistributingCommandInfo"
|
||||
resultMap="commandStatMap">
|
||||
SELECT COMMAND_ID,
|
||||
RCP_HIT_COUNT
|
||||
FROM t_command
|
||||
WHERE IS_JUDGED = 1
|
||||
AND IS_VALID = 1
|
||||
AND IS_DELETED = 0
|
||||
</select>
|
||||
</mapper>
|
||||
|
||||
@@ -80,6 +80,8 @@
|
||||
<result column="source_system" property="sourceSystem"/>
|
||||
<result column="effective_time" property="effeciveTime"/>
|
||||
<result column="expire_time" property="expireTime"/>
|
||||
|
||||
<result column="task_ip_num" property="taskIpNum"/>
|
||||
<!--防护对象字段-->
|
||||
</resultMap>
|
||||
|
||||
@@ -312,6 +314,11 @@
|
||||
#{taskId}
|
||||
</foreach>
|
||||
</update>
|
||||
<update id="setIpTotalNum">
|
||||
UPDATE t_task
|
||||
SET task_ip_num = #{ip_total_num}
|
||||
WHERE task_id = #{task_id}
|
||||
</update>
|
||||
|
||||
<delete id="deleteTask">
|
||||
DELETE
|
||||
@@ -754,4 +761,15 @@
|
||||
FROM t_task_file
|
||||
WHERE task_id = #{taskId}
|
||||
</select>
|
||||
<select id="queryTaskStausLog" resultMap="taskMap">
|
||||
SELECT *
|
||||
FROM t_task_status_log
|
||||
WHERE task_id = #{id}
|
||||
ORDER BY effective_time DESC
|
||||
LIMIT ${(page - 1) * pageSize}, #{pageSize}
|
||||
</select>
|
||||
<select id="queryTaskStausLogTotalNum" resultType="java.lang.Integer">
|
||||
SELECT COUNT(*) FROM t_task_status_log
|
||||
WHERE task_id = #{id}
|
||||
</select>
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user