diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-card-list.vue.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-card-list.vue.vm index 8c9ed80c..e4bd436e 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-card-list.vue.vm +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-card-list.vue.vm @@ -45,7 +45,9 @@ show-time allow-clear /> #else - + #end #end diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm index a24f2f46..437a9410 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm @@ -35,7 +35,9 @@ placeholder="请选择${field.comment}" show-time /> #else - + #end #end diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-modal.vue.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-modal.vue.vm index 19b28bde..336cd890 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-modal.vue.vm +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-modal.vue.vm @@ -39,7 +39,9 @@ placeholder="请选择${field.comment}" show-time /> #else - + #end #end diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-table.vue.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-table.vue.vm index b4280069..1be07f5f 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-table.vue.vm +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-table.vue.vm @@ -27,7 +27,9 @@ show-time allow-clear /> #else - + #end #end @@ -58,7 +60,7 @@ #if($vue.enableRowSelection) - @@ -183,7 +185,7 @@ setLoading(true); // 调用删除接口 await batchDelete${vue.featureEntity}(selectedKeys.value); - Message.success(`成功删除${selectedKeys.value.length}条数据`); + Message.success(`成功删除 ${selectedKeys.value.length} 条数据`); selectedKeys.value = []; // 重新加载数据 fetchTableData(); diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/HostConnectLogOperatorType.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/HostConnectLogOperatorType.java index d58dea10..bf9e3418 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/HostConnectLogOperatorType.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/HostConnectLogOperatorType.java @@ -26,7 +26,7 @@ public class HostConnectLogOperatorType extends InitializingOperatorTypes { public OperatorType[] types() { return new OperatorType[]{ new OperatorType(H, DELETE, "删除主机连接记录 ${count}条"), - new OperatorType(H, CLEAR, "清理主机连接记录 ${count}条"), + new OperatorType(H, CLEAR, "清空主机连接记录 ${count}条"), new OperatorType(M, FORCE_OFFLINE, "强制下线主机连接 ${hostName}"), }; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostConnectLogVO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostConnectLogVO.java index d69d7090..32d0902f 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostConnectLogVO.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostConnectLogVO.java @@ -8,6 +8,7 @@ import lombok.NoArgsConstructor; import java.io.Serializable; import java.util.Date; +import java.util.Map; /** * 主机连接日志 视图响应对象 @@ -56,12 +57,6 @@ public class HostConnectLogVO implements Serializable { private Date endTime; @Schema(description = "额外信息") - private String extraInfo; - - @Schema(description = "创建时间") - private Date createTime; - - @Schema(description = "修改时间") - private Date updateTime; + private Map extra; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/SshSession.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/SshSession.java index c80de250..dbe5dd24 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/SshSession.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/SshSession.java @@ -1,7 +1,5 @@ package com.orion.ops.module.asset.handler.host.terminal.session; -import com.orion.lang.utils.ansi.AnsiAppender; -import com.orion.lang.utils.ansi.style.color.AnsiForeground; import com.orion.lang.utils.io.Streams; import com.orion.net.host.SessionStore; import com.orion.net.host.ssh.shell.ShellExecutor; @@ -99,26 +97,6 @@ public class SshSession extends TerminalSession implements ISshSession { Streams.close(sessionStore); } - @Override - public void forceOffline() { - if (this.close) { - return; - } - // 发送消息 - String body = AnsiAppender.create() - .newLine() - .append(AnsiForeground.BRIGHT_RED, TerminalMessage.FORCED_OFFLINE) - .toString(); - SshOutputResponse resp = SshOutputResponse.builder() - .type(OutputTypeEnum.SSH_OUTPUT.getType()) - .sessionId(sessionId) - .body(body) - .build(); - WebSockets.sendText(channel, OutputTypeEnum.SSH_OUTPUT.format(resp)); - // 强制下线 - super.forceOffline(); - } - /** * 标准输出处理 * @@ -148,12 +126,12 @@ public class SshSession extends TerminalSession implements ISshSession { * eof 回调 */ private void eofCallback() { - log.info("terminal eof回调 {}, forClose: {}", sessionId, this.close); + log.info("terminal eof回调 {}, forClose: {}, forceOffline: {}", sessionId, this.close, this.forceOffline); // 发送关闭信息 TerminalCloseResponse resp = TerminalCloseResponse.builder() .type(OutputTypeEnum.CLOSE.getType()) .sessionId(this.sessionId) - .msg(TerminalMessage.CLOSED_CONNECTION) + .msg(this.forceOffline ? TerminalMessage.FORCED_OFFLINE : TerminalMessage.CLOSED_CONNECTION) .build(); WebSockets.sendText(channel, OutputTypeEnum.CLOSE.format(resp)); // 需要调用关闭 - 可能是 logout 需要手动触发 diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java index 78e36ca8..6f2bd276 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java @@ -28,6 +28,8 @@ public abstract class TerminalSession implements ITerminalSession { protected volatile boolean close; + protected volatile boolean forceOffline; + public TerminalSession(String sessionId, WebSocketSession channel, TerminalConfig config) { this.sessionId = sessionId; this.channel = channel; @@ -41,6 +43,7 @@ public abstract class TerminalSession implements ITerminalSession { @Override public void close() { + log.info("terminal close {}", sessionId); // 检查并且关闭 if (this.checkAndClose()) { // 修改状态 @@ -50,6 +53,8 @@ public abstract class TerminalSession implements ITerminalSession { @Override public void forceOffline() { + log.info("terminal forceOffline {}", sessionId); + this.forceOffline = true; this.checkAndClose(); } @@ -59,7 +64,6 @@ public abstract class TerminalSession implements ITerminalSession { * @return close */ private boolean checkAndClose() { - log.info("terminal close {}", sessionId); if (close) { return false; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConnectLogService.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConnectLogService.java index 7a24bb1a..795596dd 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConnectLogService.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConnectLogService.java @@ -78,7 +78,7 @@ public interface HostConnectLogService { Long getHostConnectLogCount(HostConnectLogQueryRequest request); /** - * 清理主机连接日志 + * 清空主机连接日志 * * @param request request * @return effect diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConnectLogServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConnectLogServiceImpl.java index 2f1239ee..c4eafc94 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConnectLogServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConnectLogServiceImpl.java @@ -71,7 +71,11 @@ public class HostConnectLogServiceImpl implements HostConnectLogService { // 查询 return hostConnectLogDAO.of(wrapper) .page(request) - .dataGrid(HostConnectLogConvert.MAPPER::to); + .dataGrid(s -> { + HostConnectLogVO vo = HostConnectLogConvert.MAPPER.to(s); + vo.setExtra(JSON.parseObject(s.getExtraInfo())); + return vo; + }); } @Override @@ -97,7 +101,6 @@ public class HostConnectLogServiceImpl implements HostConnectLogService { @Override public Integer deleteHostConnectLog(List idList) { - // TODO 测试一下参数 log.info("HostConnectLogService.deleteHostConnectLog start {}", JSON.toJSONString(idList)); int effect = hostConnectLogDAO.deleteBatchIds(idList); log.info("HostConnectLogService.deleteHostConnectLog finish {}", effect); diff --git a/orion-ops-ui/src/api/asset/host-connect-log.ts b/orion-ops-ui/src/api/asset/host-connect-log.ts index ee983a68..e10e0e79 100644 --- a/orion-ops-ui/src/api/asset/host-connect-log.ts +++ b/orion-ops-ui/src/api/asset/host-connect-log.ts @@ -1,11 +1,13 @@ import type { DataGrid, Pagination } from '@/types/global'; import type { TableData } from '@arco-design/web-vue/es/table/interface'; import axios from 'axios'; +import qs from 'query-string'; /** * 主机连接日志查询请求 */ export interface HostConnectLogQueryRequest extends Pagination { + id?: number; userId?: number; hostId?: number; hostAddress?: string; @@ -21,6 +23,7 @@ export interface HostConnectLogQueryRequest extends Pagination { export interface HostConnectLogQueryResponse extends TableData { id: number; userId: number; + username: number; hostId: number; hostName: string; hostAddress: string; @@ -29,11 +32,7 @@ export interface HostConnectLogQueryResponse extends TableData { status: string; startTime: number; endTime: number; - extraInfo: string; - createTime: number; - updateTime: number; - creator: string; - updater: string; + extra: Record; } /** @@ -52,3 +51,36 @@ export function getLatestConnectHostId(type: string, limit: number) { limit }); } + +/** + * 删除主机连接日志 + */ +export function deleteHostConnectLog(idList: Array) { + return axios.delete('/asset/host-connect-log/delete', { + params: { idList }, + paramsSerializer: params => { + return qs.stringify(params, { arrayFormat: 'comma' }); + } + }); +} + +/** + * 查询主机连接日志数量 + */ +export function getHostConnectLogCount(request: HostConnectLogQueryRequest) { + return axios.post('/asset/host-connect-log/query-count', request); +} + +/** + * 清空主机连接日志 + */ +export function clearHostConnectLog(request: HostConnectLogQueryRequest) { + return axios.post('/asset/host-connect-log/clear', request); +} + +/** + * 强制断开主机连接 + */ +export function hostForceOffline(request: HostConnectLogQueryRequest) { + return axios.put('/asset/host-connect-log/force-offline', request); +} diff --git a/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-clear-modal.vue b/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-clear-modal.vue new file mode 100644 index 00000000..8b9f319d --- /dev/null +++ b/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-clear-modal.vue @@ -0,0 +1,173 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-detail-drawer.vue b/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-detail-drawer.vue new file mode 100644 index 00000000..3d330cf6 --- /dev/null +++ b/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-detail-drawer.vue @@ -0,0 +1,125 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-table.vue b/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-table.vue index 53169034..f421a211 100644 --- a/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-table.vue +++ b/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-table.vue @@ -37,10 +37,6 @@ :options="toOptions(connectTypeKey)" allow-clear /> - - - - -
+
+ + + + 清空 + + + + + + 删除 + + + + +
+ + @@ -97,10 +134,51 @@ + + + + + + @@ -113,21 +191,28 @@