99 lines
1.7 KiB
Go
99 lines
1.7 KiB
Go
package session
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"next-terminal/server/guacd"
|
|
"next-terminal/server/term"
|
|
|
|
"github.com/gorilla/websocket"
|
|
)
|
|
|
|
type Session struct {
|
|
ID string
|
|
Protocol string
|
|
Mode string
|
|
WebSocket *websocket.Conn
|
|
GuacdTunnel *guacd.Tunnel
|
|
NextTerminal *term.NextTerminal
|
|
Observer *Manager
|
|
}
|
|
|
|
type Manager struct {
|
|
id string
|
|
sessions map[string]*Session
|
|
|
|
Add chan *Session
|
|
Del chan string
|
|
exit chan bool
|
|
}
|
|
|
|
func NewManager() *Manager {
|
|
return &Manager{
|
|
Add: make(chan *Session),
|
|
Del: make(chan string),
|
|
sessions: map[string]*Session{},
|
|
exit: make(chan bool, 1),
|
|
}
|
|
}
|
|
|
|
func NewObserver(id string) *Manager {
|
|
return &Manager{
|
|
id: id,
|
|
Add: make(chan *Session),
|
|
Del: make(chan string),
|
|
sessions: map[string]*Session{},
|
|
exit: make(chan bool, 1),
|
|
}
|
|
}
|
|
|
|
func (m *Manager) Start() {
|
|
defer fmt.Printf("Session Manager %v End\n", m.id)
|
|
fmt.Printf("Session Manager %v Open\n", m.id)
|
|
for {
|
|
select {
|
|
case s := <-m.Add:
|
|
m.sessions[s.ID] = s
|
|
case k := <-m.Del:
|
|
if _, ok := m.sessions[k]; ok {
|
|
ss := m.sessions[k]
|
|
if ss.GuacdTunnel != nil {
|
|
_ = ss.GuacdTunnel.Close()
|
|
}
|
|
if ss.NextTerminal != nil {
|
|
_ = ss.NextTerminal.Close()
|
|
}
|
|
|
|
if ss.WebSocket != nil {
|
|
_ = ss.WebSocket.Close()
|
|
}
|
|
if ss.Observer != nil {
|
|
ss.Observer.Close()
|
|
}
|
|
delete(m.sessions, k)
|
|
}
|
|
case <-m.exit:
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func (m *Manager) Close() {
|
|
m.exit <- true
|
|
}
|
|
|
|
func (m Manager) GetById(id string) *Session {
|
|
return m.sessions[id]
|
|
}
|
|
|
|
func (m Manager) All() map[string]*Session {
|
|
return m.sessions
|
|
}
|
|
|
|
var GlobalSessionManager *Manager
|
|
|
|
func init() {
|
|
GlobalSessionManager = NewManager()
|
|
go GlobalSessionManager.Start()
|
|
}
|