修复「接入网关」+「guacd」无法使用监控和文件管理功能的问题
This commit is contained in:
2
build.sh
2
build.sh
@ -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"
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -5,7 +5,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
AppVersion = "v1.2.6-beta"
|
AppVersion = "v1.2.7"
|
||||||
AppName = "Next Terminal"
|
AppName = "Next Terminal"
|
||||||
AppBanner = `
|
AppBanner = `
|
||||||
_______ __ ___________ .__ .__
|
_______ __ ___________ .__ .__
|
||||||
|
@ -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() {
|
||||||
|
@ -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",
|
||||||
|
Reference in New Issue
Block a user