From 03b59d6a2fa549be391e3490985fe9bd60b7d448 Mon Sep 17 00:00:00 2001 From: dushixiang Date: Wed, 20 Apr 2022 22:03:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E3=80=8C=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=E7=BD=91=E5=85=B3=E3=80=8D+=E3=80=8Cguacd=E3=80=8D=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E4=BD=BF=E7=94=A8=E7=9B=91=E6=8E=A7=E5=92=8C=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.sh | 2 +- server/api/guacamole.go | 23 ++++++++------- server/constant/const.go | 2 +- server/global/gateway/tunnel.go | 51 +++++++++++++++++---------------- web/package.json | 2 +- 5 files changed, 42 insertions(+), 38 deletions(-) diff --git a/build.sh b/build.sh index 05d40a62..2c4c5f05 100644 --- a/build.sh +++ b/build.sh @@ -5,7 +5,7 @@ echo "clean build history" echo "build web..." cd web || exit -yarn build +yarn build || exit cp -r build ../server/resource/ echo "build web success" diff --git a/server/api/guacamole.go b/server/api/guacamole.go index bc7c2c95..94c0084b 100644 --- a/server/api/guacamole.go +++ b/server/api/guacamole.go @@ -30,6 +30,7 @@ const ( AccessGatewayUnAvailable int = 803 AccessGatewayCreateError int = 804 AssetNotActive int = 805 + NewSshClientError int = 806 ) var UpGrader = websocket.Upgrader{ @@ -69,10 +70,7 @@ func (api GuacamoleApi) Guacamole(c echo.Context) error { return err } api.setConfig(propertyMap, s, configuration) - var ( - ip = s.IP - port = s.Port - ) + if s.AccessGatewayId != "" && s.AccessGatewayId != "-" { g, err := service.GatewayService.GetGatewayAndReconnectById(s.AccessGatewayId) if err != nil { @@ -83,18 +81,18 @@ func (api GuacamoleApi) Guacamole(c echo.Context) error { utils.Disconnect(ws, AccessGatewayUnAvailable, "接入网关不可用:"+g.Message) 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 { utils.Disconnect(ws, AccessGatewayCreateError, "创建SSH隧道失败:"+err.Error()) return nil } - ip = exposedIP - port = exposedPort + s.IP = exposedIP + s.Port = exposedPort defer g.CloseSshTunnel(s.ID) } - configuration.SetParameter("hostname", ip) - configuration.SetParameter("port", strconv.Itoa(port)) + configuration.SetParameter("hostname", s.IP) + configuration.SetParameter("port", strconv.Itoa(s.Port)) // 加载资产配置的属性,优先级比全局配置的高,因此最后加载,覆盖掉全局配置 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 { nextTerminal, err := CreateNextTerminalBySession(s) - if err == nil { - nextSession.NextTerminal = nextTerminal + if err != nil { + 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) diff --git a/server/constant/const.go b/server/constant/const.go index e1015ed7..9f172f4e 100644 --- a/server/constant/const.go +++ b/server/constant/const.go @@ -5,7 +5,7 @@ import ( ) const ( - AppVersion = "v1.2.6-beta" + AppVersion = "v1.2.7" AppName = "Next Terminal" AppBanner = ` _______ __ ___________ .__ .__ diff --git a/server/global/gateway/tunnel.go b/server/global/gateway/tunnel.go index b8d03646..5a272da8 100644 --- a/server/global/gateway/tunnel.go +++ b/server/global/gateway/tunnel.go @@ -24,33 +24,36 @@ type Tunnel struct { func (r *Tunnel) Open() { 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() { - <-r.ctx.Done() - _ = r.listener.Close() - log.Debugf("SSH 隧道 %v 关闭", localAddr) - }() - log.Debugf("等待客户端访问 %v", localAddr) - localConn, err := r.listener.Accept() - if err != nil { - r.err = err - return - } + 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 连接至 %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) + } } - - log.Debugf("连接远程主机 %v 成功", remoteAddr) - go copyConn(localConn, remoteConn) - go copyConn(remoteConn, localConn) - log.Debugf("转发数据 [%v]->[%v]", localAddr, remoteAddr) } func (r Tunnel) Close() { diff --git a/web/package.json b/web/package.json index e7c6c018..48fa55bf 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "next-terminal", - "version": "1.2.6-beta", + "version": "1.2.7", "private": true, "dependencies": { "@ant-design/charts": "^1.2.13",