feat: 连接主机终端.

This commit is contained in:
lijiahang
2024-01-03 19:54:35 +08:00
parent 195a0ba7dc
commit 63f458ac1a
27 changed files with 518 additions and 342 deletions

View File

@@ -71,4 +71,6 @@ public interface ErrorMessage {
String ANY_NO_PERMISSION = "{}无权限";
String SESSION_ABSENT = "会话不存在";
}

View File

@@ -13,6 +13,8 @@ public interface ExtraFieldConst extends FieldConst {
String TRACE_ID = "traceId";
String SESSION_ID = "sessionId";
String IDENTITY = "identity";
String GROUP_NAME = "groupName";

View File

@@ -28,6 +28,10 @@ public enum BooleanBit {
private final Integer value;
public static BooleanBit of(boolean value) {
return value ? TRUE : FALSE;
}
public static BooleanBit of(Integer value) {
if (value == null) {
return null;

View File

@@ -1,11 +1,5 @@
package com.orion.ops.framework.websocket.core.constant;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.WebSocketSession;
/**
* ws 服务端关闭 code
*
@@ -13,145 +7,20 @@ import org.springframework.web.socket.WebSocketSession;
* @version 1.0.0
* @since 2021/6/16 15:18
*/
@Slf4j
@Getter
@AllArgsConstructor
public enum WsCloseCode {
public interface WsCloseCode {
/**
* 未查询到token
*/
INCORRECT_TOKEN(4100, WsCloseReason.CLOSED_CONNECTION),
/**
* 伪造token
*/
FORGE_TOKEN(4120, WsCloseReason.CLOSED_CONNECTION),
/**
* token已被绑定
*/
TOKEN_BIND(4125, WsCloseReason.CLOSED_CONNECTION),
/**
* 未知的连接
*/
UNKNOWN_CONNECT(4130, WsCloseReason.CLOSED_CONNECTION),
/**
* 认证失败 id不匹配
*/
IDENTITY_MISMATCH(4140, WsCloseReason.IDENTITY_MISMATCH),
/**
* 认证信息不匹配
*/
VALID(4150, WsCloseReason.AUTHENTICATION_FAILURE),
/**
* 主机不合法
*/
INVALID_HOST(4200, WsCloseReason.CLOSED_CONNECTION),
/**
* 连接远程服务器连接超时
*/
CONNECTION_TIMEOUT(4201, WsCloseReason.CONNECTION_TIMEOUT),
/**
* 连接远程服务器失败
*/
CONNECTION_FAILURE(4202, WsCloseReason.REMOTE_SERVER_UNREACHABLE),
/**
* 远程服务器认证失败
*/
CONNECTION_AUTH_FAILURE(4205, WsCloseReason.REMOTE_SERVER_AUTHENTICATION_FAILURE),
/**
* 远程服务器认证出现异常
*/
CONNECTION_EXCEPTION(4210, WsCloseReason.UNABLE_TO_CONNECT_REMOTE_SERVER),
/**
* 主机未启用
*/
HOST_DISABLED(4215, WsCloseReason.HOST_DISABLED),
/**
* 打开shell出现异常
*/
OPEN_SHELL_EXCEPTION(4220, WsCloseReason.UNABLE_TO_CONNECT_REMOTE_SERVER),
/**
* 打开command出现异常
*/
OPEN_COMMAND_EXCEPTION(4225, WsCloseReason.UNABLE_TO_CONNECT_REMOTE_SERVER),
/**
* 打开sftp出现异常
*/
OPEN_SFTP_EXCEPTION(4230, WsCloseReason.UNABLE_TO_CONNECT_REMOTE_SERVER),
/**
* 服务出现异常
*/
RUNTIME_EXCEPTION(4300, WsCloseReason.CLOSED_CONNECTION),
/**
* 心跳结束
*/
HEART_DOWN(4310, WsCloseReason.CLOSED_CONNECTION),
/**
* 用户关闭
*/
DISCONNECT(4320, WsCloseReason.CLOSED_CONNECTION),
/**
* 结束
*/
EOF(4330, WsCloseReason.CLOSED_CONNECTION),
/**
* 读取失败
*/
READ_EXCEPTION(4335, WsCloseReason.CLOSED_CONNECTION),
/**
* 强制下线
*/
FORCED_OFFLINE(4500, WsCloseReason.FORCED_OFFLINE),
;
private final int code;
private final String reason;
/**
* 关闭会话
* code
*
* @param session session
* @return code
*/
public void close(WebSocketSession session) {
if (!session.isOpen()) {
return;
}
try {
session.close(new CloseStatus(code, reason));
} catch (Exception e) {
log.error("websocket close failure", e);
}
}
int getCode();
public static WsCloseCode of(int code) {
for (WsCloseCode value : values()) {
if (value.code == code) {
return value;
}
}
return null;
}
/**
* reason
*
* @return reason
*/
String getReason();
}

View File

@@ -1,30 +0,0 @@
package com.orion.ops.framework.websocket.core.constant;
/**
* ws服务端关闭reason
*
* @author Jiahang Li
* @version 1.0.0
* @since 2021/6/16 15:21
*/
public interface WsCloseReason {
String CLOSED_CONNECTION = "closed connection...";
String IDENTITY_MISMATCH = "identity mismatch...";
String AUTHENTICATION_FAILURE = "authentication failure...";
String REMOTE_SERVER_UNREACHABLE = "remote server unreachable...";
String CONNECTION_TIMEOUT = "connection timeout...";
String REMOTE_SERVER_AUTHENTICATION_FAILURE = "remote server authentication failure...";
String HOST_DISABLED = "host disabled...";
String UNABLE_TO_CONNECT_REMOTE_SERVER = "unable to connect remote server...";
String FORCED_OFFLINE = "forced offline...";
}

View File

@@ -1,20 +1,14 @@
package com.orion.ops.framework.websocket.core.utils;
import com.orion.lang.exception.AuthenticationException;
import com.orion.lang.exception.ConnectionRuntimeException;
import com.orion.lang.exception.DisabledException;
import com.orion.lang.exception.TimeoutException;
import com.alibaba.fastjson.JSON;
import com.orion.lang.utils.Exceptions;
import com.orion.lang.utils.Urls;
import com.orion.ops.framework.websocket.core.constant.WsCloseCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import java.io.IOException;
import java.util.Objects;
/**
* websocket 工具类
@@ -35,7 +29,17 @@ public class WebSockets {
* @param session session
* @param message message
*/
public static void sendText(WebSocketSession session, byte[] message) {
public static void sendJson(WebSocketSession session, Object message) {
sendText(session, JSON.toJSONString(message));
}
/**
* 发送消息 忽略并发报错
*
* @param session session
* @param message message
*/
public static void sendText(WebSocketSession session, String message) {
if (!session.isOpen()) {
return;
}
@@ -67,44 +71,4 @@ public class WebSockets {
}
}
/**
* 获取 urlToken
*
* @param request request
* @return token
*/
public static String getToken(ServerHttpRequest request) {
return Urls.getUrlSource(Objects.requireNonNull(request.getURI().toString()));
}
/**
* 获取 urlToken
*
* @param session session
* @return token
*/
public static String getToken(WebSocketSession session) {
return Urls.getUrlSource(Objects.requireNonNull(session.getUri()).toString());
}
/**
* 打开 session 异常关闭
*
* @param session session
* @param e e
*/
public static void openSessionStoreThrowClose(WebSocketSession session, Exception e) {
if (Exceptions.isCausedBy(e, TimeoutException.class)) {
close(session, WsCloseCode.CONNECTION_TIMEOUT);
} else if (Exceptions.isCausedBy(e, ConnectionRuntimeException.class)) {
close(session, WsCloseCode.CONNECTION_FAILURE);
} else if (Exceptions.isCausedBy(e, AuthenticationException.class)) {
close(session, WsCloseCode.CONNECTION_AUTH_FAILURE);
} else if (Exceptions.isCausedBy(e, DisabledException.class)) {
close(session, WsCloseCode.HOST_DISABLED);
} else {
close(session, WsCloseCode.CONNECTION_EXCEPTION);
}
}
}