From 887ef5246bc167915df4cdd1977c34fff68c28ce Mon Sep 17 00:00:00 2001 From: halo Date: Thu, 22 Aug 2024 10:36:24 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=88=86=E8=BE=A8?= =?UTF-8?q?=E7=8E=87=E4=B8=8D=E7=94=9F=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/tunnel/conn.go | 37 +++++++++++++++++++------- pkg/tunnel/server.go | 11 ++++---- ui/src/components/GuacamoleConnect.vue | 2 +- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/pkg/tunnel/conn.go b/pkg/tunnel/conn.go index 2dce6f0..dc05790 100644 --- a/pkg/tunnel/conn.go +++ b/pkg/tunnel/conn.go @@ -5,6 +5,7 @@ import ( "fmt" "net" "sort" + "strconv" "strings" "sync" "sync/atomic" @@ -159,7 +160,6 @@ func (t *Connection) Run(ctx *gin.Context) (err error) { instruction, err := t.readTunnelInstruction() if err != nil { logger.Errorf("Session[%s] guacamole server read err: %+v", t, err) - exit <- err break } @@ -185,7 +185,6 @@ func (t *Connection) Run(ctx *gin.Context) (err error) { requiredErr = guacd.Instruction{} continue } - } case guacd.InstructionRequired: msg := fmt.Sprintf("required: %s", strings.Join(instruction.Args, ",")) @@ -197,7 +196,6 @@ func (t *Connection) Run(ctx *gin.Context) (err error) { if err = t.writeWsMessage([]byte(instruction.String())); err != nil { logger.Errorf("Session[%s] send web client err: %+v", t, err) - exit <- err break } } @@ -214,7 +212,6 @@ func (t *Connection) Run(ctx *gin.Context) (err error) { } else { logger.Errorf("Session[%s] web client read err: %+v", t, err1) } - exit <- err1 break } @@ -282,7 +279,6 @@ func (t *Connection) Run(ctx *gin.Context) (err error) { _, err = t.writeTunnelMessage(message) if err != nil { logger.Errorf("Session[%s] guacamole server write err: %+v", t, err) - exit <- err break } } @@ -463,10 +459,34 @@ func (t *Connection) generateCommandResult(item *session.ExecutedCommand) *model func (t *Connection) ReConnect(ws *websocket.Conn) { // 重新连接 guacamole server + info := guacd.NewClientInformation() + opts := t.Sess.AuthInfo.ConnectOptions + resolution := strings.ToLower(opts.Resolution) + switch resolution { + case "": + case "auto": + default: + logger.Infof("Session[%s] Connect options resolution: %s", + t.Sess.ID, resolution) + resolutions := strings.Split(resolution, "x") + if len(resolutions) == 2 { + width := resolutions[0] + height := resolutions[1] + if widthInt, err1 := strconv.Atoi(width); err1 == nil && widthInt > 0 { + info.OptimalScreenWidth = widthInt + } + if heightInt, err1 := strconv.Atoi(height); err1 == nil && heightInt > 0 { + info.OptimalScreenHeight = heightInt + } + } + } conf := guacd.NewConfiguration() conf.ConnectionID = t.guacdTunnel.UUID + for argName, argValue := range info.ExtraConfig() { + conf.SetParameter(argName, argValue) + } guacdAddr := net.JoinHostPort(config.GlobalConfig.GuaHost, config.GlobalConfig.GuaPort) - newTunnel, err := guacd.NewTunnel(guacdAddr, conf, guacd.NewClientInformation()) + newTunnel, err := guacd.NewTunnel(guacdAddr, conf, info) if err != nil { logger.Errorf("Session[%s] reconnect guacamole server err: %+v", t, err) return @@ -501,10 +521,7 @@ func (t *Connection) ReConnect(ws *websocket.Conn) { default: } } - - if err2 := wsWrite([]byte(instruction.String())); err2 != nil { - logger.Errorf("Session[%s] reconnect write ws message err: %+v", t, err2) - } + _ = wsWrite([]byte(instruction.String())) } t.guacdConnect.Delete(newTunnel) }() diff --git a/pkg/tunnel/server.go b/pkg/tunnel/server.go index 21fb06d..63f22d7 100644 --- a/pkg/tunnel/server.go +++ b/pkg/tunnel/server.go @@ -102,9 +102,9 @@ func (g *GuacamoleTunnelServer) Connect(ctx *gin.Context) { // 查询缓存的 connection,未找到则创建新的 connection if tun := g.Cache.Get(sessionId); tun != nil { - if tun.Sess.User.ID != user.ID { - logger.Errorf("No session tunnel found %s", sessionId) - _ = ws.WriteMessage(websocket.TextMessage, []byte(ErrNoSession.String())) + if user.ID != tun.Sess.User.ID { + logger.Error("No valid auth user found") + _ = ws.WriteMessage(websocket.TextMessage, []byte(ErrAuthUser.String())) return } p, _ := json.Marshal(tun.Sess) @@ -210,8 +210,7 @@ func (g *GuacamoleTunnelServer) Connect(ctx *gin.Context) { } var tunnel *guacd.Tunnel - guacdAddr := config.GlobalConfig.SelectGuacdAddr() - + guacdAddr := net.JoinHostPort(config.GlobalConfig.GuaHost, config.GlobalConfig.GuaPort) tunnel, err = guacd.NewTunnel(guacdAddr, conf, info) if err != nil { logger.Errorf("Connect tunnel err: %+v", err) @@ -497,6 +496,8 @@ func (g *GuacamoleTunnelServer) Monitor(ctx *gin.Context) { Id: sessionId, guacdTunnel: tunnelCon, ws: ws, + Service: g, + User: user, } logger.Infof("User %s start to monitor session %s", user, sessionId) _ = conn.Run(ctx.Request.Context()) diff --git a/ui/src/components/GuacamoleConnect.vue b/ui/src/components/GuacamoleConnect.vue index b82f918..1440f80 100644 --- a/ui/src/components/GuacamoleConnect.vue +++ b/ui/src/components/GuacamoleConnect.vue @@ -699,7 +699,7 @@ export default { if (displayHeight === optimalWidth && displayWidth === optimalHeight) { return } - this.client.sendSize(optimalWidth, optimalHeight) + // this.client.sendSize(optimalWidth, optimalHeight) } },