修复「接入网关」+「guacd」无法使用监控和文件管理功能的问题

This commit is contained in:
dushixiang
2022-04-20 22:03:45 +08:00
parent a608b84d7e
commit 03b59d6a2f
5 changed files with 43 additions and 39 deletions

View File

@ -5,7 +5,7 @@ echo "clean build history"
echo "build web..." echo "build web..."
cd web || exit cd web || exit
yarn build yarn build || exit
cp -r build ../server/resource/ cp -r build ../server/resource/
echo "build web success" echo "build web success"

View File

@ -30,6 +30,7 @@ const (
AccessGatewayUnAvailable int = 803 AccessGatewayUnAvailable int = 803
AccessGatewayCreateError int = 804 AccessGatewayCreateError int = 804
AssetNotActive int = 805 AssetNotActive int = 805
NewSshClientError int = 806
) )
var UpGrader = websocket.Upgrader{ var UpGrader = websocket.Upgrader{
@ -69,10 +70,7 @@ func (api GuacamoleApi) Guacamole(c echo.Context) error {
return err return err
} }
api.setConfig(propertyMap, s, configuration) api.setConfig(propertyMap, s, configuration)
var (
ip = s.IP
port = s.Port
)
if s.AccessGatewayId != "" && s.AccessGatewayId != "-" { if s.AccessGatewayId != "" && s.AccessGatewayId != "-" {
g, err := service.GatewayService.GetGatewayAndReconnectById(s.AccessGatewayId) g, err := service.GatewayService.GetGatewayAndReconnectById(s.AccessGatewayId)
if err != nil { if err != nil {
@ -83,18 +81,18 @@ func (api GuacamoleApi) Guacamole(c echo.Context) error {
utils.Disconnect(ws, AccessGatewayUnAvailable, "接入网关不可用:"+g.Message) utils.Disconnect(ws, AccessGatewayUnAvailable, "接入网关不可用:"+g.Message)
return nil return nil
} }
exposedIP, exposedPort, err := g.OpenSshTunnel(s.ID, ip, port) exposedIP, exposedPort, err := g.OpenSshTunnel(s.ID, s.IP, s.Port)
if err != nil { if err != nil {
utils.Disconnect(ws, AccessGatewayCreateError, "创建SSH隧道失败"+err.Error()) utils.Disconnect(ws, AccessGatewayCreateError, "创建SSH隧道失败"+err.Error())
return nil return nil
} }
ip = exposedIP s.IP = exposedIP
port = exposedPort s.Port = exposedPort
defer g.CloseSshTunnel(s.ID) defer g.CloseSshTunnel(s.ID)
} }
configuration.SetParameter("hostname", ip) configuration.SetParameter("hostname", s.IP)
configuration.SetParameter("port", strconv.Itoa(port)) configuration.SetParameter("port", strconv.Itoa(s.Port))
// 加载资产配置的属性,优先级比全局配置的高,因此最后加载,覆盖掉全局配置 // 加载资产配置的属性,优先级比全局配置的高,因此最后加载,覆盖掉全局配置
attributes, err := repository.AssetRepository.FindAssetAttrMapByAssetId(ctx, s.AssetId) attributes, err := repository.AssetRepository.FindAssetAttrMapByAssetId(ctx, s.AssetId)
@ -132,9 +130,12 @@ func (api GuacamoleApi) Guacamole(c echo.Context) error {
if configuration.Protocol == constant.SSH { if configuration.Protocol == constant.SSH {
nextTerminal, err := CreateNextTerminalBySession(s) nextTerminal, err := CreateNextTerminalBySession(s)
if err == nil { if err != nil {
nextSession.NextTerminal = nextTerminal utils.Disconnect(ws, NewSshClientError, "建立SSH客户端失败: "+err.Error())
log.Printf("[%v] 建立 ssh 客户端失败: %v", sessionId, err.Error())
return err
} }
nextSession.NextTerminal = nextTerminal
} }
nextSession.Observer = session.NewObserver(sessionId) nextSession.Observer = session.NewObserver(sessionId)

View File

@ -5,7 +5,7 @@ import (
) )
const ( const (
AppVersion = "v1.2.6-beta" AppVersion = "v1.2.7"
AppName = "Next Terminal" AppName = "Next Terminal"
AppBanner = ` AppBanner = `
_______ __ ___________ .__ .__ _______ __ ___________ .__ .__

View File

@ -24,33 +24,36 @@ type Tunnel struct {
func (r *Tunnel) Open() { func (r *Tunnel) Open() {
localAddr := fmt.Sprintf("%s:%d", r.LocalHost, r.LocalPort) localAddr := fmt.Sprintf("%s:%d", r.LocalHost, r.LocalPort)
for {
select {
case <-r.ctx.Done():
_ = r.listener.Close()
log.Debugf("SSH 隧道 %v 关闭", localAddr)
return
default:
log.Debugf("等待客户端访问 %v", localAddr)
localConn, err := r.listener.Accept()
if err != nil {
log.Debugf("接受连接失败 %v", err.Error())
continue
}
go func() { log.Debugf("客户端 %v 连接至 %v", localConn.RemoteAddr().String(), localAddr)
<-r.ctx.Done() remoteAddr := fmt.Sprintf("%s:%d", r.RemoteHost, r.RemotePort)
_ = r.listener.Close() log.Debugf("连接远程主机 %v ...", remoteAddr)
log.Debugf("SSH 隧道 %v 关闭", localAddr) remoteConn, err := r.Gateway.SshClient.Dial("tcp", remoteAddr)
}() if err != nil {
log.Debugf("等待客户端访问 %v", localAddr) log.Debugf("连接远程主机 %v 失败", remoteAddr)
localConn, err := r.listener.Accept() r.err = err
if err != nil { return
r.err = err }
return
log.Debugf("连接远程主机 %v 成功", remoteAddr)
go copyConn(localConn, remoteConn)
go copyConn(remoteConn, localConn)
log.Debugf("转发数据 [%v]->[%v]", localAddr, remoteAddr)
}
} }
log.Debugf("客户端 %v 连接至 %v", localConn.RemoteAddr().String(), localAddr)
remoteAddr := fmt.Sprintf("%s:%d", r.RemoteHost, r.RemotePort)
log.Debugf("连接远程主机 %v ...", remoteAddr)
remoteConn, err := r.Gateway.SshClient.Dial("tcp", remoteAddr)
if err != nil {
log.Debugf("连接远程主机 %v 失败", remoteAddr)
r.err = err
return
}
log.Debugf("连接远程主机 %v 成功", remoteAddr)
go copyConn(localConn, remoteConn)
go copyConn(remoteConn, localConn)
log.Debugf("转发数据 [%v]->[%v]", localAddr, remoteAddr)
} }
func (r Tunnel) Close() { func (r Tunnel) Close() {

View File

@ -1,6 +1,6 @@
{ {
"name": "next-terminal", "name": "next-terminal",
"version": "1.2.6-beta", "version": "1.2.7",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@ant-design/charts": "^1.2.13", "@ant-design/charts": "^1.2.13",