From a6d6cbcea77eaeee326bf30372bd77a0cc6ba0de Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 18 Jul 2023 16:21:57 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E7=9B=91=E6=8E=A7=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E7=BB=93=E6=9D=9F=EF=BC=8C=E5=BC=B9=E6=A1=86=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E6=96=AD=E5=BC=80=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/tunnel/monitor.go | 12 +++++++++--- pkg/tunnel/server.go | 1 + pkg/tunnel/ws_error.go | 2 ++ ui/src/components/GuacamoleMonitor.vue | 8 +++----- ui/src/i18n/lang/cn.js | 1 + ui/src/i18n/lang/en.js | 1 + ui/src/utils/status.js | 3 ++- 7 files changed, 19 insertions(+), 9 deletions(-) diff --git a/pkg/tunnel/monitor.go b/pkg/tunnel/monitor.go index 11a32be..990ab2e 100644 --- a/pkg/tunnel/monitor.go +++ b/pkg/tunnel/monitor.go @@ -11,6 +11,7 @@ import ( ) type MonitorCon struct { + Id string guacdTunnel Tunneler ws *websocket.Conn @@ -53,7 +54,8 @@ func (m *MonitorCon) Run(ctx context.Context) (err error) { for { instruction, err := t.readTunnelInstruction() if err != nil { - logger.Error(err) + _ = t.writeWsMessage([]byte(ErrDisconnect.String())) + logger.Infof("Monitor[%s] guacd tunnel read err: %+v", t.Id, err) exit <- err break } @@ -70,6 +72,8 @@ func (m *MonitorCon) Run(ctx context.Context) (err error) { for { _, message, err := t.ws.ReadMessage() if err != nil { + logger.Infof("Monitor[%s] ws read err: %+v", t.Id, err) + exit <- err break } @@ -82,11 +86,11 @@ func (m *MonitorCon) Run(ctx context.Context) (err error) { continue } } else { - logger.Errorf("Parse instruction err %s", err) + logger.Errorf("Monitor[%s] parse instruction err %s", t.Id, err) } _, err = t.writeTunnelMessage(message) if err != nil { - logger.Errorf("Guacamole server write err: %+v", err) + logger.Errorf("Monitor[%s] guacamole tunnel write err: %+v", t.Id, err) exit <- err break } @@ -97,8 +101,10 @@ func (m *MonitorCon) Run(ctx context.Context) (err error) { for { select { case err = <-exit: + logger.Infof("Monitor[%s] exit: %+v", m.Id, err) return err case <-ctx.Done(): + logger.Info("Monitor[%s] done", m.Id) return nil } } diff --git a/pkg/tunnel/server.go b/pkg/tunnel/server.go index 3a92f6c..47018a9 100644 --- a/pkg/tunnel/server.go +++ b/pkg/tunnel/server.go @@ -452,6 +452,7 @@ func (g *GuacamoleTunnelServer) Monitor(ctx *gin.Context) { } defer tunnelCon.Close() conn := MonitorCon{ + Id: sessionId, guacdTunnel: tunnelCon, ws: ws, } diff --git a/pkg/tunnel/ws_error.go b/pkg/tunnel/ws_error.go index 5b84f7a..2bf5229 100644 --- a/pkg/tunnel/ws_error.go +++ b/pkg/tunnel/ws_error.go @@ -56,4 +56,6 @@ var ( ErrGuacamoleServer = NewJMSGuacamoleError(1008, "Connect guacamole server failed") ErrPermission = NewJMSGuacamoleError(256, "No permission") + + ErrDisconnect = NewJMSGuacamoleError(1009, "Disconnect by client") ) diff --git a/ui/src/components/GuacamoleMonitor.vue b/ui/src/components/GuacamoleMonitor.vue index 4624500..3085de6 100644 --- a/ui/src/components/GuacamoleMonitor.vue +++ b/ui/src/components/GuacamoleMonitor.vue @@ -15,8 +15,7 @@ import { getMonitorConnectParams } from '@/utils/common' import { getSupportedMimetypes } from '@/utils/image' import { getSupportedGuacAudios } from '@/utils/audios' import { getSupportedGuacVideos } from '@/utils/video' -import { getLanguage } from '@/i18n' -import { ErrorStatusCodes } from '@/utils/status' +import { ConvertGuacamoleError, ErrorStatusCodes } from '@/utils/status' const pixelDensity = window.devicePixelRatio || 1 export default { @@ -220,9 +219,7 @@ export default { this.$log.debug(status, i18n.locale) const code = status.code let msg = status.message - if (getLanguage() === 'cn') { - msg = ErrorStatusCodes[code] ? this.$t(ErrorStatusCodes[code]) : status.message - } + msg = ErrorStatusCodes[code] ? this.$t(ErrorStatusCodes[code]) : this.$t(ConvertGuacamoleError(status.message)) this.$alert(msg, this.$t('ErrTitle'), { confirmButtonText: this.$t('OK'), callback: action => { @@ -239,6 +236,7 @@ export default { const tunnel = new Guacamole.WebSocketTunnel(wsURL) const client = new Guacamole.Client(tunnel) const vm = this + tunnel.receiveTimeout = 60 * 1000 tunnel.onerror = function tunnelError(status) { vm.$log.debug('tunnelError ', status) display.innerHTML = '' diff --git a/ui/src/i18n/lang/cn.js b/ui/src/i18n/lang/cn.js index 5402c97..adb5e5b 100644 --- a/ui/src/i18n/lang/cn.js +++ b/ui/src/i18n/lang/cn.js @@ -19,6 +19,7 @@ const message = { JMSErrAPIFailed: 'Core API 发生错误', JMSErrGatewayFailed: '网关连接失败', JMSErrGuacamoleServer: '无法连接 Guacamole 服务器', + JMSErrDisconnected: '会话连接已断开', GuaErrUpstreamNotFound: '无法连接到远程桌面服务器(网络不可达 | 安全策略错误)', GuaErrSessionConflict: '因与另一个连接冲突,远程桌面服务器关闭了本连接。请稍后重试。', GuaErrClientUnauthorized: '用户名和密码认证错误,登录失败', diff --git a/ui/src/i18n/lang/en.js b/ui/src/i18n/lang/en.js index 4ddfefb..6d6edc5 100644 --- a/ui/src/i18n/lang/en.js +++ b/ui/src/i18n/lang/en.js @@ -18,6 +18,7 @@ const message = { JMSErrAPIFailed: 'Core API failed', JMSErrGatewayFailed: 'Gateway not available', JMSErrGuacamoleServer: 'Connect guacamole server failed', + JMSErrDisconnected: 'Session Disconnected', GuaErrUpstreamNotFound: 'The remote desktop server does not appear to exist, or cannot be reached over the network.', GuaErrSessionConflict: 'The session has ended because it conflicts with another session.', GuaErrClientUnauthorized: 'User failed to logged in. (username and password are incorrect)', diff --git a/ui/src/utils/status.js b/ui/src/utils/status.js index 28ec32e..b087e33 100644 --- a/ui/src/utils/status.js +++ b/ui/src/utils/status.js @@ -12,7 +12,8 @@ export const ErrorStatusCodes = { 1005: 'JMSErrTerminatedByAdmin', 1006: 'JMSErrAPIFailed', 1007: 'JMSErrGatewayFailed', - 1008: 'JMSErrGuacamoleServer' + 1008: 'JMSErrGuacamoleServer', + 1009: 'JMSErrDisconnected' } export function ConvertAPIError(errMsg) {