REM:
1. 增加startDispose接口
This commit is contained in:
HuangXin 2020-10-10 08:43:18 +08:00
parent 2934fb902d
commit 34462a418c
7 changed files with 429 additions and 75 deletions

View File

@ -13,11 +13,15 @@ import com.dispose.pojo.dto.protocol.base.IdArraysReq;
import com.dispose.pojo.dto.protocol.base.ProtocolReqDTO;
import com.dispose.pojo.dto.protocol.base.ProtocolRespDTO;
import com.dispose.pojo.dto.protocol.device.manager.BasePagesGetReq;
import com.dispose.pojo.dto.protocol.task.DisposeObject;
import com.dispose.pojo.dto.protocol.task.DisposeTaskStartReq;
import com.dispose.pojo.dto.protocol.task.DisposeTaskStartRsp;
import com.dispose.pojo.dto.protocol.task.GetDeviceTaskDetail;
import com.dispose.pojo.dto.protocol.task.GetTaskDetail;
import com.dispose.pojo.dto.protocol.task.GetTaskRsp;
import com.dispose.pojo.dto.protocol.task.IpTaskStartReq;
import com.dispose.pojo.dto.protocol.task.IpTaskStartRsp;
import com.dispose.pojo.dto.protocol.task.TaskStartInfo;
import com.dispose.pojo.dto.protocol.task.TaskStartMulRsp;
import com.dispose.pojo.dto.protocol.task.TaskStopItem;
import com.dispose.pojo.dto.protocol.task.TaskStopRsp;
@ -80,6 +84,70 @@ public class DisposeTaskController {
@Resource
private UserAccountService userAccountService;
@PostMapping("/startDispose")
@ResponseBody
@ApiOperation("启动处置任务")
public ProtocolRespDTO<DisposeTaskStartRsp> startDisposeTask(@Validated(ValidGroups.TaskStartReqValid.class)
@RequestBody ProtocolReqDTO<DisposeTaskStartReq> mr,
@NotNull @RequestHeader HttpHeaders headers) {
DisposeTaskStartReq req = mr.getMsgContent();
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());
NetflowDirection netDir = CommonEnumHandler.codeOf(NetflowDirection.class,
Optional.ofNullable(req.getFlowDirection()).orElse(2));
Long attackType = DDoSAttackType.getTypeMaskFromAttackType(Optional.ofNullable(req.getAttackType())
.orElse(new Integer[]{DDoSAttackType.ALL_ATTACKS.getValue()}));
Integer flowBand = Optional.ofNullable(req.getFlowBandwidth())
.orElse(DisposeConfigValue.DEFAULT_DISPOSE_BANDWIDTH);
DisposeTaskStartRsp rspInfo = DisposeTaskStartRsp.builder()
.items(new ArrayList<>())
.build();
for (DisposeObject v : req.getDisposeObjects()) {
DisposeObjectType t = CommonEnumHandler.codeOf(DisposeObjectType.class, v.getObjectType());
// 构造处置任务参数
DisposeTask task = DisposeTask.builder()
.deviceId(devId)
.accountId(aId)
.disposeCapacity(capType)
.disposeObject(Helper.ipAddressNormalize(v.getDisposeObject()))
.objectType(t)
.planEndTime(endTime)
.flowDirection(netDir)
.attackType(attackType)
.flowBandWidth(flowBand)
.build();
// 创建处置任务
MulReturnType<ErrorCode, DisposeTask> ret = disposeTaskService.createTask(task);
// 设置返回消息
TaskStartInfo rspItem = TaskStartInfo.builder()
.disposeObject(v.getDisposeObject())
.objectType(v.getObjectType())
.build();
// 启动任务成功
if (ret.getFirstParam() == ErrorCode.ERR_OK ||
ret.getFirstParam() == ErrorCode.ERR_TASKRUNNING) {
rspItem.setTaskId(ret.getSecondParam().getId().toString());
rspItem.setExpireTime(ret.getSecondParam().getPlanEndTime());
}
rspItem.setStatus(ret.getFirstParam().getCode());
rspItem.setMessage(new String[]{ret.getFirstParam().getMsg()});
rspInfo.getItems().add(rspItem);
}
return ProtocolRespDTO.result(ErrorCode.ERR_OK, rspInfo);
}
/**
* Start task protocol resp dto.
*

View File

@ -0,0 +1,41 @@
package com.dispose.pojo.dto.protocol.task;
import com.dispose.common.DisposeObjectType;
import com.dispose.validation.group.ValidGroups;
import com.dispose.validation.valids.ValidBaseEnum;
import com.dispose.validation.valids.ValidDisposeObject;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.GroupSequence;
import javax.validation.constraints.NotNull;
/**
* The type Dispose object.
*
* @author <huangxin@cmhi.chinamoblie.com>
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@ValidDisposeObject(groups = ValidGroups.TaskStartReqValid.class)
@GroupSequence({ValidGroups.TaskStartReqValid.class, DisposeObject.class})
public class DisposeObject {
/**
* The Dispose object.
*/
@NotNull(message = "disposeObject 处置对象不能为空", groups = ValidGroups.TaskStartReqValid.class)
private String disposeObject;
/**
* The Object type.
*/
@NotNull(message = "objectType 处置类型不能为空", groups = ValidGroups.TaskStartReqValid.class)
@ValidBaseEnum(enumClass = DisposeObjectType.class, groups = ValidGroups.TaskStartReqValid.class)
private Integer objectType;
}

View File

