REM:
1. 增加自动获取处置设备任务状态功能
2. 处置任务信息接口增加处置设备任务状态字段
This commit is contained in:
HuangXin 2020-11-12 16:28:58 +08:00
parent cfbec4da90
commit 08d68b66ab
19 changed files with 295 additions and 4 deletions

View File

@ -56,6 +56,14 @@ public interface DisposeAbility {
@Nullable Integer attackType, @Nullable Integer attackType,
@Nullable String taskId); @Nullable String taskId);
/**
* Task status mul return type.
*
* @param taskId the task id
* @return the mul return type
*/
MulReturnType<ErrorCode, Long> taskStatus(Long taskId);
/** /**
* Gets ability device fireware. * Gets ability device fireware.
* *

View File

@ -316,4 +316,15 @@ public class DpTechAbilityImpl implements DisposeAbility {
return ret; return ret;
} }
/**
* Task status mul return type.
*
* @param taskId the task id
* @return the mul return type
*/
@Override
public MulReturnType<ErrorCode, Long> taskStatus(Long taskId) {
return new MulReturnType<>(ErrorCode.ERR_UNSUPPORT, -1L);
}
} }

View File

@ -214,4 +214,15 @@ public class HaoHanAbilityImpl implements DisposeAbility {
IPAddress addr = new IPAddressString(ipAddr).getAddress(); IPAddress addr = new IPAddressString(ipAddr).getAddress();
return addr.isIPv4(); return addr.isIPv4();
} }
/**
* Task status mul return type.
*
* @param taskId the task id
* @return the mul return type
*/
@Override
public MulReturnType<ErrorCode, Long> taskStatus(Long taskId) {
return new MulReturnType<>(ErrorCode.ERR_UNSUPPORT, -1L);
}
} }

View File

@ -15,6 +15,7 @@ import com.pengxin.dispose.common.PengXinLoginRsp;
import com.pengxin.dispose.common.PengXinStartTaskItem; import com.pengxin.dispose.common.PengXinStartTaskItem;
import com.pengxin.dispose.common.PengXinStartTaskRsp; import com.pengxin.dispose.common.PengXinStartTaskRsp;
import com.pengxin.dispose.common.PengXinStopTaskRsp; import com.pengxin.dispose.common.PengXinStopTaskRsp;
import com.pengxin.dispose.common.PengXinTaskStatusRsp;
import com.pengxin.dispose.protocol.PengXinInterface; import com.pengxin.dispose.protocol.PengXinInterface;
import inet.ipaddr.IPAddress; import inet.ipaddr.IPAddress;
import inet.ipaddr.IPAddressString; import inet.ipaddr.IPAddressString;
@ -407,6 +408,48 @@ public class PengXinAbilityImpl implements DisposeAbility {
return ret; return ret;
} }
/**
* Task status mul return type.
*
* @param taskId the task id
* @return the mul return type
*/
@Override
public MulReturnType<ErrorCode, Long> 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<PengXinTaskStatusRsp> 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. * Upgrade token.
*/ */

View File

@ -132,4 +132,15 @@ public class VirtualAbilityImpl implements DisposeAbility {
public boolean isCarryProtectIp(String ipAddr) { public boolean isCarryProtectIp(String ipAddr) {
return true; return true;
} }
/**
* Task status mul return type.
*
* @param taskId the task id
* @return the mul return type
*/
@Override
public MulReturnType<ErrorCode, Long> taskStatus(Long taskId) {
return new MulReturnType<>(ErrorCode.ERR_UNSUPPORT, -1L);
}
} }

View File

@ -101,7 +101,7 @@ public class DisposeTaskController {
Long devId = Long.parseLong(Optional.ofNullable(req.getDeviceId()).orElse("-1")); Long devId = Long.parseLong(Optional.ofNullable(req.getDeviceId()).orElse("-1"));
Long aId = userAccountService.getUserIdByAuthHead(Objects.requireNonNull(headers.get("Authorization")).get(0)); Long aId = userAccountService.getUserIdByAuthHead(Objects.requireNonNull(headers.get("Authorization")).get(0));
DisposeCapacityType capType = CommonEnumHandler.codeOf(DisposeCapacityType.class, req.getType()); 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, NetflowDirection netDir = CommonEnumHandler.codeOf(NetflowDirection.class,
Optional.ofNullable(req.getFlowDirection()).orElse(2)); Optional.ofNullable(req.getFlowDirection()).orElse(2));
Long attackType = DDoSAttackType.getTypeMaskFromAttackType(Optional.ofNullable(req.getAttackType()) Long attackType = DDoSAttackType.getTypeMaskFromAttackType(Optional.ofNullable(req.getAttackType())
@ -399,6 +399,7 @@ public class DisposeTaskController {
.devId(String.valueOf(k.getDeviceId())) .devId(String.valueOf(k.getDeviceId()))
.externId(String.valueOf(k.getExternId())) .externId(String.valueOf(k.getExternId()))
.status(k.getStatus()) .status(k.getStatus())
.devStatus(k.getDevStatus())
.build(); .build();
taskDetail.getDeviceTask().add(deviceTaskDetail); taskDetail.getDeviceTask().add(deviceTaskDetail);
}); });

