diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputTypeEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputTypeEnum.java index 871c5910..42cf2f6b 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputTypeEnum.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputTypeEnum.java @@ -24,7 +24,7 @@ public enum InputTypeEnum { */ CHECK("ck", TerminalCheckHandler.class, - new String[]{"type", "session", "hostId"}, + new String[]{"type", "sessionId", "hostId"}, TerminalCheckRequest.class), /** @@ -32,7 +32,7 @@ public enum InputTypeEnum { */ CONNECT("co", TerminalConnectHandler.class, - new String[]{"type", "session", "cols", "rows"}, + new String[]{"type", "sessionId", "cols", "rows"}, TerminalConnectRequest.class), /** @@ -40,7 +40,7 @@ public enum InputTypeEnum { */ CLOSE("cl", TerminalCloseHandler.class, - new String[]{"type", "session"}, + new String[]{"type", "sessionId"}, TerminalBasePayload.class), /** @@ -56,7 +56,7 @@ public enum InputTypeEnum { */ RESIZE("rs", TerminalResizeHandler.class, - new String[]{"type", "session", "cols", "rows"}, + new String[]{"type", "sessionId", "cols", "rows"}, TerminalResizeRequest.class), /** @@ -64,7 +64,7 @@ public enum InputTypeEnum { */ EXEC("e", TerminalExecHandler.class, - new String[]{"type", "session", "command"}, + new String[]{"type", "sessionId", "command"}, TerminalExecRequest.class), /** @@ -72,7 +72,7 @@ public enum InputTypeEnum { */ INPUT("i", TerminalInputHandler.class, - new String[]{"type", "session", "command"}, + new String[]{"type", "sessionId", "command"}, TerminalInputRequest.class), ; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/OutputTypeEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/OutputTypeEnum.java index ae456606..e3eaccfa 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/OutputTypeEnum.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/OutputTypeEnum.java @@ -18,12 +18,17 @@ public enum OutputTypeEnum { /** * 主机连接检查 */ - CHECK("ck", "${type}|${session}|${result}|${errorMessage}"), + CHECK("ck", "${type}|${sessionId}|${result}|${msg}"), /** * 主机连接 */ - CONNECT("co", "${type}|${session}|${result}|${errorMessage}"), + CONNECT("co", "${type}|${sessionId}|${result}|${msg}"), + + /** + * 关闭连接 + */ + CLOSE("cl", "${type}|${sessionId}|${msg}"), /** * pong @@ -33,7 +38,7 @@ public enum OutputTypeEnum { /** * 输出 */ - OUTPUT("o", "${type}|${session}|${body}"), + OUTPUT("o", "${type}|${sessionId}|${body}"), ; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCheckHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCheckHandler.java index 095f25ef..97ca4c11 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCheckHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCheckHandler.java @@ -59,7 +59,7 @@ public class TerminalCheckHandler extends AbstractTerminalHandler { + @Resource + private TerminalManager terminalManager; + @Override public void handle(WebSocketSession channel, TerminalBasePayload payload) { // 发送 pong this.send(channel, OutputTypeEnum.PONG.getType()); + // 活跃 terminal + Map sessions = terminalManager.getSession(channel.getId()); + if (!Maps.isEmpty(sessions)) { + for (ITerminalSession session : sessions.values()) { + session.keepAlive(); + } + } } } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalResizeHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalResizeHandler.java index 7b5283ad..dddbf920 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalResizeHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalResizeHandler.java @@ -26,7 +26,7 @@ public class TerminalResizeHandler extends AbstractTerminalHandler getSession(String channelId) { + return channelSessions.get(channelId); + } + /** * 关闭全部会话 * diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/TerminalBasePayload.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/TerminalBasePayload.java index d61ae123..636c6728 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/TerminalBasePayload.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/TerminalBasePayload.java @@ -21,7 +21,7 @@ import lombok.experimental.SuperBuilder; public class TerminalBasePayload { @Schema(description = "会话id") - private String session; + private String sessionId; @Schema(description = "消息类型") private String type; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/response/TerminalCheckResponse.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/response/TerminalCheckResponse.java index 4fbd391d..1a3f73b8 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/response/TerminalCheckResponse.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/response/TerminalCheckResponse.java @@ -27,6 +27,6 @@ public class TerminalCheckResponse extends TerminalBasePayload { private Integer result; @Schema(description = "错误信息") - private String errorMessage; + private String msg; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/response/TerminalCloseResponse.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/response/TerminalCloseResponse.java new file mode 100644 index 00000000..a6be8ae9 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/response/TerminalCloseResponse.java @@ -0,0 +1,29 @@ +package com.orion.ops.module.asset.handler.host.terminal.model.response; + +import com.orion.ops.module.asset.handler.host.terminal.model.TerminalBasePayload; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * 主机连接关闭响应 实体对象 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/12/29 16:20 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Schema(name = "TerminalCloseResponse", description = "主机连接关闭响应 实体对象") +public class TerminalCloseResponse extends TerminalBasePayload { + + @Schema(description = "关闭信息") + private String msg; + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/response/TerminalConnectResponse.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/response/TerminalConnectResponse.java index db20cd11..5df58576 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/response/TerminalConnectResponse.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/response/TerminalConnectResponse.java @@ -27,6 +27,6 @@ public class TerminalConnectResponse extends TerminalBasePayload { private Integer result; @Schema(description = "错误信息") - private String errorMessage; + private String msg; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/ITerminalSession.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/ITerminalSession.java index acb914a4..a216f9e1 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/ITerminalSession.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/ITerminalSession.java @@ -41,4 +41,9 @@ public interface ITerminalSession extends SafeCloseable { */ void write(byte[] b); + /** + * 活跃回话 + */ + void keepAlive(); + } 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 36449dca..ba64e634 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 @@ -2,14 +2,15 @@ package com.orion.ops.module.asset.handler.host.terminal.session; import com.orion.lang.utils.io.Streams; import com.orion.net.host.SessionStore; -import com.orion.net.host.ssh.TerminalType; import com.orion.net.host.ssh.shell.ShellExecutor; import com.orion.ops.framework.common.constant.Const; import com.orion.ops.framework.websocket.core.utils.WebSockets; import com.orion.ops.module.asset.define.AssetThreadPools; import com.orion.ops.module.asset.enums.HostConnectStatusEnum; +import com.orion.ops.module.asset.handler.host.terminal.constant.TerminalMessage; import com.orion.ops.module.asset.handler.host.terminal.enums.OutputTypeEnum; import com.orion.ops.module.asset.handler.host.terminal.model.TerminalConfig; +import com.orion.ops.module.asset.handler.host.terminal.model.response.TerminalCloseResponse; import com.orion.ops.module.asset.handler.host.terminal.model.response.TerminalOutputResponse; import com.orion.ops.module.asset.service.HostConnectLogService; import com.orion.spring.SpringHolder; @@ -64,9 +65,9 @@ public class TerminalSession implements ITerminalSession { config.setRows(rows); // 打开 shell this.executor = sessionStore.getShellExecutor(); - executor.terminalType(TerminalType.XTERM_256_COLOR); executor.size(cols, rows); executor.streamHandler(this::streamHandler); + executor.callback(this::eofCallback); executor.connect(); // 开始监听输出 AssetThreadPools.TERMINAL_SCHEDULER.execute(executor); @@ -97,8 +98,19 @@ public class TerminalSession implements ITerminalSession { executor.write(b); } + @Override + public void keepAlive() { + try { + // 发送个信号 保证 socket 不自动关闭 + executor.sendSignal(Const.EMPTY); + } catch (Exception e) { + log.error("terminal keep-alive error {}", sessionId, e); + } + } + @Override public void close() { + log.info("terminal close {}", sessionId); if (close) { return; } @@ -128,8 +140,8 @@ public class TerminalSession implements ITerminalSession { String body = lastLine = new String(bs, 0, read, config.getCharset()); // 响应 TerminalOutputResponse resp = TerminalOutputResponse.builder() - .session(sessionId) .type(OutputTypeEnum.OUTPUT.getType()) + .sessionId(sessionId) .body(body) .build(); WebSockets.sendText(channel, OutputTypeEnum.OUTPUT.format(resp)); @@ -137,10 +149,22 @@ public class TerminalSession implements ITerminalSession { } catch (IOException ex) { log.error("terminal 读取流失败", ex); } - // eof - if (close) { - log.info("terminal eof回调 {}", sessionId); - } + } + + /** + * eof 回调 + */ + private void eofCallback() { + log.info("terminal eof回调 {}, forClose: {}", sessionId, this.close); + // 发送关闭信息 + TerminalCloseResponse resp = TerminalCloseResponse.builder() + .type(OutputTypeEnum.CLOSE.getType()) + .sessionId(this.sessionId) + .msg(TerminalMessage.CLOSED_CONNECTION) + .build(); + WebSockets.sendText(channel, OutputTypeEnum.CLOSE.format(resp)); + // 需要调用关闭 - 可能是 logout 需要手动触发 + this.close(); } } diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/TerminalPreferenceStrategy.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/TerminalPreferenceStrategy.java index ba35b79b..916c2c0b 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/TerminalPreferenceStrategy.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/TerminalPreferenceStrategy.java @@ -21,7 +21,7 @@ public class TerminalPreferenceStrategy implements IPreferenceStrategy protocol.type === payload.type) + ?.processMethod; + // 处理消息 + if (processMethod) { + const processMethodFn = this.processor[processMethod as keyof ITerminalOutputProcessor] as Function; + processMethodFn && processMethodFn.call(this.processor, payload); } } diff --git a/orion-ops-ui/src/views/host/terminal/handler/terminal-output-processor.ts b/orion-ops-ui/src/views/host/terminal/handler/terminal-output-processor.ts new file mode 100644 index 00000000..e84d6252 --- /dev/null +++ b/orion-ops-ui/src/views/host/terminal/handler/terminal-output-processor.ts @@ -0,0 +1,74 @@ +import { + ITerminalChannel, + ITerminalOutputProcessor, + ITerminalSessionManager, + OutputPayload +} from '../types/terminal.type'; +import { InputProtocol } from '../types/terminal.protocol'; + +// 终端输出消息体处理器实现 +export default class TerminalOutputProcessor implements ITerminalOutputProcessor { + + private readonly sessionManager: ITerminalSessionManager; + + private readonly channel: ITerminalChannel; + + constructor(sessionManager: ITerminalSessionManager, channel: ITerminalChannel) { + this.sessionManager = sessionManager; + this.channel = channel; + } + + // 处理检查消息 + processCheck({ sessionId, result, msg }: OutputPayload): void { + const success = !!Number.parseInt(result); + const session = this.sessionManager.getSession(sessionId); + // 未成功展示错误信息 + if (!success) { + session.write(`${msg || ''}`); + return; + } + // 发送 connect 命令 + this.channel.send(InputProtocol.CONNECT, { sessionId, cols: session.inst.cols, rows: session.inst.rows }); + } + + // 处理连接消息 + processConnect({ sessionId, result, msg }: OutputPayload): void { + const success = !!Number.parseInt(result); + const session = this.sessionManager.getSession(sessionId); + // 未成功展示错误信息 + if (!success) { + session.write(`${msg || ''}`); + return; + } + // 设置可写 + session.setCanWrite(true); + // 执行连接逻辑 + session.connect(); + } + + // 处理关闭消息 + processClose({ sessionId, msg }: OutputPayload): void { + const session = this.sessionManager.getSession(sessionId); + // 关闭 tab 则无需处理 + if (session) { + // 提示消息 + session.write(`\r\n${msg || ''}`); + // 设置状态 + session.connected = false; + // 设置不可写 + session.setCanWrite(false); + } + } + + // 处理 pong 消息 + processPong(payload: OutputPayload): void { + console.log('pong'); + } + + // 处理输出消息 + processOutput({ sessionId, body }: OutputPayload): void { + const session = this.sessionManager.getSession(sessionId); + session && session.write(body); + } + +} diff --git a/orion-ops-ui/src/views/host/terminal/handler/terminal-session-manager.ts b/orion-ops-ui/src/views/host/terminal/handler/terminal-session-manager.ts index d9a7180d..804bbe52 100644 --- a/orion-ops-ui/src/views/host/terminal/handler/terminal-session-manager.ts +++ b/orion-ops-ui/src/views/host/terminal/handler/terminal-session-manager.ts @@ -1,20 +1,13 @@ -import type { - ITerminalChannel, - ITerminalSession, - ITerminalSessionManager, - ITerminalOutputProcessor, - OutputPayload, - TerminalTabItem -} from '../types/terminal.type'; +import type { ITerminalChannel, ITerminalSession, ITerminalSessionManager, TerminalTabItem } from '../types/terminal.type'; import { sleep } from '@/utils'; import { InputProtocol } from '../types/terminal.protocol'; -import TerminalSession from './terminal-session'; import { useDebounceFn } from '@vueuse/core'; -import TerminalChannel from '@/views/host/terminal/handler/terminal-channel'; import { addEventListen, removeEventListen } from '@/utils/event'; +import TerminalSession from './terminal-session'; +import TerminalChannel from './terminal-channel'; // 终端会话管理器实现 -export default class TerminalSessionManager implements ITerminalSessionManager, ITerminalOutputProcessor { +export default class TerminalSessionManager implements ITerminalSessionManager { private readonly channel: ITerminalChannel; @@ -50,11 +43,33 @@ export default class TerminalSessionManager implements ITerminalSessionManager, this.sessions[sessionId] = session; // 发送会话初始化请求 this.channel.send(InputProtocol.CHECK, { - session: sessionId, - hostId: hostId + sessionId, + hostId }); } + // 获取终端会话 + getSession(sessionId: string): ITerminalSession { + return this.sessions[sessionId]; + } + + // 关闭终端会话 + closeSession(sessionId: string): void { + // 发送关闭消息 + this.channel?.send(InputProtocol.CLOSE, { sessionId }); + // 关闭 session + const session = this.sessions[sessionId]; + if (session) { + session.close(); + } + // 移除 session + this.sessions[sessionId] = undefined as unknown as ITerminalSession; + // session 全部关闭后 关闭 channel + if (Object.values(this.sessions).filter(Boolean).every(s => !s?.connected)) { + this.reset(); + } + } + // 初始化 channel private async initChannel() { // 检查 channel 是否已经初始化 @@ -71,28 +86,6 @@ export default class TerminalSessionManager implements ITerminalSessionManager, }, 15000); } - // 获取终端会话 - getSession(sessionId: string): ITerminalSession { - return this.sessions[sessionId]; - } - - // 关闭终端会话 - closeSession(sessionId: string): void { - // 发送关闭消息 - this.channel?.send(InputProtocol.CLOSE, { session: sessionId }); - // 关闭 session - const session = this.sessions[sessionId]; - if (session) { - session.close(); - } - // 移除 session - this.sessions[sessionId] = undefined as unknown as ITerminalSession; - // session 全部关闭后 关闭 channel - if (Object.values(this.sessions).filter(Boolean).every(s => !s?.connected)) { - this.reset(); - } - } - // 调度重置大小 private dispatchResize() { // 对所有已连接的会话重置大小 @@ -101,45 +94,6 @@ export default class TerminalSessionManager implements ITerminalSessionManager, .forEach(h => h.fit()); } - // 处理检查消息 - processCheck({ session: sessionId, result, errorMessage }: OutputPayload): void { - const success = !!Number.parseInt(result); - const session = this.sessions[sessionId]; - // 未成功展示错误信息 - if (!success) { - session.write('' + errorMessage + ''); - return; - } - // 发送 connect 命令 - this.channel.send(InputProtocol.CONNECT, { session: sessionId, cols: session.inst.cols, rows: session.inst.rows }); - } - - // 处理连接消息 - processConnect({ session: sessionId, result, errorMessage }: OutputPayload): void { - const success = !!Number.parseInt(result); - const session = this.sessions[sessionId]; - // 未成功展示错误信息 - if (!success) { - session.write('' + errorMessage + ''); - return; - } - // 设置可写 - session.setCanWrite(true); - // 执行连接逻辑 - session.connect(); - } - - // 处理 pong 消息 - processPong(payload: OutputPayload): void { - console.log('pong'); - } - - // 处理输出消息 - processOutput({ session: sessionId, body }: OutputPayload): void { - const session = this.sessions[sessionId]; - session && session.write(body); - } - // 重置 reset(): void { this.sessions = {}; diff --git a/orion-ops-ui/src/views/host/terminal/handler/terminal-session.ts b/orion-ops-ui/src/views/host/terminal/handler/terminal-session.ts index 741a2ba3..91b92b73 100644 --- a/orion-ops-ui/src/views/host/terminal/handler/terminal-session.ts +++ b/orion-ops-ui/src/views/host/terminal/handler/terminal-session.ts @@ -73,14 +73,14 @@ export default class TerminalSession implements ITerminalSession { } // 输入 this.channel.send(InputProtocol.INPUT, { - session: this.sessionId, + sessionId: this.sessionId, command: s }); }); // 注册 resize 事件 this.inst.onResize(({ cols, rows }) => { this.channel.send(InputProtocol.RESIZE, { - session: this.sessionId, + sessionId: this.sessionId, cols, rows }); @@ -90,6 +90,11 @@ export default class TerminalSession implements ITerminalSession { // 设置是否可写 setCanWrite(canWrite: boolean): void { this.canWrite = canWrite; + if (canWrite) { + this.inst.options.cursorBlink = useTerminalStore().preference.displaySetting.cursorBlink; + } else { + this.inst.options.cursorBlink = false; + } } // 写入数据 diff --git a/orion-ops-ui/src/views/host/terminal/types/terminal.protocol.ts b/orion-ops-ui/src/views/host/terminal/types/terminal.protocol.ts index f41c58ae..0696a59c 100644 --- a/orion-ops-ui/src/views/host/terminal/types/terminal.protocol.ts +++ b/orion-ops-ui/src/views/host/terminal/types/terminal.protocol.ts @@ -3,17 +3,17 @@ export const InputProtocol = { // 主机连接检查 CHECK: { type: 'ck', - template: ['type', 'session', 'hostId'] + template: ['type', 'sessionId', 'hostId'] }, // 连接主机 CONNECT: { type: 'co', - template: ['type', 'session', 'cols', 'rows'] + template: ['type', 'sessionId', 'cols', 'rows'] }, // 关闭连接 CLOSE: { type: 'cl', - template: ['type', 'session'] + template: ['type', 'sessionId'] }, // ping PING: { @@ -23,17 +23,17 @@ export const InputProtocol = { // 修改大小 RESIZE: { type: 'rs', - template: ['type', 'session', 'cols', 'rows'] + template: ['type', 'sessionId', 'cols', 'rows'] }, // 执行 EXEC: { type: 'e', - template: ['type', 'session', 'command'] + template: ['type', 'sessionId', 'command'] }, // 输入 INPUT: { type: 'i', - template: ['type', 'session', 'command'] + template: ['type', 'sessionId', 'command'] } }; @@ -42,21 +42,31 @@ export const OutputProtocol = { // 主机连接检查 CHECK: { type: 'ck', - template: ['type', 'session', 'result', 'errorMessage'] + template: ['type', 'sessionId', 'result', 'msg'], + processMethod: 'processCheck' }, // 主机连接 CONNECT: { type: 'co', - template: ['type', 'session', 'result', 'errorMessage'] + template: ['type', 'sessionId', 'result', 'msg'], + processMethod: 'processConnect' + }, + // 主机连接关闭 + CLOSE: { + type: 'cl', + template: ['type', 'sessionId', 'msg'], + processMethod: 'processClose' }, // pong PONG: { type: 'p', - template: ['type'] + template: ['type'], + processMethod: 'processPong' }, // 输出 OUTPUT: { type: 'o', - template: ['type', 'session', 'body'] + template: ['type', 'sessionId', 'body'], + processMethod: 'processOutput' }, }; diff --git a/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts b/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts index 6e3948e5..c38eed35 100644 --- a/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts +++ b/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts @@ -13,12 +13,14 @@ export interface TerminalTabItem { export interface Protocol { type: string; template: string[]; + + [key: string]: unknown; } // 终端输入消息内容 export interface InputPayload { type?: string; - session?: string; + sessionId?: string; [key: string]: unknown; } @@ -26,7 +28,7 @@ export interface InputPayload { // 终端输出消息内容 export interface OutputPayload { type: string; - session: string; + sessionId: string; [key: string]: string; } @@ -78,6 +80,8 @@ export interface ITerminalOutputProcessor { processCheck: (payload: OutputPayload) => void; // 处理连接消息 processConnect: (payload: OutputPayload) => void; + // 处理关闭消息 + processClose: (payload: OutputPayload) => void; // 处理 pong 消息 processPong: (payload: OutputPayload) => void; // 处理输出消息