💄 优化表格样式.

This commit is contained in:
lijiahangmax
2024-03-04 22:27:39 +08:00
parent 462e77f936
commit f1ade4e182
30 changed files with 166 additions and 66 deletions

View File

@@ -28,7 +28,7 @@ public enum OutputTypeEnum {
/**
* 关闭连接
*/
CLOSE("cl", "${type}|${sessionId}|${msg}"),
CLOSE("cl", "${type}|${sessionId}|${forceClose}|${msg}"),
/**
* pong

View File

@@ -23,6 +23,9 @@ import lombok.experimental.SuperBuilder;
@Schema(name = "TerminalCloseResponse", description = "主机连接关闭响应 实体对象")
public class TerminalCloseResponse extends TerminalBasePayload {
@Schema(description = "是否为强制关闭")
private Integer forceClose;
@Schema(description = "关闭信息")
private String msg;

View File

@@ -4,6 +4,7 @@ import com.orion.lang.utils.io.Streams;
import com.orion.net.host.SessionStore;
import com.orion.net.host.ssh.shell.ShellExecutor;
import com.orion.ops.framework.common.constant.Const;
import com.orion.ops.framework.common.enums.BooleanBit;
import com.orion.ops.framework.websocket.core.utils.WebSockets;
import com.orion.ops.module.asset.define.AssetThreadPools;
import com.orion.ops.module.asset.handler.host.terminal.constant.TerminalMessage;
@@ -53,7 +54,7 @@ public class SshSession extends TerminalSession implements ISshSession {
executor.size(cols, rows);
executor.terminalType(terminalType);
executor.streamHandler(this::streamHandler);
executor.callback(this::eofCallback);
executor.callback(this::close);
executor.connect();
// 开始监听输出
AssetThreadPools.TERMINAL_STDOUT.execute(executor);
@@ -122,20 +123,4 @@ public class SshSession extends TerminalSession implements ISshSession {
}
}
/**
* eof 回调
*/
private void eofCallback() {
log.info("terminal eof回调 {}, forClose: {}, forceOffline: {}", sessionId, this.close, this.forceOffline);
// 发送关闭信息
TerminalCloseResponse resp = TerminalCloseResponse.builder()
.type(OutputTypeEnum.CLOSE.getType())
.sessionId(this.sessionId)
.msg(this.forceOffline ? TerminalMessage.FORCED_OFFLINE : TerminalMessage.CLOSED_CONNECTION)
.build();
WebSockets.sendText(channel, OutputTypeEnum.CLOSE.format(resp));
// 需要调用关闭 - 可能是 logout 需要手动触发
this.close();
}
}

View File

@@ -1,7 +1,12 @@
package com.orion.ops.module.asset.handler.host.terminal.session;
import com.orion.ops.framework.common.enums.BooleanBit;
import com.orion.ops.framework.websocket.core.utils.WebSockets;
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.service.HostConnectLogService;
import com.orion.spring.SpringHolder;
import lombok.Getter;
@@ -41,6 +46,21 @@ public abstract class TerminalSession implements ITerminalSession {
*/
protected abstract void releaseResource();
/**
* 发送关闭消息
*/
protected void sendCloseMessage() {
log.info("TerminalSession close {}, forClose: {}, forceOffline: {}", sessionId, this.close, this.forceOffline);
// 发送关闭信息
TerminalCloseResponse resp = TerminalCloseResponse.builder()
.type(OutputTypeEnum.CLOSE.getType())
.sessionId(this.sessionId)
.forceClose(BooleanBit.of(this.forceOffline).getValue())
.msg(this.forceOffline ? TerminalMessage.FORCED_OFFLINE : TerminalMessage.CLOSED_CONNECTION)
.build();
WebSockets.sendText(channel, OutputTypeEnum.CLOSE.format(resp));
}
@Override
public void close() {
log.info("terminal close {}", sessionId);
@@ -56,6 +76,7 @@ public abstract class TerminalSession implements ITerminalSession {
public void forceOffline() {
log.info("terminal forceOffline {}", sessionId);
this.forceOffline = true;
// 关闭
this.checkAndClose();
}
@@ -75,6 +96,12 @@ public abstract class TerminalSession implements ITerminalSession {
} catch (Exception e) {
log.error("terminal release error {}", sessionId, e);
}
// 发送关闭信息
try {
this.sendCloseMessage();
} catch (Exception e) {
log.error("terminal send close error {}", sessionId, e);
}
return true;
}

View File

@@ -85,12 +85,25 @@ public class HostConnectLogServiceImpl implements HostConnectLogService {
HostConnectLogDO record = hostConnectLogDAO.of()
.createWrapper()
.eq(HostConnectLogDO::getToken, token)
.orderByDesc(HostConnectLogDO::getId)
.then()
.getOne();
if (record == null) {
log.info("HostConnectLogService-updateStatusByToken no record token: {}", token);
return Const.N_0;
}
return this.updateStatus(record, status, partial);
}
/**
* 更新状态
*
* @param record record
* @param status status
* @param partial partial
* @return effect
*/
private int updateStatus(HostConnectLogDO record, HostConnectStatusEnum status, Map<String, Object> partial) {
// 更新
HostConnectLogDO update = new HostConnectLogDO();
update.setId(record.getId());
@@ -151,20 +164,20 @@ public class HostConnectLogServiceImpl implements HostConnectLogService {
public Integer forceOffline(HostConnectLogQueryRequest request) {
Long id = request.getId();
// 查询数据是否存在
HostConnectLogDO connect = hostConnectLogDAO.selectById(id);
Valid.notNull(connect, ErrorMessage.LOG_ABSENT);
Valid.eq(connect.getStatus(), HostConnectStatusEnum.CONNECTING.name(), ErrorMessage.ILLEGAL_STATUS);
HostConnectLogDO record = hostConnectLogDAO.selectById(id);
Valid.notNull(record, ErrorMessage.LOG_ABSENT);
Valid.eq(record.getStatus(), HostConnectStatusEnum.CONNECTING.name(), ErrorMessage.ILLEGAL_STATUS);
// 设置日志参数
OperatorLogs.add(OperatorLogs.HOST_NAME, connect.getHostName());
OperatorLogs.add(OperatorLogs.HOST_NAME, record.getHostName());
// 获取会话
HostConnectLogExtraDTO extra = JSON.parseObject(connect.getExtraInfo(), HostConnectLogExtraDTO.class);
HostConnectLogExtraDTO extra = JSON.parseObject(record.getExtraInfo(), HostConnectLogExtraDTO.class);
ITerminalSession session = terminalManager.getSession(extra.getChannelId(), extra.getSessionId());
if (session != null) {
// 关闭会话
session.forceOffline();
}
// 更新状态
return this.updateStatusByToken(connect.getToken(), HostConnectStatusEnum.FORCE_OFFLINE, null);
return this.updateStatus(record, HostConnectStatusEnum.FORCE_OFFLINE, null);
}
/**