View File

@ -45,6 +45,14 @@ public interface DeviceTaskManager {
*/ */
boolean changeDisposeDeviceTaskInfoStatus(Long id, DisposeTaskStatus status); 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. * Sets exec attack type.
* *

View File

@ -79,6 +79,18 @@ public class DeviceTaskManagerImpl implements DeviceTaskManager {
return deviceTaskMapper.changeTaskStatus(id, status) == 1; 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. * Sets exec attack type.
* *

View File

@ -85,6 +85,16 @@ public interface DeviceTaskMapper {
int changeTaskStatus(@Param("id") Long id, int changeTaskStatus(@Param("id") Long id,
@Param("status") DisposeTaskStatus status); @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. * Change exec attack type in value int.
* *

View File

@ -31,6 +31,10 @@ public class GetDeviceTaskDetail {
* The Extern id. * The Extern id.
*/ */
private String externId; private String externId;
/**
* The Dev status.
*/
private Long devStatus;
/** /**
* The Status. * The Status.
*/ */

View File

@ -87,4 +87,8 @@ public class DeviceTask implements Serializable {
* The Status. * The Status.
*/ */
private Long status; private Long status;
/**
* The Dev status.
*/
private Long devStatus;
} }

View File

@ -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<ErrorCode, Long> ret = ai.getDb().taskStatus(v.getId());
if (ret.getFirstParam() == ErrorCode.ERR_OK) {
deviceTaskManager.changeDisposeDeviceTaskInfoDevStatus(v.getId(), ret.getSecondParam());
}
}
}
// 处置命令调用结束允许下一次停止命令调用
taskCache.remove(taskStatusKey);
}
}
/** /**
* Schedule runner thread. * Schedule runner thread.
*/ */
@ -697,5 +744,8 @@ public class DeviceTaskManagerServiceImpl implements DeviceTaskManagerService {
// 处置设备停止任务 // 处置设备停止任务
deviceTaskStopSchedule(); deviceTaskStopSchedule();
// 定时刷新设备任务状态
deviceTaskStatusSchedule();
} }
} }

View File

@ -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 <huangxin@cmhi.chinamoblie.com>
*/
@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;
}

View File

@ -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 <huangxin@cmhi.chinamoblie.com>
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PengXinTaskStatusRsp {
/**
* The Device name.
*/
private String deviceName;
/**
* The Items.
*/
private List<PengXinTaskStatusItem> items;
}

View File

@ -13,6 +13,7 @@ import com.pengxin.dispose.common.PengXinStartTaskReq;
import com.pengxin.dispose.common.PengXinStartTaskRsp; import com.pengxin.dispose.common.PengXinStartTaskRsp;
import com.pengxin.dispose.common.PengXinStopTaskReq; import com.pengxin.dispose.common.PengXinStopTaskReq;
import com.pengxin.dispose.common.PengXinStopTaskRsp; import com.pengxin.dispose.common.PengXinStopTaskRsp;
import com.pengxin.dispose.common.PengXinTaskStatusRsp;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -160,4 +161,29 @@ public class PengXinInterface {
PengXinDisposeAbilityRsp.class, PengXinDisposeAbilityRsp.class,
RequestMethod.GET); 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<PengXinTaskStatusRsp> getDeviceTaskStatus(String baseUrlPath, String token, String[] taskId) {
BaseProtocolDTO<PengXinStopTaskReq> 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);
}
} }

View File

@ -36,6 +36,7 @@ CREATE TABLE `device_task`
`externId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '扩展任务ID', `externId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '扩展任务ID',
`errRetry` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '调用失败重试次数', `errRetry` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '调用失败重试次数',
`status` int(10) 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, PRIMARY KEY (`id`) USING BTREE,
INDEX `task_info_ibfk_1` (`taskId`) USING BTREE, INDEX `task_info_ibfk_1` (`taskId`) USING BTREE,
INDEX `task_info_ibfk_2` (`deviceId`) USING BTREE, INDEX `task_info_ibfk_2` (`deviceId`) USING BTREE,

View File

