From 6bd2640af713e83f88c0912907ad6adcf9de0eab Mon Sep 17 00:00:00 2001 From: lijiahang Date: Thu, 14 Mar 2024 19:46:05 +0800 Subject: [PATCH] =?UTF-8?q?:hammer:=20=E6=89=A7=E8=A1=8C=E5=91=BD=E4=BB=A4?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../asset/controller/ExecController.java | 14 +- .../ops/module/asset/dao/ExecHostLogDAO.java | 16 ++ .../request/exec/ExecCommandRequest.java | 3 - .../request/exec/ReExecCommandRequest.java | 24 ++ .../ops/module/asset/service/ExecService.java | 8 + .../service/impl/ExecHostLogServiceImpl.java | 15 ++ .../service/impl/ExecLogServiceImpl.java | 25 ++ .../asset/service/impl/ExecServiceImpl.java | 65 +++-- orion-ops-ui/src/api/exec/exec.ts | 10 +- .../host/authorized-host-modal/index.vue | 2 +- .../src/components/view/exec-editor/const.ts | 56 +++++ .../src/components/view/exec-editor/index.vue | 86 +++++++ .../src/router/routes/modules/exec.ts | 12 +- .../src/views/exec/exec-command/index.vue | 17 ++ .../exec/exec-command/types/form.rules.ts | 33 +++ .../components/exec-host-log-table.vue | 2 +- .../components/exec-log-clear-modal.vue | 162 +++++++++++++ .../exec-log/components/exec-log-table.vue | 114 ++++++++- .../src/views/exec/exec-log/index.vue | 22 +- .../components/exec-template-exec-drawer.vue | 223 ++++++++++++++++++ .../components/exec-template-form-drawer.vue | 87 ++----- .../components/exec-template-table.vue | 11 +- .../src/views/exec/exec-template/index.vue | 13 +- .../views/exec/exec-template/types/const.ts | 56 ----- .../exec/exec-template/types/form.rules.ts | 5 + 25 files changed, 900 insertions(+), 181 deletions(-) create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ReExecCommandRequest.java create mode 100644 orion-ops-ui/src/components/view/exec-editor/const.ts create mode 100644 orion-ops-ui/src/components/view/exec-editor/index.vue create mode 100644 orion-ops-ui/src/views/exec/exec-command/index.vue create mode 100644 orion-ops-ui/src/views/exec/exec-command/types/form.rules.ts create mode 100644 orion-ops-ui/src/views/exec/exec-log/components/exec-log-clear-modal.vue create mode 100644 orion-ops-ui/src/views/exec/exec-template/components/exec-template-exec-drawer.vue diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecController.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecController.java index 6846b878..aa58078f 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecController.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecController.java @@ -7,6 +7,7 @@ import com.orion.ops.framework.web.core.annotation.RestWrapper; import com.orion.ops.module.asset.define.operator.ExecOperatorType; import com.orion.ops.module.asset.entity.request.exec.ExecCommandRequest; import com.orion.ops.module.asset.entity.request.exec.ExecInterruptRequest; +import com.orion.ops.module.asset.entity.request.exec.ReExecCommandRequest; import com.orion.ops.module.asset.entity.vo.ExecCommandVO; import com.orion.ops.module.asset.service.ExecService; import io.swagger.v3.oas.annotations.Operation; @@ -41,10 +42,18 @@ public class ExecController { @PostMapping("/exec-command") @Operation(summary = "批量执行命令") @PreAuthorize("@ss.hasPermission('asset:exec:exec-command')") - public ExecCommandVO execCommand(@RequestBody ExecCommandRequest request) { + public ExecCommandVO execCommand(@Validated @RequestBody ExecCommandRequest request) { return execService.execCommand(request); } + @OperatorLog(ExecOperatorType.EXEC_COMMAND) + @PostMapping("/re-exec-command") + @Operation(summary = "重新执行命令") + @PreAuthorize("@ss.hasPermission('asset:exec:exec-command')") + public ExecCommandVO reExecCommand(@Validated @RequestBody ReExecCommandRequest request) { + return execService.reExecCommand(request.getLogId()); + } + @OperatorLog(ExecOperatorType.INTERRUPT_EXEC) @PutMapping("/interrupt") @Operation(summary = "中断执行命令") @@ -66,7 +75,6 @@ public class ExecController { } // TODO tail log - // TODO 重新执行 - // TODO 删除时 中断 + // TODO parameterSchema 存储 } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/dao/ExecHostLogDAO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/dao/ExecHostLogDAO.java index e4d8d5f0..e7122dc7 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/dao/ExecHostLogDAO.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/dao/ExecHostLogDAO.java @@ -4,6 +4,8 @@ import com.orion.ops.framework.mybatis.core.mapper.IMapper; import com.orion.ops.module.asset.entity.domain.ExecHostLogDO; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * 批量执行主机日志 Mapper 接口 * @@ -14,4 +16,18 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface ExecHostLogDAO extends IMapper { + /** + * 通过 logId 查询 + * + * @param logId logId + * @return rows + */ + default List selectByLogId(Long logId) { + return this.of() + .createWrapper() + .eq(ExecHostLogDO::getLogId, logId) + .then() + .list(); + } + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecCommandRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecCommandRequest.java index 752bd125..93440067 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecCommandRequest.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecCommandRequest.java @@ -22,9 +22,6 @@ import java.util.List; @Schema(name = "ExecCommandRequest", description = "批量执行命令 请求对象") public class ExecCommandRequest { - @Schema(description = "执行模板id") - private Long templateId; - @Size(max = 128) @Schema(description = "执行描述") private String description; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ReExecCommandRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ReExecCommandRequest.java new file mode 100644 index 00000000..f811e682 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ReExecCommandRequest.java @@ -0,0 +1,24 @@ +package com.orion.ops.module.asset.entity.request.exec; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +/** + * 重新执行命令 请求对象 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2024/3/11 11:46 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(name = "ReExecCommandRequest", description = "重新执行命令 请求对象") +public class ReExecCommandRequest { + + @NonNull + @Schema(description = "logId") + private Long logId; + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecService.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecService.java index 49332c0b..d016aae1 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecService.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecService.java @@ -20,6 +20,14 @@ public interface ExecService { */ ExecCommandVO execCommand(ExecCommandRequest request); + /** + * 重新执行命令 + * + * @param id id + * @return result + */ + ExecCommandVO reExecCommand(Long id); + /** * 中断命令执行 * diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecHostLogServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecHostLogServiceImpl.java index 28419404..c001e44f 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecHostLogServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecHostLogServiceImpl.java @@ -9,6 +9,9 @@ import com.orion.ops.module.asset.convert.ExecHostLogConvert; import com.orion.ops.module.asset.dao.ExecHostLogDAO; import com.orion.ops.module.asset.entity.domain.ExecHostLogDO; import com.orion.ops.module.asset.entity.vo.ExecHostLogVO; +import com.orion.ops.module.asset.handler.host.exec.handler.IExecCommandHandler; +import com.orion.ops.module.asset.handler.host.exec.handler.IExecTaskHandler; +import com.orion.ops.module.asset.handler.host.exec.manager.ExecManager; import com.orion.ops.module.asset.service.ExecHostLogService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -16,6 +19,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; +import java.util.Optional; /** * 批量执行主机日志 服务实现类 @@ -31,6 +35,9 @@ public class ExecHostLogServiceImpl implements ExecHostLogService { @Resource private ExecHostLogDAO execHostLogDAO; + @Resource + private ExecManager execManager; + @Override public List getExecHostLogList(Long logId) { return execHostLogDAO.of() @@ -65,6 +72,14 @@ public class ExecHostLogServiceImpl implements ExecHostLogService { // 检查数据是否存在 ExecHostLogDO record = execHostLogDAO.selectById(id); Valid.notNull(record, ErrorMessage.DATA_ABSENT); + // 中断 + Optional.ofNullable(record.getLogId()) + .map(execManager::getTask) + .map(IExecTaskHandler::getHandlers) + .flatMap(s -> s.stream() + .filter(h -> h.getHostId().equals(record.getHostId())) + .findFirst()) + .ifPresent(IExecCommandHandler::interrupted); // 删除 int effect = execHostLogDAO.deleteById(id); log.info("ExecHostLogService-deleteExecHostLogById id: {}, effect: {}", id, effect); diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecLogServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecLogServiceImpl.java index 5f00651f..f563d8de 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecLogServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecLogServiceImpl.java @@ -18,6 +18,8 @@ import com.orion.ops.module.asset.entity.request.exec.ExecLogQueryRequest; import com.orion.ops.module.asset.entity.vo.ExecHostLogVO; import com.orion.ops.module.asset.entity.vo.ExecLogStatusVO; import com.orion.ops.module.asset.entity.vo.ExecLogVO; +import com.orion.ops.module.asset.handler.host.exec.handler.IExecTaskHandler; +import com.orion.ops.module.asset.handler.host.exec.manager.ExecManager; import com.orion.ops.module.asset.service.ExecHostLogService; import com.orion.ops.module.asset.service.ExecLogService; import lombok.extern.slf4j.Slf4j; @@ -26,6 +28,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -48,6 +51,9 @@ public class ExecLogServiceImpl implements ExecLogService { @Resource private ExecHostLogService execHostLogService; + @Resource + private ExecManager execManager; + @Override public DataGrid getExecLogPage(ExecLogQueryRequest request) { // 条件 @@ -74,6 +80,7 @@ public class ExecLogServiceImpl implements ExecLogService { List hostList = execHostLogDAO.of() .createWrapper() .select(ExecHostLogDO::getId, + ExecHostLogDO::getLogId, ExecHostLogDO::getStatus, ExecHostLogDO::getStartTime, ExecHostLogDO::getFinishTime, @@ -101,6 +108,8 @@ public class ExecLogServiceImpl implements ExecLogService { // 检查数据是否存在 ExecLogDO record = execLogDAO.selectById(id); Valid.notNull(record, ErrorMessage.DATA_ABSENT); + // 中断命令执行 + this.interruptedTask(Lists.singleton(id)); // 删除执行日志 int effect = execLogDAO.deleteById(id); // 删除主机日志 @@ -115,6 +124,8 @@ public class ExecLogServiceImpl implements ExecLogService { @Transactional(rollbackFor = Exception.class) public Integer deleteExecLogByIdList(List idList) { log.info("ExecLogService-deleteExecLogByIdList idList: {}", idList); + // 中断命令执行 + this.interruptedTask(idList); // 删除执行日志 int effect = execLogDAO.deleteBatchIds(idList); // 删除主机日志 @@ -138,6 +149,8 @@ public class ExecLogServiceImpl implements ExecLogService { .collect(Collectors.toList()); int effect = 0; if (!idList.isEmpty()) { + // 中断命令执行 + this.interruptedTask(idList); // 删除执行日志 effect = execLogDAO.delete(wrapper); // 删除主机日志 @@ -170,4 +183,16 @@ public class ExecLogServiceImpl implements ExecLogService { .orderByDesc(ExecLogDO::getId); } + /** + * 中断任务 + * + * @param idList idList + */ + private void interruptedTask(List idList) { + idList.stream() + .map(execManager::getTask) + .filter(Objects::nonNull) + .forEach(IExecTaskHandler::interrupted); + } + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecServiceImpl.java index 413ebe21..c9f17a01 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecServiceImpl.java @@ -61,7 +61,7 @@ import java.util.stream.Collectors; public class ExecServiceImpl implements ExecService { private static final ReplacementFormatter FORMATTER = ReplacementFormatters.create("@{{ ", " }}") - .noMatchStrategy(NoMatchStrategy.EMPTY); + .noMatchStrategy(NoMatchStrategy.KEEP); @Resource private FileClient logsFileClient; @@ -124,23 +124,10 @@ public class ExecServiceImpl implements ExecService { .build(); }).collect(Collectors.toList()); execHostLogDAO.insertBatch(execHostLogs); - // 开始执行 - ExecCommandDTO exec = ExecCommandDTO.builder() - .logId(execId) - .timeout(request.getTimeout()) - .hosts(execHostLogs.stream() - .map(s -> ExecCommandHostDTO.builder() - .hostId(s.getHostId()) - .hostLogId(s.getId()) - .command(s.getCommand()) - .timeout(request.getTimeout()) - .logPath(s.getLogPath()) - .build()) - .collect(Collectors.toList())) - .build(); - ExecTaskExecutors.start(exec); // 操作日志 OperatorLogs.add(OperatorLogs.ID, execId); + // 开始执行 + this.startExec(execLog, execHostLogs); // 返回 List hostResult = execHostLogs.stream() .map(s -> ExecCommandHostVO.builder() @@ -154,6 +141,29 @@ public class ExecServiceImpl implements ExecService { .build(); } + @Override + public ExecCommandVO reExecCommand(Long logId) { + log.info("ExecService.reExecCommand start logId: {}", logId); + // 获取执行记录 + ExecLogDO execLog = execLogDAO.selectById(logId); + Valid.notNull(execLog, ErrorMessage.DATA_ABSENT); + // 获取执行主机 + List hostLogs = execHostLogDAO.selectByLogId(logId); + Valid.notEmpty(hostLogs, ErrorMessage.DATA_ABSENT); + List hostIdList = hostLogs.stream() + .map(ExecHostLogDO::getHostId) + .collect(Collectors.toList()); + // 调用执行方法 + ExecCommandRequest request = ExecCommandRequest.builder() + .description(execLog.getDescription()) + .timeout(execLog.getTimeout()) + .command(execLog.getCommand()) + .parameter(hostLogs.get(0).getParameter()) + .hostIdList(hostIdList) + .build(); + return this.execCommand(request); + } + @Override @Transactional(rollbackFor = Exception.class) public void interruptExec(Long logId) { @@ -250,6 +260,29 @@ public class ExecServiceImpl implements ExecService { } } + /** + * 开始执行命令 + * + * @param execLog execLog + * @param execHostLogs hostLogs + */ + private void startExec(ExecLogDO execLog, List execHostLogs) { + ExecCommandDTO exec = ExecCommandDTO.builder() + .logId(execLog.getId()) + .timeout(execLog.getTimeout()) + .hosts(execHostLogs.stream() + .map(s -> ExecCommandHostDTO.builder() + .hostId(s.getHostId()) + .hostLogId(s.getId()) + .command(s.getCommand()) + .timeout(execLog.getTimeout()) + .logPath(s.getLogPath()) + .build()) + .collect(Collectors.toList())) + .build(); + ExecTaskExecutors.start(exec); + } + /** * 构建日志路径 * diff --git a/orion-ops-ui/src/api/exec/exec.ts b/orion-ops-ui/src/api/exec/exec.ts index 61a248d9..ac61830e 100644 --- a/orion-ops-ui/src/api/exec/exec.ts +++ b/orion-ops-ui/src/api/exec/exec.ts @@ -4,11 +4,12 @@ import axios from 'axios'; * 执行命令请求 */ export interface ExecCommandRequest { - templateId?: number; + logId?: number; description?: string; timeout?: number; command?: string; parameter?: string; + parameterSchema?: string; hostIdList?: number[]; } @@ -38,6 +39,13 @@ export function execCommand(request: ExecCommandRequest) { return axios.post('/asset/exec/exec-command', request); } +/** + * 重新执行命令 + */ +export function reExecCommand(request: ExecCommandRequest) { + return axios.post('/asset/exec/re-exec-command', request); +} + /** * 中断执行命令 */ diff --git a/orion-ops-ui/src/components/asset/host/authorized-host-modal/index.vue b/orion-ops-ui/src/components/asset/host/authorized-host-modal/index.vue index bf2958d1..c5c19539 100644 --- a/orion-ops-ui/src/components/asset/host/authorized-host-modal/index.vue +++ b/orion-ops-ui/src/components/asset/host/authorized-host-modal/index.vue @@ -121,7 +121,7 @@ }); // 打开 - const open = async (hostIdList: Array) => { + const open = async (hostIdList: Array = []) => { setVisible(true); // 加载主机列表 await fetchHosts(); diff --git a/orion-ops-ui/src/components/view/exec-editor/const.ts b/orion-ops-ui/src/components/view/exec-editor/const.ts new file mode 100644 index 00000000..d0574ad9 --- /dev/null +++ b/orion-ops-ui/src/components/view/exec-editor/const.ts @@ -0,0 +1,56 @@ +// 模板参数 +export interface TemplateParam { + name?: string; + default?: string; + desc?: string; +} + +// 内置参数 +export const builtinsParams: Array = [ + { + name: 'hostId', + desc: '执行主机id' + }, { + name: 'hostName', + desc: '执行主机名称' + }, { + name: 'hostCode', + desc: '执行主机编码' + }, { + name: 'hostAddress', + desc: '执行主机地址' + }, { + name: 'userId', + desc: '执行用户id' + }, { + name: 'username', + desc: '执行用户名' + }, { + name: 'execId', + desc: '执行记录id' + }, { + name: 'uuid', + desc: '生成任务维度 uuid' + }, { + name: 'uuidShort', + desc: '生成任务维度 uuid 无 \'-\'' + }, { + name: 'hostUuid', + desc: '生成机器维度 uuid' + }, { + name: 'hostUuidShort', + desc: '生成机器维度 uuid 无 \'-\'' + }, { + name: 'timestampMillis', + desc: '时间戳毫秒' + }, { + name: 'timestamp', + desc: '时间戳' + }, { + name: 'date', + desc: '执行时间 yyyy-MM-dd' + }, { + name: 'datetime', + desc: '执行时间 yyyy-MM-dd HH:mm:ss' + }, +]; diff --git a/orion-ops-ui/src/components/view/exec-editor/index.vue b/orion-ops-ui/src/components/view/exec-editor/index.vue new file mode 100644 index 00000000..c24d2e50 --- /dev/null +++ b/orion-ops-ui/src/components/view/exec-editor/index.vue @@ -0,0 +1,86 @@ + + + + + + + diff --git a/orion-ops-ui/src/router/routes/modules/exec.ts b/orion-ops-ui/src/router/routes/modules/exec.ts index 7203c2c3..d8dd2cca 100644 --- a/orion-ops-ui/src/router/routes/modules/exec.ts +++ b/orion-ops-ui/src/router/routes/modules/exec.ts @@ -7,9 +7,9 @@ const EXEC: AppRouteRecordRaw = { component: DEFAULT_LAYOUT, children: [ { - name: 'execTemplate', - path: '/exec-template', - component: () => import('@/views/exec/exec-template/index.vue'), + name: 'execCommand', + path: '/exec-command', + component: () => import('@/views/exec/exec-command/index.vue'), }, { name: 'execLog', @@ -17,9 +17,9 @@ const EXEC: AppRouteRecordRaw = { component: () => import('@/views/exec/exec-log/index.vue'), }, { - name: 'execHostLog', - path: '/exec-host-log', - component: () => import('@/views/exec/exec-host-log/index.vue'), + name: 'execTemplate', + path: '/exec-template', + component: () => import('@/views/exec/exec-template/index.vue'), }, ], }; diff --git a/orion-ops-ui/src/views/exec/exec-command/index.vue b/orion-ops-ui/src/views/exec/exec-command/index.vue new file mode 100644 index 00000000..4963cb80 --- /dev/null +++ b/orion-ops-ui/src/views/exec/exec-command/index.vue @@ -0,0 +1,17 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/exec/exec-command/types/form.rules.ts b/orion-ops-ui/src/views/exec/exec-command/types/form.rules.ts new file mode 100644 index 00000000..89914126 --- /dev/null +++ b/orion-ops-ui/src/views/exec/exec-command/types/form.rules.ts @@ -0,0 +1,33 @@ +import type { FieldRule } from '@arco-design/web-vue'; + +export const description = [{ + maxLength: 128, + message: '执行描述长度不能大于128位' +}] as FieldRule[]; + +export const hostIdList = [{ + required: true, + message: '请选择执行主机' +}] as FieldRule[]; + +export const command = [{ + required: true, + message: '请输入执行命令' +}] as FieldRule[]; + +export const timeout = [{ + required: true, + message: '请输入超时时间' +}, { + type: 'number', + min: 0, + max: 100000, + message: '超时时间需要在 0 - 100000 之间' +}] as FieldRule[]; + +export default { + description, + hostIdList, + command, + timeout, +} as Record; diff --git a/orion-ops-ui/src/views/exec/exec-log/components/exec-host-log-table.vue b/orion-ops-ui/src/views/exec/exec-log/components/exec-host-log-table.vue index 41c576c2..cf4611ff 100644 --- a/orion-ops-ui/src/views/exec/exec-log/components/exec-host-log-table.vue +++ b/orion-ops-ui/src/views/exec/exec-log/components/exec-host-log-table.vue @@ -58,7 +58,7 @@ 日志 - diff --git a/orion-ops-ui/src/views/exec/exec-log/components/exec-log-clear-modal.vue b/orion-ops-ui/src/views/exec/exec-log/components/exec-log-clear-modal.vue new file mode 100644 index 00000000..1af3268e --- /dev/null +++ b/orion-ops-ui/src/views/exec/exec-log/components/exec-log-clear-modal.vue @@ -0,0 +1,162 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/exec/exec-log/components/exec-log-table.vue b/orion-ops-ui/src/views/exec/exec-log/components/exec-log-table.vue index 9c9473dc..943d2f40 100644 --- a/orion-ops-ui/src/views/exec/exec-log/components/exec-log-table.vue +++ b/orion-ops-ui/src/views/exec/exec-log/components/exec-log-table.vue @@ -61,8 +61,26 @@
+ + + 执行命令 + + + + + 清空 + + - @@ -128,7 +146,7 @@ + @ok="doReExecCommand(record)"> @@ -136,14 +154,13 @@ - 命令 - @@ -153,7 +170,7 @@ + @ok="doInterruptExec(record)"> - @@ -188,8 +205,8 @@ diff --git a/orion-ops-ui/src/views/exec/exec-log/index.vue b/orion-ops-ui/src/views/exec/exec-log/index.vue index 8c9fadd4..89139199 100644 --- a/orion-ops-ui/src/views/exec/exec-log/index.vue +++ b/orion-ops-ui/src/views/exec/exec-log/index.vue @@ -1,8 +1,13 @@