@ -0,0 +1,69 @@
package com.dispose.pojo.dto.protocol.task;
import com.dispose.common.DDoSAttackType;
import com.dispose.common.DisposeCapacityType;
import com.dispose.common.NetflowDirection;
import com.dispose.validation.group.ValidGroups;
import com.dispose.validation.valids.ValidBaseEnum;
import com.dispose.validation.valids.ValidBaseEnumArray;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* The type Dispose task start req.
*
* @author <huangxin@cmhi.chinamoblie.com>
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class DisposeTaskStartReq {
/**
* The Device id.
*/
private String deviceId;
/**
* The Type.
*/
@NotNull(message = "type 处置类型不能为空", groups = ValidGroups.TaskStartReqCommonValid.class)
@ValidBaseEnum(enumClass = DisposeCapacityType.class, groups = ValidGroups.TaskStartReqCommonValid.class)
private Integer type;
/**
* The Dispose objects.
*/
@NotNull(message = "disposeObjects 处置对象不能为空", groups = ValidGroups.TaskStartReqCommonValid.class)
@Size(min = 1, message = "disposeObjects 至少需要有一个元素", groups = ValidGroups.TaskStartReqCommonValid.class)
@Valid
private DisposeObject[] disposeObjects;
/**
* The Dispose time.
*/
@NotNull(message = "disposeTime 处置时间不能为空", groups = ValidGroups.TaskStartReqCommonValid.class)
private Integer disposeTime;
/**
* The Flow direction.
*/
@ValidBaseEnum(enumClass = NetflowDirection.class, groups = ValidGroups.TaskStartReqCommonValid.class)
private Integer flowDirection;
/**
* The Attack type.
*/
@ValidBaseEnumArray(enumClass = DDoSAttackType.class, groups = ValidGroups.TaskStartReqCommonValid.class)
@Size(min = 1, message = "attackType 必须指定最少一种攻击类型", groups = ValidGroups.TaskStartReqCommonValid.class)
private Integer[] attackType;
/**
* The Flow bandwidth.
*/
private Integer flowBandwidth;
}

View File

@ -0,0 +1,26 @@
package com.dispose.pojo.dto.protocol.task;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* The type Dispose task start rsp.
*
* @author <huangxin@cmhi.chinamoblie.com>
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class DisposeTaskStartRsp {
/**
* The Items.
*/
List<TaskStartInfo> items;
}

View File

@ -0,0 +1,37 @@
package com.dispose.pojo.dto.protocol.task;
import com.dispose.pojo.dto.protocol.base.BaseIdResp;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* The type Dispose task start rsp.
*
* @author <huangxin@cmhi.chinamoblie.com>
*/
@EqualsAndHashCode(callSuper = true)
@Data
@Builder
@AllArgsConstructor
@JsonPropertyOrder({"taskId", "disposeObject", "objectType", "expireTime", "status", "message"})
@JsonInclude(JsonInclude.Include.NON_NULL)
public class TaskStartInfo extends BaseIdResp {
/**
* The Dispose ip.
*/
private String disposeObject;
/**
* The Object type.
*/
private Integer objectType;
/**
* The Expire time.
*/
private String expireTime;
}

View File

@ -0,0 +1,43 @@
package com.dispose.validation.valids;
import com.dispose.validation.valids.impl.ValidDisposeObjectImpl;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* The interface Valid dispose object.
*
* @author <huangxin@cmhi.chinamoblie.com>
*/
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {ValidDisposeObjectImpl.class})
public @interface ValidDisposeObject {
/**
* Message string.
*
* @return the string
*/
String message() default "";
/**
* Groups class [ ].
*
* @return the class [ ]
*/
Class<?>[] groups() default {};
/**
* Payload class [ ].
*
* @return the class [ ]
*/
Class<? extends Payload>[] payload() default {};
}

View File

@ -0,0 +1,70 @@
package com.dispose.validation.valids.impl;
import com.dispose.common.ConstValue;
import com.dispose.common.DisposeObjectType;
import com.dispose.pojo.dto.protocol.task.DisposeObject;
import com.dispose.validation.valids.ValidDisposeObject;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
/**
* The type Valid dispose object.
*
* @author <huangxin@cmhi.chinamoblie.com>
*/
public class ValidDisposeObjectImpl implements ConstraintValidator<ValidDisposeObject, DisposeObject> {
/**
* The Message.
*/
private String message;
/**
* Initialize.
*
* @param constraintAnnotation the constraint annotation
*/
@Override
public void initialize(ValidDisposeObject constraintAnnotation) {
this.message = constraintAnnotation.message();
}
/**
* Is valid boolean.
*
* @param disposeObject the dispose object
* @param ctx the ctx
* @return the boolean
*/
@Override
public boolean isValid(DisposeObject disposeObject, ConstraintValidatorContext ctx) {
boolean ret = true;
if (disposeObject == null || disposeObject.getDisposeObject() == null || disposeObject.getObjectType() == null) {
return true;
}
if(disposeObject.getDisposeObject().length() == 0) {
return true;
}
List<String> errMsg = new ArrayList<>();
// IP 地址进行验证
if ((disposeObject.getObjectType() & DisposeObjectType.IP.getValue()) != 0) {
if (!Pattern.matches(ConstValue.ipAddrSegmentReg(), disposeObject.getDisposeObject())) {
errMsg.add("字段 disposeObject 包含非法值: " + disposeObject.getDisposeObject());
ret = false;
}
}
// 重新设置消息
ctx.disableDefaultConstraintViolation();
ctx.buildConstraintViolationWithTemplate(this.message + " " + errMsg.toString()).addConstraintViolation();
return ret;
}
}