From 08d68b66aba4b2108aab9baafaf29c83ff8e2755 Mon Sep 17 00:00:00 2001 From: HuangXin Date: Thu, 12 Nov 2020 16:28:58 +0800 Subject: [PATCH] =?UTF-8?q?OCT=20REM:=201.=20=E5=A2=9E=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=8E=B7=E5=8F=96=E5=A4=84=E7=BD=AE=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=8A=B6=E6=80=81=E5=8A=9F=E8=83=BD=202.=20?= =?UTF-8?q?=E5=A4=84=E7=BD=AE=E4=BB=BB=E5=8A=A1=E4=BF=A1=E6=81=AF=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=A2=9E=E5=8A=A0=E5=A4=84=E7=BD=AE=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=8A=B6=E6=80=81=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dispose/ability/DisposeAbility.java | 8 +++ .../ability/impl/DpTechAbilityImpl.java | 11 ++++ .../ability/impl/HaoHanAbilityImpl.java | 11 ++++ .../ability/impl/PengXinAbilityImpl.java | 43 ++++++++++++++++ .../ability/impl/VirtualAbilityImpl.java | 11 ++++ .../controller/DisposeTaskController.java | 3 +- .../dispose/manager/DeviceTaskManager.java | 8 +++ .../manager/impl/DeviceTaskManagerImpl.java | 12 +++++ .../com/dispose/mapper/DeviceTaskMapper.java | 10 ++++ .../protocol/task/GetDeviceTaskDetail.java | 4 ++ .../com/dispose/pojo/entity/DeviceTask.java | 4 ++ .../impl/DeviceTaskManagerServiceImpl.java | 50 +++++++++++++++++++ .../dispose/common/PengXinTaskStatusItem.java | 48 ++++++++++++++++++ .../dispose/common/PengXinTaskStatusRsp.java | 30 +++++++++++ .../dispose/protocol/PengXinInterface.java | 26 ++++++++++ src/main/resources/db/schema.sql | 1 + src/main/resources/mappers/DeviceTask.xml | 11 +++- src/main/resources/mappers/DisposeTask.xml | 4 ++ src/main/resources/test_db/unit_test.sql | 4 +- 19 files changed, 295 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/pengxin/dispose/common/PengXinTaskStatusItem.java create mode 100644 src/main/java/com/pengxin/dispose/common/PengXinTaskStatusRsp.java diff --git a/src/main/java/com/dispose/ability/DisposeAbility.java b/src/main/java/com/dispose/ability/DisposeAbility.java index 35f37180..2e0013fa 100644 --- a/src/main/java/com/dispose/ability/DisposeAbility.java +++ b/src/main/java/com/dispose/ability/DisposeAbility.java @@ -56,6 +56,14 @@ public interface DisposeAbility { @Nullable Integer attackType, @Nullable String taskId); + /** + * Task status mul return type. + * + * @param taskId the task id + * @return the mul return type + */ + MulReturnType taskStatus(Long taskId); + /** * Gets ability device fireware. * diff --git a/src/main/java/com/dispose/ability/impl/DpTechAbilityImpl.java b/src/main/java/com/dispose/ability/impl/DpTechAbilityImpl.java index 8b8df322..04197943 100644 --- a/src/main/java/com/dispose/ability/impl/DpTechAbilityImpl.java +++ b/src/main/java/com/dispose/ability/impl/DpTechAbilityImpl.java @@ -316,4 +316,15 @@ public class DpTechAbilityImpl implements DisposeAbility { return ret; } + + /** + * Task status mul return type. + * + * @param taskId the task id + * @return the mul return type + */ + @Override + public MulReturnType taskStatus(Long taskId) { + return new MulReturnType<>(ErrorCode.ERR_UNSUPPORT, -1L); + } } diff --git a/src/main/java/com/dispose/ability/impl/HaoHanAbilityImpl.java b/src/main/java/com/dispose/ability/impl/HaoHanAbilityImpl.java index 0202c3e9..10290569 100644 --- a/src/main/java/com/dispose/ability/impl/HaoHanAbilityImpl.java +++ b/src/main/java/com/dispose/ability/impl/HaoHanAbilityImpl.java @@ -214,4 +214,15 @@ public class HaoHanAbilityImpl implements DisposeAbility { IPAddress addr = new IPAddressString(ipAddr).getAddress(); return addr.isIPv4(); } + + /** + * Task status mul return type. + * + * @param taskId the task id + * @return the mul return type + */ + @Override + public MulReturnType taskStatus(Long taskId) { + return new MulReturnType<>(ErrorCode.ERR_UNSUPPORT, -1L); + } } diff --git a/src/main/java/com/dispose/ability/impl/PengXinAbilityImpl.java b/src/main/java/com/dispose/ability/impl/PengXinAbilityImpl.java index be4433d0..7d69e63d 100644 --- a/src/main/java/com/dispose/ability/impl/PengXinAbilityImpl.java +++ b/src/main/java/com/dispose/ability/impl/PengXinAbilityImpl.java @@ -15,6 +15,7 @@ import com.pengxin.dispose.common.PengXinLoginRsp; import com.pengxin.dispose.common.PengXinStartTaskItem; import com.pengxin.dispose.common.PengXinStartTaskRsp; import com.pengxin.dispose.common.PengXinStopTaskRsp; +import com.pengxin.dispose.common.PengXinTaskStatusRsp; import com.pengxin.dispose.protocol.PengXinInterface; import inet.ipaddr.IPAddress; import inet.ipaddr.IPAddressString; @@ -407,6 +408,48 @@ public class PengXinAbilityImpl implements DisposeAbility { return ret; } + /** + * Task status mul return type. + * + * @param taskId the task id + * @return the mul return type + */ + @Override + public MulReturnType taskStatus(Long taskId) { + if (token == null || token.length() == 0) { + return new MulReturnType<>(ErrorCode.ERR_LOGOUT, -1L); + } + + try { + String url = urlRootPath + "dispose_device/task/get"; + + ProtocolRespDTO rspInfo = restfulInterface.getDeviceTaskStatus(url, token, + new String[] {String.valueOf(taskId)}); + + // 判断是否token过期 + if (rspInfo != null && rspInfo.getCode() == HttpServletResponse.SC_UNAUTHORIZED) { + // 重新登录获取 token + upgradeToken(); + rspInfo = restfulInterface.getDeviceTaskStatus(urlRootPath, token, + new String[] {String.valueOf(taskId)}); + } + + if (rspInfo != null && rspInfo.getCode() == ErrorCode.ERR_OK.getHttpCode()) { + + if(rspInfo.getMsgContent().getItems().size() == 0) { + return new MulReturnType<>(ErrorCode.ERR_NOSUCHTASK, -1L); + } + + return new MulReturnType<>(ErrorCode.ERR_OK, + rspInfo.getMsgContent().getItems().get(0).getTaskStatus()); + } else { + return new MulReturnType<>(ErrorCode.ERR_CALLDEVICE, -1L); + } + } catch (Exception ignored) { + return new MulReturnType<>(ErrorCode.ERR_SYSTEMEXCEPTION, -1L); + } + } + /** * Upgrade token. */ diff --git a/src/main/java/com/dispose/ability/impl/VirtualAbilityImpl.java b/src/main/java/com/dispose/ability/impl/VirtualAbilityImpl.java index 6f92bcfb..633cdb5c 100644 --- a/src/main/java/com/dispose/ability/impl/VirtualAbilityImpl.java +++ b/src/main/java/com/dispose/ability/impl/VirtualAbilityImpl.java @@ -132,4 +132,15 @@ public class VirtualAbilityImpl implements DisposeAbility { public boolean isCarryProtectIp(String ipAddr) { return true; } + + /** + * Task status mul return type. + * + * @param taskId the task id + * @return the mul return type + */ + @Override + public MulReturnType taskStatus(Long taskId) { + return new MulReturnType<>(ErrorCode.ERR_UNSUPPORT, -1L); + } } diff --git a/src/main/java/com/dispose/controller/DisposeTaskController.java b/src/main/java/com/dispose/controller/DisposeTaskController.java index ca056266..70a9001a 100644 --- a/src/main/java/com/dispose/controller/DisposeTaskController.java +++ b/src/main/java/com/dispose/controller/DisposeTaskController.java @@ -101,7 +101,7 @@ public class DisposeTaskController { Long devId = Long.parseLong(Optional.ofNullable(req.getDeviceId()).orElse("-1")); Long aId = userAccountService.getUserIdByAuthHead(Objects.requireNonNull(headers.get("Authorization")).get(0)); DisposeCapacityType capType = CommonEnumHandler.codeOf(DisposeCapacityType.class, req.getType()); - String endTime = String.valueOf(req.getDisposeTime()); + String endTime = String.valueOf(req.getDisposeTime() == -1 ? 52560000 : req.getDisposeTime()); NetflowDirection netDir = CommonEnumHandler.codeOf(NetflowDirection.class, Optional.ofNullable(req.getFlowDirection()).orElse(2)); Long attackType = DDoSAttackType.getTypeMaskFromAttackType(Optional.ofNullable(req.getAttackType()) @@ -399,6 +399,7 @@ public class DisposeTaskController { .devId(String.valueOf(k.getDeviceId())) .externId(String.valueOf(k.getExternId())) .status(k.getStatus()) + .devStatus(k.getDevStatus()) .build(); taskDetail.getDeviceTask().add(deviceTaskDetail); }); diff --git a/src/main/java/com/dispose/manager/DeviceTaskManager.java b/src/main/java/com/dispose/manager/DeviceTaskManager.java index a1ee89b5..0e3cdfb1 100644 --- a/src/main/java/com/dispose/manager/DeviceTaskManager.java +++ b/src/main/java/com/dispose/manager/DeviceTaskManager.java @@ -45,6 +45,14 @@ public interface DeviceTaskManager { */ boolean changeDisposeDeviceTaskInfoStatus(Long id, DisposeTaskStatus status); + /** + * Gets dispose device task status. + * + * @param id the id + * @return the dispose device task status + */ + int changeDisposeDeviceTaskInfoDevStatus(Long id, Long devStatus); + /** * Sets exec attack type. * diff --git a/src/main/java/com/dispose/manager/impl/DeviceTaskManagerImpl.java b/src/main/java/com/dispose/manager/impl/DeviceTaskManagerImpl.java index 1a855d14..a0c57b4d 100644 --- a/src/main/java/com/dispose/manager/impl/DeviceTaskManagerImpl.java +++ b/src/main/java/com/dispose/manager/impl/DeviceTaskManagerImpl.java @@ -79,6 +79,18 @@ public class DeviceTaskManagerImpl implements DeviceTaskManager { return deviceTaskMapper.changeTaskStatus(id, status) == 1; } + /** + * Change dispose device task info dev status long. + * + * @param id the id + * @param devStatus the dev status + * @return the long + */ + @Override + public int changeDisposeDeviceTaskInfoDevStatus(Long id, Long devStatus) { + return deviceTaskMapper.changeTaskDevStatus(id, devStatus); + } + /** * Sets exec attack type. * diff --git a/src/main/java/com/dispose/mapper/DeviceTaskMapper.java b/src/main/java/com/dispose/mapper/DeviceTaskMapper.java index 6fc53654..538bad81 100644 --- a/src/main/java/com/dispose/mapper/DeviceTaskMapper.java +++ b/src/main/java/com/dispose/mapper/DeviceTaskMapper.java @@ -85,6 +85,16 @@ public interface DeviceTaskMapper { int changeTaskStatus(@Param("id") Long id, @Param("status") DisposeTaskStatus status); + /** + * Change task dev status int. + * + * @param id the id + * @param status the status + * @return the int + */ + int changeTaskDevStatus(@Param("id") Long id, + @Param("status") Long status); + /** * Change exec attack type in value int. * diff --git a/src/main/java/com/dispose/pojo/dto/protocol/task/GetDeviceTaskDetail.java b/src/main/java/com/dispose/pojo/dto/protocol/task/GetDeviceTaskDetail.java index 5a548c3a..3013fa66 100644 --- a/src/main/java/com/dispose/pojo/dto/protocol/task/GetDeviceTaskDetail.java +++ b/src/main/java/com/dispose/pojo/dto/protocol/task/GetDeviceTaskDetail.java @@ -31,6 +31,10 @@ public class GetDeviceTaskDetail { * The Extern id. */ private String externId; + /** + * The Dev status. + */ + private Long devStatus; /** * The Status. */ diff --git a/src/main/java/com/dispose/pojo/entity/DeviceTask.java b/src/main/java/com/dispose/pojo/entity/DeviceTask.java index ff7ee7d1..853fde56 100644 --- a/src/main/java/com/dispose/pojo/entity/DeviceTask.java +++ b/src/main/java/com/dispose/pojo/entity/DeviceTask.java @@ -87,4 +87,8 @@ public class DeviceTask implements Serializable { * The Status. */ private Long status; + /** + * The Dev status. + */ + private Long devStatus; } diff --git a/src/main/java/com/dispose/service/impl/DeviceTaskManagerServiceImpl.java b/src/main/java/com/dispose/service/impl/DeviceTaskManagerServiceImpl.java index 60e2db30..285d9069 100644 --- a/src/main/java/com/dispose/service/impl/DeviceTaskManagerServiceImpl.java +++ b/src/main/java/com/dispose/service/impl/DeviceTaskManagerServiceImpl.java @@ -682,6 +682,53 @@ public class DeviceTaskManagerServiceImpl implements DeviceTaskManagerService { } } + /** + * Device task status schedule. + */ + public void deviceTaskStatusSchedule() { + // 遍历所有新的设备处置任务 + for (DeviceTask v : deviceTaskManager.getStartedDisposeDeviceTaskInfo()) { + DisposeTask task = disposeTaskManager.getDisposeTaskById(v.getTaskId()); + + // 保护代码,理论上不存在该情况 + assert task != null; + + // 获取设备 + AbilityInfo ai = disposeAbilityRouterService.getAbilityDevice(v.getDeviceId()); + + // 如果设备已经删除或者禁用,跳过处理 + if (ai == null) { + // 设置任务状态为已完成 + deviceTaskManager.changeDisposeDeviceTaskInfoStatus(v.getId(), DisposeTaskStatus.TASK_FINISHED); + continue; + } + + // 对处置IP生成一个唯一的操作标识符 + String taskStatusKey = v.getId() + "Status" + ai.getDev().getDeviceType().getDescription(); + + if (taskCache.containsKey(taskStatusKey)) { + continue; + } + + // 设置标志,避免对同一个IP重复调用停止处置命令 + taskCache.put(taskStatusKey, true); + + // 任务预计结束5分钟内, + if (Helper.getTimestampDiffNow(task.getPlanEndTime()) < 5 * 60) { + if (v.getEndTime() == null && Helper.getTimestampDiffNow(v.getEndTime()) < 5 * 60) { + MulReturnType ret = ai.getDb().taskStatus(v.getId()); + + if (ret.getFirstParam() == ErrorCode.ERR_OK) { + deviceTaskManager.changeDisposeDeviceTaskInfoDevStatus(v.getId(), ret.getSecondParam()); + } + } + } + + // 处置命令调用结束,允许下一次停止命令调用 + taskCache.remove(taskStatusKey); + } + } + /** * Schedule runner thread. */ @@ -697,5 +744,8 @@ public class DeviceTaskManagerServiceImpl implements DeviceTaskManagerService { // 处置设备停止任务 deviceTaskStopSchedule(); + + // 定时刷新设备任务状态 + deviceTaskStatusSchedule(); } } diff --git a/src/main/java/com/pengxin/dispose/common/PengXinTaskStatusItem.java b/src/main/java/com/pengxin/dispose/common/PengXinTaskStatusItem.java new file mode 100644 index 00000000..2abebcf4 --- /dev/null +++ b/src/main/java/com/pengxin/dispose/common/PengXinTaskStatusItem.java @@ -0,0 +1,48 @@ +package com.pengxin.dispose.common; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * The type Peng xin tast status item. + * + * @author + */ +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +public class PengXinTaskStatusItem extends PengXinBaseResp { + /** + * The Task id. + */ + private String taskId; + /** + * The Type. + */ + private Integer type; + /** + * The Object type. + */ + private Integer objectType; + /** + * The Dispose object. + */ + private String disposeObject; + /** + * The Start time. + */ + private Long startTime; + /** + * The Dispose time. + */ + private Long disposeTime; + /** + * The Task status. + */ + private Long taskStatus; +} diff --git a/src/main/java/com/pengxin/dispose/common/PengXinTaskStatusRsp.java b/src/main/java/com/pengxin/dispose/common/PengXinTaskStatusRsp.java new file mode 100644 index 00000000..ea31c5c6 --- /dev/null +++ b/src/main/java/com/pengxin/dispose/common/PengXinTaskStatusRsp.java @@ -0,0 +1,30 @@ +package com.pengxin.dispose.common; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * The type Peng xin task status rsp. + * + * @author + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +public class PengXinTaskStatusRsp { + + /** + * The Device name. + */ + private String deviceName; + + /** + * The Items. + */ + private List items; +} diff --git a/src/main/java/com/pengxin/dispose/protocol/PengXinInterface.java b/src/main/java/com/pengxin/dispose/protocol/PengXinInterface.java index d1825c60..0e92a39b 100644 --- a/src/main/java/com/pengxin/dispose/protocol/PengXinInterface.java +++ b/src/main/java/com/pengxin/dispose/protocol/PengXinInterface.java @@ -13,6 +13,7 @@ import com.pengxin.dispose.common.PengXinStartTaskReq; import com.pengxin.dispose.common.PengXinStartTaskRsp; import com.pengxin.dispose.common.PengXinStopTaskReq; import com.pengxin.dispose.common.PengXinStopTaskRsp; +import com.pengxin.dispose.common.PengXinTaskStatusRsp; import org.springframework.web.bind.annotation.RequestMethod; import javax.servlet.http.HttpServletResponse; @@ -160,4 +161,29 @@ public class PengXinInterface { PengXinDisposeAbilityRsp.class, RequestMethod.GET); } + + /** + * Gets device task status. + * + * @param baseUrlPath the base url path + * @param token the token + * @param taskId the task id + * @return the device task status + */ + public ProtocolRespDTO getDeviceTaskStatus(String baseUrlPath, String token, String[] taskId) { + BaseProtocolDTO reqInfo = new BaseProtocolDTO<>(); + + reqInfo.setMsgContent(new PengXinStopTaskReq()); + + reqInfo.getMsgContent().setTaskId(taskId); + reqInfo.setCryptoType(this.cryptoType); + reqInfo.setVer(this.ver); + reqInfo.setTimeStamp(System.currentTimeMillis()); + + return RestfulInterface.baseProRun(baseUrlPath, + token, + reqInfo, + PengXinTaskStatusRsp.class, + RequestMethod.POST); + } } diff --git a/src/main/resources/db/schema.sql b/src/main/resources/db/schema.sql index f2cbf521..b3e85c69 100644 --- a/src/main/resources/db/schema.sql +++ b/src/main/resources/db/schema.sql @@ -36,6 +36,7 @@ CREATE TABLE `device_task` `externId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '扩展任务ID', `errRetry` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '调用失败重试次数', `status` int(10) NOT NULL DEFAULT 0 COMMENT '任务状态', + `devStatus` int(10) NOT NULL DEFAULT 0 COMMENT '设备任务状态', PRIMARY KEY (`id`) USING BTREE, INDEX `task_info_ibfk_1` (`taskId`) USING BTREE, INDEX `task_info_ibfk_2` (`deviceId`) USING BTREE, diff --git a/src/main/resources/mappers/DeviceTask.xml b/src/main/resources/mappers/DeviceTask.xml index b29db003..7bf6e499 100644 --- a/src/main/resources/mappers/DeviceTask.xml +++ b/src/main/resources/mappers/DeviceTask.xml @@ -14,6 +14,7 @@ + @@ -24,11 +25,11 @@ - INSERT IGNORE INTO device_task(taskId, deviceId, taskAttackType, status) + INSERT IGNORE INTO device_task(taskId, deviceId, taskAttackType, status, devStatus) VALUES (#{task.taskId}, #{task.deviceId}, #{task.taskAttackType}, - ${@com.dispose.common.DisposeTaskStatus@TASK_NEW.getValue()}) + ${@com.dispose.common.DisposeTaskStatus@TASK_NEW.getValue()}, 0) @@ -87,6 +88,12 @@ WHERE id = #{id} + + UPDATE device_task + SET status = #{status} + WHERE id = #{id} + + UPDATE device_task SET execAttackTypeIn = #{attackTypeValue} diff --git a/src/main/resources/mappers/DisposeTask.xml b/src/main/resources/mappers/DisposeTask.xml index 67b6375d..71ce2a2e 100644 --- a/src/main/resources/mappers/DisposeTask.xml +++ b/src/main/resources/mappers/DisposeTask.xml @@ -30,6 +30,7 @@ + @@ -61,6 +62,7 @@ ti.attackTypeStatusOut attackTypeStatusOut, ti.externId externId, ti.errRetry errRetry, + ti.devStatus devStatus, ti.status status FROM dispose_task dt LEFT JOIN device_task ti on dt.id = ti.taskId @@ -84,6 +86,7 @@ ti.attackTypeStatusOut attackTypeStatusOut, ti.externId externId, ti.errRetry errRetry, + ti.devStatus devStatus, ti.status status FROM dispose_task dt LEFT JOIN device_task ti on dt.id = ti.taskId @@ -103,6 +106,7 @@ ti.attackTypeStatusOut attackTypeStatusOut, ti.externId externId, ti.errRetry errRetry, + ti.devStatus devStatus, ti.status status FROM dispose_task dt LEFT JOIN device_task ti on dt.id = ti.taskId diff --git a/src/main/resources/test_db/unit_test.sql b/src/main/resources/test_db/unit_test.sql index 3a13b4b8..595e5178 100644 --- a/src/main/resources/test_db/unit_test.sql +++ b/src/main/resources/test_db/unit_test.sql @@ -36,6 +36,7 @@ CREATE TABLE `device_task` `externId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '扩展任务ID', `errRetry` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '调用失败重试次数', `status` int(10) NOT NULL DEFAULT 0 COMMENT '任务状态', + `devStatus` int(10) NOT NULL DEFAULT 0 COMMENT '设备任务状态', PRIMARY KEY (`id`) USING BTREE, INDEX `task_info_ibfk_1` (`taskId`) USING BTREE, INDEX `task_info_ibfk_2` (`deviceId`) USING BTREE, @@ -174,7 +175,8 @@ VALUES (1, -1, 1, -1, 0, '192.168.10.1', 1, CURRENT_TIMESTAMP, date_add(now(), i 8796093022207, 1024, 0); INSERT INTO `dispose_task` -VALUES (2, -1, 1, -1, 0, '192.168.10.2', 1, CURRENT_TIMESTAMP, date_add(now(), interval 60 MINUTE), null, 2, 8796093022207, +VALUES (2, -1, 1, -1, 0, '192.168.10.2', 1, CURRENT_TIMESTAMP, date_add(now(), interval 60 MINUTE), null, 2, + 8796093022207, 1024, 0); -- ----------------------------