diff --git a/agent/src/main/java/io/wdd/agent/config/message/handler/OMHandlerExecutor.java b/agent/src/main/java/io/wdd/agent/config/message/handler/OMHandlerExecutor.java index 32dbb61..019aa01 100644 --- a/agent/src/main/java/io/wdd/agent/config/message/handler/OMHandlerExecutor.java +++ b/agent/src/main/java/io/wdd/agent/config/message/handler/OMHandlerExecutor.java @@ -55,6 +55,7 @@ public class OMHandlerExecutor extends AbstractOctopusMessageHandler { return true; } + // 只有 在预先定义的脚本缓存中查找到 才执行 功能类型 String executionType = executionMessage.getType(); if (ALL_FUNCTION_MAP.containsKey(executionType)) { // execute the exist function diff --git a/common/src/main/java/io/wdd/common/handler/GlobalExceptionHandler.java b/common/src/main/java/io/wdd/common/handler/GlobalExceptionHandler.java index 052ace4..12fc79d 100644 --- a/common/src/main/java/io/wdd/common/handler/GlobalExceptionHandler.java +++ b/common/src/main/java/io/wdd/common/handler/GlobalExceptionHandler.java @@ -42,14 +42,23 @@ public class GlobalExceptionHandler { public R MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) { // 从异常对象中拿到ObjectError对象,获取所有的错误信息 - List objectError = e.getBindingResult().getAllErrors(); + List objectError = e + .getBindingResult() + .getAllErrors(); // 然后提取错误提示信息进行返回 HashMap errorMap = new HashMap<>(); - objectError.forEach(objectError1 -> errorMap.put(objectError.indexOf(objectError1), objectError1.getDefaultMessage())); + objectError.forEach(objectError1 -> errorMap.put( + objectError.indexOf(objectError1), + objectError1.getDefaultMessage() + )); // 使用标准化返回体返回数据 - return R.resetResult(ResultStat.VALIDATE_FAILED.getCode(), ResultStat.VALIDATE_FAILED.getDescription(), errorMap); + return R.resetResult( + ResultStat.VALIDATE_FAILED.getCode(), + ResultStat.VALIDATE_FAILED.getDescription(), + errorMap + ); //return errorMap; } @@ -62,14 +71,22 @@ public class GlobalExceptionHandler { //按需重新封装需要返回的错误信息 Map invalidMap = new LinkedHashMap(99); //解析原错误信息,封装后返回,此处返回非法的字段名称,原始值,错误信息 - invalidMap.put(exception.getParameter().getParameterName(), ResultStat.PARAM_ERROR.getDescription()); + invalidMap.put( + exception + .getParameter() + .getParameterName(), + ResultStat.PARAM_ERROR.getDescription() + ); R> vo = new R<>(); vo.setCode(ResultStat.PARAM_ERROR.getCode()); vo.setMsg(getLocaleMsg(ResultStat.PARAM_ERROR.getDescription())); vo.setData(invalidMap); - log.debug(exception.getMessage(), exception); + log.debug( + exception.getMessage(), + exception + ); return vo; } @@ -93,7 +110,10 @@ public class GlobalExceptionHandler { vo.setData("数据库异常,操作失败!"); } - log.debug(exception.getMessage(), exception); + log.debug( + exception.getMessage(), + exception + ); return vo; } @@ -104,12 +124,18 @@ public class GlobalExceptionHandler { R R = new R<>(); ResultStat status = exception.getStatus(); if (status != null) { - R.setMsg(getLocaleMsg(exception.getMessage(), exception.getParams())); + R.setMsg(getLocaleMsg( + exception.getMessage(), + exception.getParams() + )); R.setCode(status.getCode()); R.setData(exception.getData()); } else { R.setCode(ResultStat.FAILED.getCode()); - R.setMsg(getLocaleMsg(exception.getMessage(), exception.getParams())); + R.setMsg(getLocaleMsg( + exception.getMessage(), + exception.getParams() + )); R.setData(null); } return R; @@ -136,20 +162,34 @@ public class GlobalExceptionHandler { //解析原错误信息,封装后返回,此处返回非法的字段名称,原始值,错误信息 if (exception != null) { - List fieldErrors = exception.getBindingResult().getFieldErrors(); - fieldErrors.stream().sorted(Comparator.comparing(FieldError::getCode)).forEach(error -> { - String defaultMessage = error.getDefaultMessage(); - String finalMessage = defaultMessage; - if (defaultMessage != null && defaultMessage.startsWith("{") && defaultMessage.endsWith("}")) { - finalMessage = messageSource.getMessage(defaultMessage.substring(1, defaultMessage.length() - 1)); - } + List fieldErrors = exception + .getBindingResult() + .getFieldErrors(); + fieldErrors + .stream() + .sorted(Comparator.comparing(FieldError::getCode)) + .forEach(error -> { + String defaultMessage = error.getDefaultMessage(); + String finalMessage = defaultMessage; + if (defaultMessage != null && defaultMessage.startsWith("{") && defaultMessage.endsWith("}")) { + finalMessage = messageSource.getMessage(defaultMessage.substring( + 1, + defaultMessage.length() - 1 + )); + } - if (StringUtils.isNotEmpty(invalidMap.get(error.getField()))) { - invalidMap.put(error.getField(), invalidMap.get(error.getField()) + "," + finalMessage); - } else { - invalidMap.put(error.getField(), finalMessage); - } - }); + if (StringUtils.isNotEmpty(invalidMap.get(error.getField()))) { + invalidMap.put( + error.getField(), + invalidMap.get(error.getField()) + "," + finalMessage + ); + } else { + invalidMap.put( + error.getField(), + finalMessage + ); + } + }); } R> vo = new R<>(); @@ -157,7 +197,10 @@ public class GlobalExceptionHandler { vo.setMsg(getLocaleMsg(ResultStat.VALIDATE_FAILED.getDescription())); vo.setData(invalidMap); - log.debug(exception.getMessage(), exception); + log.debug( + exception.getMessage(), + exception + ); return vo; @@ -168,7 +211,10 @@ public class GlobalExceptionHandler { */ @ExceptionHandler(value = Exception.class) public Object exceptionHandel(Exception e) { - return getResponseVO(e, getLocaleMsg("系统错误,请联系管理员")); + return getResponseVO( + e, + getLocaleMsg("系统错误,请联系管理员") + ); } private Object getResponseVO(Exception e, String msg) { @@ -176,12 +222,20 @@ public class GlobalExceptionHandler { R.setCode(ResultStat.FAILED.getCode()); R.setMsg(msg); R.setMsg(e.getMessage()); - log.error(e.getMessage(), e); + + // 此处修改不要打印 错误 e + log.error( + e.getMessage(), + e + ); return R; } private String getLocaleMsg(String msgCode, Object... params) { - return messageSource.getMessage(msgCode, params); + return messageSource.getMessage( + msgCode, + params + ); } } diff --git a/common/src/main/java/io/wdd/common/utils/FunctionReader.java b/common/src/main/java/io/wdd/common/utils/FunctionReader.java index cec3b63..47b7469 100644 --- a/common/src/main/java/io/wdd/common/utils/FunctionReader.java +++ b/common/src/main/java/io/wdd/common/utils/FunctionReader.java @@ -47,7 +47,9 @@ public class FunctionReader { try { // 构造一个 buffered Reader - BufferedReader bufferedReader = new BufferedReader(new StringReader(functionContent)); + BufferedReader bufferedReader = new BufferedReader( + new StringReader(functionContent) + ); // 执行read操作 result = doReadContent( @@ -63,6 +65,14 @@ public class FunctionReader { } + /** + * 实际解析从前端传入的 脚本命令, 将其转换为 List> + * + * @param result + * @param bufferedReader + * @return + * @throws IOException + */ private static List> doReadContent(List> result, BufferedReader bufferedReader) throws IOException { String line = bufferedReader.readLine(); @@ -73,7 +83,7 @@ public class FunctionReader { while (line != null) { if (!StringUtils.isEmpty(line)) { - result.add(SplitLineToCommandList(line)); + result.add(SplitSpaceIndentToCommandList(line)); } line = bufferedReader.readLine(); } @@ -81,10 +91,25 @@ public class FunctionReader { return result; } - public static List SplitLineToCommandList(String commandLine) { + public static List SplitSpaceIndentToCommandList(String commandLine) { return Arrays - .stream(commandLine.split(" ")) + .stream(commandLine + .split(" ")) + .collect(Collectors.toList()); + } + + public static List SplitCommaIndentToCommandList(String commandLine) { + + // 需要进行归一化,去除掉多余的空格 + return Arrays + .stream(commandLine.split(",")) + .map( + split -> split.replace( + " ", + "" + ) + ) .collect(Collectors.toList()); } diff --git a/server/src/main/java/io/wdd/func/xray/beans/node/ProxyNodeSet.java b/server/src/main/java/io/wdd/func/xray/beans/node/ProxyNodeSet.java index 56bd235..edd58a7 100644 --- a/server/src/main/java/io/wdd/func/xray/beans/node/ProxyNodeSet.java +++ b/server/src/main/java/io/wdd/func/xray/beans/node/ProxyNodeSet.java @@ -94,13 +94,13 @@ public class ProxyNodeSet { chengduAgent = ProxyNode .builder() - .location("Chengdu") + .location("Tokyo") .num(99) - .publicIPv4("183.220.112.113") + .publicIPv4("34.146.3.239") .proxyNodeType(ProxyNodeType.EXTERNAL) - .name("chengdu-agent") - .agentName("Chengdu-amd64-77") - .agentTopicName("Chengdu-amd64-77-remote") + .name("tokyo-07") + .agentName("Tokyo-amd64-07") + .agentTopicName("Tokyo-amd64-07-f66a41") .build(); ProxyNodeMap.put(chengdu.getNum(), chengdu); diff --git a/server/src/main/java/io/wdd/rpc/execute/service/CoreExecutionServiceImpl.java b/server/src/main/java/io/wdd/rpc/execute/service/CoreExecutionServiceImpl.java index 52b936a..952d9c3 100644 --- a/server/src/main/java/io/wdd/rpc/execute/service/CoreExecutionServiceImpl.java +++ b/server/src/main/java/io/wdd/rpc/execute/service/CoreExecutionServiceImpl.java @@ -88,7 +88,8 @@ public class CoreExecutionServiceImpl implements CoreExecutionService { "agentTopicName异常! 输入为 => {}", agentTopicName ); - throw new MyRuntimeException("agentTopicName异常!" + agentTopicName); + return null; + //throw new MyRuntimeException("agentTopicName异常!" + agentTopicName); } // 归一化type类型 不行 diff --git a/server/src/main/java/io/wdd/rpc/scheduler/beans/ScriptSchedulerVO.java b/server/src/main/java/io/wdd/rpc/scheduler/beans/ScriptSchedulerVO.java index 5c424d0..ac41731 100644 --- a/server/src/main/java/io/wdd/rpc/scheduler/beans/ScriptSchedulerVO.java +++ b/server/src/main/java/io/wdd/rpc/scheduler/beans/ScriptSchedulerVO.java @@ -3,6 +3,7 @@ package io.wdd.rpc.scheduler.beans; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -54,6 +55,7 @@ public class ScriptSchedulerVO { * 脚本任务的内容 */ @TableField(value = "script_content") + @ApiModelProperty("单行命令之间使用 空格 分隔, 每一行之间使用 \\n 分隔") @Nullable private String scriptContent; diff --git a/server/src/main/java/io/wdd/rpc/scheduler/service/QuartzSchedulerServiceImpl.java b/server/src/main/java/io/wdd/rpc/scheduler/service/QuartzSchedulerServiceImpl.java index 097c124..66e29cb 100644 --- a/server/src/main/java/io/wdd/rpc/scheduler/service/QuartzSchedulerServiceImpl.java +++ b/server/src/main/java/io/wdd/rpc/scheduler/service/QuartzSchedulerServiceImpl.java @@ -11,7 +11,6 @@ import io.wdd.server.beans.po.ScriptSchedulerPO; import io.wdd.server.service.ScriptSchedulerService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.beanutils.BeanUtils; -import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.quartz.*; @@ -33,20 +32,16 @@ import static org.quartz.TriggerBuilder.newTrigger; @Service public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { - @Resource - ScriptSchedulerService scriptSchedulerService; - - @Resource - QuartzSchedulerUtils quartzSchedulerUtils; - - @Autowired - private Scheduler scheduler; - /** * 保存 定时脚本任务的中间DTO,在Quartz框架中JobDataMap的Key名称 */ public static final String SCRIPT_SCHEDULER_MISSION_KEY = "scriptSchedulerDTO"; - + @Resource + ScriptSchedulerService scriptSchedulerService; + @Resource + QuartzSchedulerUtils quartzSchedulerUtils; + @Autowired + private Scheduler scheduler; @Override public HashMap createScriptScheduledMission(ScriptSchedulerVO scriptSchedulerVO) { @@ -75,6 +70,7 @@ public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { dataMap ); + // 生成下一次真正执行的任务ResultKey HashMap futureExecutionResultKey = quartzSchedulerUtils.generateAndSetFutureExecutionResultKey(scriptSchedulerDTO); log.debug( @@ -82,8 +78,14 @@ public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { futureExecutionResultKey ); - log.info("[ 定时脚本任务 ] - 新建任务成功, 任务DTO为 => {}", scriptSchedulerDTO); - log.info("[ 定时脚本任务 ] - 新建任务成功, 任务内容为 => {}", jobDetail); + log.info( + "[ 定时脚本任务 ] - 新建任务成功, 任务DTO为 => {}", + scriptSchedulerDTO + ); + log.info( + "[ 定时脚本任务 ] - 新建任务成功, 任务内容为 => {}", + jobDetail + ); // persistent the script scheduled mission // dto should store more info @@ -132,23 +134,31 @@ public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { } // 归一化 completeCommandList - List> completeCommandList = FunctionReader.ReadStringToCommandList(scriptSchedulerVO.getScriptContent()); + List> completeCommandList = FunctionReader + .ReadStringToCommandList(scriptSchedulerVO.getScriptContent()); + if (completeCommandList.size() == 0) { - throw new MyRuntimeException("completeCommandList parse wrong !"); + throw new MyRuntimeException("完整的命令脚本列表解析错误!"); } // 执行机器目标归一化 String[] targetMachineSplit = scriptSchedulerVO .getTargetMachine() .split(","); - if (targetMachineSplit.length == 0) { + List goodTargetMachine = Arrays + .stream(targetMachineSplit) + .map( + machine -> machine.replace( + " ", + "" + ) + ) + .collect(Collectors.toList()); + if (goodTargetMachine.size() == 0) { throw new MyRuntimeException("target machine wrong !"); } - ArrayList targetMachineList = new ArrayList<>(); - Collections.addAll( - targetMachineList, - targetMachineSplit - ); + // 防止于最终对线中 + ArrayList targetMachineList = new ArrayList<>(goodTargetMachine); // 生成DTO对象 ScriptSchedulerDTO dto = new ScriptSchedulerDTO(); @@ -317,7 +327,7 @@ public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { trigger ); - return jobDetail; + return jobDetail; } catch (Exception e) { @@ -576,8 +586,10 @@ public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { // 修改JobDetail信息 ScriptSchedulerDTO scriptSchedulerDTO = validateAndConvertToScriptSchedulerDTO(scriptSchedulerVO); JobDataMap map = jobDetail.getJobDataMap(); - map.put(SCRIPT_SCHEDULER_MISSION_KEY, - scriptSchedulerDTO); + map.put( + SCRIPT_SCHEDULER_MISSION_KEY, + scriptSchedulerDTO + ); // 修改 Mission相应的 cron时间信息 updateMission(