feat: 连接主机终端.
This commit is contained in:
@@ -71,4 +71,6 @@ public interface ErrorMessage {
|
||||
|
||||
String ANY_NO_PERMISSION = "{}无权限";
|
||||
|
||||
String SESSION_ABSENT = "会话不存在";
|
||||
|
||||
}
|
||||
|
||||
@@ -13,6 +13,8 @@ public interface ExtraFieldConst extends FieldConst {
|
||||
|
||||
String TRACE_ID = "traceId";
|
||||
|
||||
String SESSION_ID = "sessionId";
|
||||
|
||||
String IDENTITY = "identity";
|
||||
|
||||
String GROUP_NAME = "groupName";
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
@@ -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...";
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user