@ -14,6 +14,7 @@
<result column="attackTypeStatusOut" property="attackTypeStatusOut"/> <result column="attackTypeStatusOut" property="attackTypeStatusOut"/>
<result column="externId" property="externId"/> <result column="externId" property="externId"/>
<result column="errRetry" property="errRetry"/> <result column="errRetry" property="errRetry"/>
<result column="devStatus" property="devStatus"/>
<result column="status" property="status"/> <result column="status" property="status"/>
</resultMap> </resultMap>
@ -24,11 +25,11 @@
<insert id="addNewTaskInfoList" useGeneratedKeys="true" keyProperty="id" <insert id="addNewTaskInfoList" useGeneratedKeys="true" keyProperty="id"
parameterType="com.dispose.pojo.entity.DeviceTask"> parameterType="com.dispose.pojo.entity.DeviceTask">
INSERT IGNORE INTO device_task(taskId, deviceId, taskAttackType, status) INSERT IGNORE INTO device_task(taskId, deviceId, taskAttackType, status, devStatus)
VALUES VALUES
<foreach collection="taskLists" item="task" separator=","> <foreach collection="taskLists" item="task" separator=",">
(#{task.taskId}, #{task.deviceId}, #{task.taskAttackType}, (#{task.taskId}, #{task.deviceId}, #{task.taskAttackType},
${@com.dispose.common.DisposeTaskStatus@TASK_NEW.getValue()}) ${@com.dispose.common.DisposeTaskStatus@TASK_NEW.getValue()}, 0)
</foreach> </foreach>
</insert> </insert>
@ -87,6 +88,12 @@
WHERE id = #{id} WHERE id = #{id}
</update> </update>
<update id="changeTaskDevStatus">
UPDATE device_task
SET status = #{status}
WHERE id = #{id}
</update>
<update id="changeExecAttackTypeInValue"> <update id="changeExecAttackTypeInValue">
UPDATE device_task UPDATE device_task
SET execAttackTypeIn = #{attackTypeValue} SET execAttackTypeIn = #{attackTypeValue}

View File

@ -30,6 +30,7 @@
<result column="externId" property="externId"/> <result column="externId" property="externId"/>
<result column="errRetry" property="errRetry"/> <result column="errRetry" property="errRetry"/>
<result column="status" property="status"/> <result column="status" property="status"/>
<result column="devStatus" property="devStatus"/>
</collection> </collection>
</resultMap> </resultMap>
@ -61,6 +62,7 @@
ti.attackTypeStatusOut attackTypeStatusOut, ti.attackTypeStatusOut attackTypeStatusOut,
ti.externId externId, ti.externId externId,
ti.errRetry errRetry, ti.errRetry errRetry,
ti.devStatus devStatus,
ti.status status ti.status status
FROM dispose_task dt FROM dispose_task dt
LEFT JOIN device_task ti on dt.id = ti.taskId LEFT JOIN device_task ti on dt.id = ti.taskId
@ -84,6 +86,7 @@
ti.attackTypeStatusOut attackTypeStatusOut, ti.attackTypeStatusOut attackTypeStatusOut,
ti.externId externId, ti.externId externId,
ti.errRetry errRetry, ti.errRetry errRetry,
ti.devStatus devStatus,
ti.status status ti.status status
FROM dispose_task dt FROM dispose_task dt
LEFT JOIN device_task ti on dt.id = ti.taskId LEFT JOIN device_task ti on dt.id = ti.taskId
@ -103,6 +106,7 @@
ti.attackTypeStatusOut attackTypeStatusOut, ti.attackTypeStatusOut attackTypeStatusOut,
ti.externId externId, ti.externId externId,
ti.errRetry errRetry, ti.errRetry errRetry,
ti.devStatus devStatus,
ti.status status ti.status status
FROM dispose_task dt FROM dispose_task dt
LEFT JOIN device_task ti on dt.id = ti.taskId LEFT JOIN device_task ti on dt.id = ti.taskId

View File

@ -36,6 +36,7 @@ CREATE TABLE `device_task`
`externId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '扩展任务ID', `externId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '扩展任务ID',
`errRetry` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '调用失败重试次数', `errRetry` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '调用失败重试次数',
`status` int(10) 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, PRIMARY KEY (`id`) USING BTREE,
INDEX `task_info_ibfk_1` (`taskId`) USING BTREE, INDEX `task_info_ibfk_1` (`taskId`) USING BTREE,
INDEX `task_info_ibfk_2` (`deviceId`) 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, 8796093022207,
1024, 0); 1024, 0);
INSERT INTO `dispose_task` 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); 1024, 0);
-- ---------------------------- -- ----------------------------