diff --git a/pkg/webconsole/options/options.go b/pkg/webconsole/options/options.go index b3331a0088..785729b0ca 100644 --- a/pkg/webconsole/options/options.go +++ b/pkg/webconsole/options/options.go @@ -36,6 +36,8 @@ type WebConsoleOptions struct { EnableWatermark bool `help:"enable water mark" default:"false"` EnableCommandRecording bool `help:"enable command recording" default:"false"` + + KeepWebsocketSession bool `help:"keep websocket session" default:"false"` } func OnOptionsChange(oldO, newO interface{}) bool { diff --git a/pkg/webconsole/server/ssh_server.go b/pkg/webconsole/server/ssh_server.go index a1d5709c39..fafb2f728b 100644 --- a/pkg/webconsole/server/ssh_server.go +++ b/pkg/webconsole/server/ssh_server.go @@ -278,7 +278,9 @@ func (s *WebsocketServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { delSftpClient(s.Session.Id) s.sftp.Close() s.conn.Close() - s.Session.Close() + if !options.Options.KeepWebsocketSession { + s.Session.Close() + } keepAliveDone <- struct{}{} }() diff --git a/pkg/webconsole/session/session.go b/pkg/webconsole/session/session.go index e06a7eef75..ef5cdcca22 100644 --- a/pkg/webconsole/session/session.go +++ b/pkg/webconsole/session/session.go @@ -92,8 +92,10 @@ func (man *SSessionManager) Get(accessToken string) (*SSession, bool) { s := obj.(*SSession) protocol := s.GetProtocol() if protocol != SPICE && time.Since(s.AccessedAt) < AccessInterval { - log.Warningf("Protol: %q, Token: %s, Session: %s can't be accessed during %s, last accessed at: %s", s.GetProtocol(), accessToken, s.Id, AccessInterval, s.AccessedAt) - return nil, false + if !(protocol == WS && o.Options.KeepWebsocketSession) { + log.Warningf("Protol: %q, Token: %s, Session: %s can't be accessed during %s, last accessed at: %s", s.GetProtocol(), accessToken, s.Id, AccessInterval, s.AccessedAt) + return nil, false + } } s.AccessedAt = time.Now() return s, true