mirror of
https://github.com/wavetermdev/waveterm.git
synced 2024-12-23 16:58:27 +01:00
remove screens from session. add screenlinestype (replaces 'window' lines)
This commit is contained in:
parent
fd33157130
commit
1059a10727
@ -194,19 +194,20 @@ func HandleLogActiveState(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// params: screenid
|
// params: screenid
|
||||||
func HandleGetFullScreen(w http.ResponseWriter, r *http.Request) {
|
func HandleGetScreenLines(w http.ResponseWriter, r *http.Request) {
|
||||||
qvals := r.URL.Query()
|
qvals := r.URL.Query()
|
||||||
screenId := qvals.Get("screenid")
|
screenId := qvals.Get("screenid")
|
||||||
if _, err := uuid.Parse(screenId); err != nil {
|
if _, err := uuid.Parse(screenId); err != nil {
|
||||||
WriteJsonError(w, fmt.Errorf("invalid screenid: %w", err))
|
WriteJsonError(w, fmt.Errorf("invalid screenid: %w", err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
screen, err := sstore.GetFullScreenById(r.Context(), screenId)
|
screenLines, err := sstore.GetScreenLinesById(r.Context(), screenId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
WriteJsonError(w, err)
|
WriteJsonError(w, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
WriteJsonSuccess(w, screen)
|
update := &sstore.ModelUpdate{ScreenLines: screenLines}
|
||||||
|
WriteJsonSuccess(w, update)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -562,7 +563,7 @@ func main() {
|
|||||||
gr.HandleFunc("/api/ptyout", AuthKeyWrap(HandleGetPtyOut))
|
gr.HandleFunc("/api/ptyout", AuthKeyWrap(HandleGetPtyOut))
|
||||||
gr.HandleFunc("/api/remote-pty", AuthKeyWrap(HandleRemotePty))
|
gr.HandleFunc("/api/remote-pty", AuthKeyWrap(HandleRemotePty))
|
||||||
gr.HandleFunc("/api/rtnstate", AuthKeyWrap(HandleRtnState))
|
gr.HandleFunc("/api/rtnstate", AuthKeyWrap(HandleRtnState))
|
||||||
gr.HandleFunc("/api/get-full-screen", AuthKeyWrap(HandleGetFullScreen))
|
gr.HandleFunc("/api/get-screen-lines", AuthKeyWrap(HandleGetScreenLines))
|
||||||
gr.HandleFunc("/api/run-command", AuthKeyWrap(HandleRunCommand)).Methods("POST")
|
gr.HandleFunc("/api/run-command", AuthKeyWrap(HandleRunCommand)).Methods("POST")
|
||||||
gr.HandleFunc("/api/get-client-data", AuthKeyWrap(HandleGetClientData))
|
gr.HandleFunc("/api/get-client-data", AuthKeyWrap(HandleGetClientData))
|
||||||
gr.HandleFunc("/api/set-winsize", AuthKeyWrap(HandleSetWinSize))
|
gr.HandleFunc("/api/set-winsize", AuthKeyWrap(HandleSetWinSize))
|
||||||
|
@ -461,13 +461,8 @@ func ScreenArchiveCommand(ctx context.Context, pk *scpacket.FeCommandPacketType)
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("/screen:archive cannot get updated screen obj: %v", err)
|
return nil, fmt.Errorf("/screen:archive cannot get updated screen obj: %v", err)
|
||||||
}
|
}
|
||||||
bareSession, err := sstore.GetBareSessionById(ctx, ids.SessionId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("/screen:archive cannot retrieve updated session obj: %v", err)
|
|
||||||
}
|
|
||||||
bareSession.Screens = append(bareSession.Screens, screen)
|
|
||||||
update := sstore.ModelUpdate{
|
update := sstore.ModelUpdate{
|
||||||
Sessions: []*sstore.SessionType{bareSession},
|
Screens: []*sstore.ScreenType{screen},
|
||||||
}
|
}
|
||||||
return update, nil
|
return update, nil
|
||||||
}
|
}
|
||||||
|
@ -395,27 +395,17 @@ func GetBareSessionById(ctx context.Context, sessionId string) (*SessionType, er
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetAllSessions(ctx context.Context) (*ModelUpdate, error) {
|
func GetAllSessions(ctx context.Context) (*ModelUpdate, error) {
|
||||||
var rtn []*SessionType
|
return WithTxRtn(ctx, func(tx *TxWrap) (*ModelUpdate, error) {
|
||||||
var activeSessionId string
|
update := &ModelUpdate{}
|
||||||
txErr := WithTx(ctx, func(tx *TxWrap) error {
|
|
||||||
query := `SELECT * FROM session ORDER BY archived, sessionidx, archivedts`
|
query := `SELECT * FROM session ORDER BY archived, sessionidx, archivedts`
|
||||||
tx.Select(&rtn, query)
|
tx.Select(&update.Sessions, query)
|
||||||
sessionMap := make(map[string]*SessionType)
|
sessionMap := make(map[string]*SessionType)
|
||||||
for _, session := range rtn {
|
for _, session := range update.Sessions {
|
||||||
sessionMap[session.SessionId] = session
|
sessionMap[session.SessionId] = session
|
||||||
session.Full = true
|
session.Full = true
|
||||||
}
|
}
|
||||||
query = `SELECT * FROM screen ORDER BY archived, screenidx, archivedts`
|
query = `SELECT * FROM screen ORDER BY archived, screenidx, archivedts`
|
||||||
screens := SelectMapsGen[*ScreenType](tx, query)
|
update.Screens = SelectMapsGen[*ScreenType](tx, query)
|
||||||
screenMap := make(map[string][]*ScreenType)
|
|
||||||
for _, screen := range screens {
|
|
||||||
screenArr := screenMap[screen.SessionId]
|
|
||||||
screenArr = append(screenArr, screen)
|
|
||||||
screenMap[screen.SessionId] = screenArr
|
|
||||||
}
|
|
||||||
for _, session := range rtn {
|
|
||||||
session.Screens = screenMap[session.SessionId]
|
|
||||||
}
|
|
||||||
query = `SELECT * FROM remote_instance`
|
query = `SELECT * FROM remote_instance`
|
||||||
riArr := SelectMapsGen[*RemoteInstance](tx, query)
|
riArr := SelectMapsGen[*RemoteInstance](tx, query)
|
||||||
for _, ri := range riArr {
|
for _, ri := range riArr {
|
||||||
@ -425,19 +415,15 @@ func GetAllSessions(ctx context.Context) (*ModelUpdate, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
query = `SELECT activesessionid FROM client`
|
query = `SELECT activesessionid FROM client`
|
||||||
activeSessionId = tx.GetString(query)
|
update.ActiveSessionId = tx.GetString(query)
|
||||||
return nil
|
return update, nil
|
||||||
})
|
})
|
||||||
if txErr != nil {
|
|
||||||
return nil, txErr
|
|
||||||
}
|
|
||||||
return &ModelUpdate{Sessions: rtn, ActiveSessionId: activeSessionId}, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetFullScreenById(ctx context.Context, screenId string) (*ScreenType, error) {
|
func GetScreenLinesById(ctx context.Context, screenId string) (*ScreenLinesType, error) {
|
||||||
return WithTxRtn(ctx, func(tx *TxWrap) (*ScreenType, error) {
|
return WithTxRtn(ctx, func(tx *TxWrap) (*ScreenLinesType, error) {
|
||||||
query := `SELECT * FROM screen WHERE screenid = ?`
|
query := `SELECT sessionid, screenid, windowid FROM screen WHERE screenid = ?`
|
||||||
screen := GetMapGen[*ScreenType](tx, query, screenId)
|
screen := GetMappable[*ScreenLinesType](tx, query, screenId)
|
||||||
if screen == nil {
|
if screen == nil {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
@ -445,7 +431,6 @@ func GetFullScreenById(ctx context.Context, screenId string) (*ScreenType, error
|
|||||||
tx.Select(&screen.Lines, query, screen.SessionId, screen.WindowId)
|
tx.Select(&screen.Lines, query, screen.SessionId, screen.WindowId)
|
||||||
query = `SELECT * FROM cmd WHERE cmdid IN (SELECT cmdid FROM line WHERE sessionid = ? AND windowid = ?)`
|
query = `SELECT * FROM cmd WHERE cmdid IN (SELECT cmdid FROM line WHERE sessionid = ? AND windowid = ?)`
|
||||||
screen.Cmds = SelectMapsGen[*CmdType](tx, query, screen.SessionId, screen.WindowId)
|
screen.Cmds = SelectMapsGen[*CmdType](tx, query, screen.SessionId, screen.WindowId)
|
||||||
screen.Full = true
|
|
||||||
return screen, nil
|
return screen, nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -678,12 +663,15 @@ func InsertScreen(ctx context.Context, sessionId string, origScreenName string,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
update := ModelUpdate{Screens: []*ScreenType{newScreen}}
|
||||||
|
if activate {
|
||||||
bareSession, err := GetBareSessionById(ctx, sessionId)
|
bareSession, err := GetBareSessionById(ctx, sessionId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, txErr
|
||||||
}
|
}
|
||||||
bareSession.Screens = append(bareSession.Screens, newScreen)
|
update.Sessions = []*SessionType{bareSession}
|
||||||
return ModelUpdate{Sessions: []*SessionType{bareSession}}, nil
|
}
|
||||||
|
return update, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetScreenById(ctx context.Context, screenId string) (*ScreenType, error) {
|
func GetScreenById(ctx context.Context, screenId string) (*ScreenType, error) {
|
||||||
@ -975,6 +963,7 @@ func CleanWindow(sessionId string, windowId string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ArchiveScreen(ctx context.Context, sessionId string, screenId string) (UpdatePacket, error) {
|
func ArchiveScreen(ctx context.Context, sessionId string, screenId string) (UpdatePacket, error) {
|
||||||
|
var isActive bool
|
||||||
txErr := WithTx(ctx, func(tx *TxWrap) error {
|
txErr := WithTx(ctx, func(tx *TxWrap) error {
|
||||||
query := `SELECT screenid FROM screen WHERE sessionid = ? AND screenid = ?`
|
query := `SELECT screenid FROM screen WHERE sessionid = ? AND screenid = ?`
|
||||||
if !tx.Exists(query, sessionId, screenId) {
|
if !tx.Exists(query, sessionId, screenId) {
|
||||||
@ -992,7 +981,7 @@ func ArchiveScreen(ctx context.Context, sessionId string, screenId string) (Upda
|
|||||||
}
|
}
|
||||||
query = `UPDATE screen SET archived = 1, archivedts = ?, screenidx = 0 WHERE sessionid = ? AND screenid = ?`
|
query = `UPDATE screen SET archived = 1, archivedts = ?, screenidx = 0 WHERE sessionid = ? AND screenid = ?`
|
||||||
tx.Exec(query, time.Now().UnixMilli(), sessionId, screenId)
|
tx.Exec(query, time.Now().UnixMilli(), sessionId, screenId)
|
||||||
isActive := tx.Exists(`SELECT sessionid FROM session WHERE sessionid = ? AND activescreenid = ?`, sessionId, screenId)
|
isActive = tx.Exists(`SELECT sessionid FROM session WHERE sessionid = ? AND activescreenid = ?`, sessionId, screenId)
|
||||||
if isActive {
|
if isActive {
|
||||||
screenIds := tx.SelectStrings(`SELECT screenid FROM screen WHERE sessionid = ? AND NOT archived ORDER BY screenidx`, sessionId)
|
screenIds := tx.SelectStrings(`SELECT screenid FROM screen WHERE sessionid = ? AND NOT archived ORDER BY screenidx`, sessionId)
|
||||||
nextId := getNextId(screenIds, screenId)
|
nextId := getNextId(screenIds, screenId)
|
||||||
@ -1003,14 +992,17 @@ func ArchiveScreen(ctx context.Context, sessionId string, screenId string) (Upda
|
|||||||
if txErr != nil {
|
if txErr != nil {
|
||||||
return nil, txErr
|
return nil, txErr
|
||||||
}
|
}
|
||||||
|
newScreen, err := GetScreenById(ctx, screenId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("cannot retrive archived screen: %w", err)
|
||||||
|
}
|
||||||
|
update := ModelUpdate{Screens: []*ScreenType{newScreen}}
|
||||||
|
if isActive {
|
||||||
bareSession, err := GetBareSessionById(ctx, sessionId)
|
bareSession, err := GetBareSessionById(ctx, sessionId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, txErr
|
return nil, err
|
||||||
}
|
}
|
||||||
update := ModelUpdate{Sessions: []*SessionType{bareSession}}
|
update.Sessions = []*SessionType{bareSession}
|
||||||
newScreen, _ := GetScreenById(ctx, screenId)
|
|
||||||
if newScreen != nil {
|
|
||||||
bareSession.Screens = append(bareSession.Screens, newScreen)
|
|
||||||
}
|
}
|
||||||
return update, nil
|
return update, nil
|
||||||
}
|
}
|
||||||
@ -1031,6 +1023,7 @@ func UnArchiveScreen(ctx context.Context, sessionId string, screenId string) err
|
|||||||
|
|
||||||
func DeleteScreen(ctx context.Context, screenId string) (UpdatePacket, error) {
|
func DeleteScreen(ctx context.Context, screenId string) (UpdatePacket, error) {
|
||||||
var swkeys SWKeys
|
var swkeys SWKeys
|
||||||
|
var isActive bool
|
||||||
txErr := WithTx(ctx, func(tx *TxWrap) error {
|
txErr := WithTx(ctx, func(tx *TxWrap) error {
|
||||||
query := `SELECT screenid FROM screen WHERE screenid = ?`
|
query := `SELECT screenid FROM screen WHERE screenid = ?`
|
||||||
if !tx.Exists(query, screenId) {
|
if !tx.Exists(query, screenId) {
|
||||||
@ -1046,7 +1039,7 @@ func DeleteScreen(ctx context.Context, screenId string) (UpdatePacket, error) {
|
|||||||
if numScreens <= 1 {
|
if numScreens <= 1 {
|
||||||
return fmt.Errorf("cannot purge the last screen in a session")
|
return fmt.Errorf("cannot purge the last screen in a session")
|
||||||
}
|
}
|
||||||
isActive := tx.Exists(`SELECT sessionid FROM session WHERE sessionid = ? AND activescreenid = ?`, swkeys.SessionId, screenId)
|
isActive = tx.Exists(`SELECT sessionid FROM session WHERE sessionid = ? AND activescreenid = ?`, swkeys.SessionId, screenId)
|
||||||
if isActive {
|
if isActive {
|
||||||
screenIds := tx.SelectStrings(`SELECT screenid FROM screen WHERE sessionid = ? AND NOT archived ORDER BY screenidx`, swkeys.SessionId)
|
screenIds := tx.SelectStrings(`SELECT screenid FROM screen WHERE sessionid = ? AND NOT archived ORDER BY screenidx`, swkeys.SessionId)
|
||||||
nextId := getNextId(screenIds, screenId)
|
nextId := getNextId(screenIds, screenId)
|
||||||
@ -1060,12 +1053,15 @@ func DeleteScreen(ctx context.Context, screenId string) (UpdatePacket, error) {
|
|||||||
return nil, txErr
|
return nil, txErr
|
||||||
}
|
}
|
||||||
go CleanWindow(swkeys.SessionId, swkeys.WindowId)
|
go CleanWindow(swkeys.SessionId, swkeys.WindowId)
|
||||||
|
update := ModelUpdate{}
|
||||||
|
update.Screens = []*ScreenType{&ScreenType{SessionId: swkeys.SessionId, ScreenId: screenId, Remove: true}}
|
||||||
|
if isActive {
|
||||||
bareSession, err := GetBareSessionById(ctx, swkeys.SessionId)
|
bareSession, err := GetBareSessionById(ctx, swkeys.SessionId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
bareSession.Screens = append(bareSession.Screens, &ScreenType{SessionId: swkeys.SessionId, ScreenId: screenId, Remove: true})
|
update.Sessions = []*SessionType{bareSession}
|
||||||
update := ModelUpdate{Sessions: []*SessionType{bareSession}}
|
}
|
||||||
return update, nil
|
return update, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1308,11 +1304,11 @@ func ArchiveScreenLines(ctx context.Context, screenId string) (*ModelUpdate, err
|
|||||||
if txErr != nil {
|
if txErr != nil {
|
||||||
return nil, txErr
|
return nil, txErr
|
||||||
}
|
}
|
||||||
screen, err := GetFullScreenById(ctx, screenId)
|
screenLines, err := GetScreenLinesById(ctx, screenId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &ModelUpdate{Screens: []*ScreenType{screen}}, nil
|
return &ModelUpdate{ScreenLines: screenLines}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func PurgeScreenLines(ctx context.Context, screenId string) (*ModelUpdate, error) {
|
func PurgeScreenLines(ctx context.Context, screenId string) (*ModelUpdate, error) {
|
||||||
@ -1338,7 +1334,11 @@ func PurgeScreenLines(ctx context.Context, screenId string) (*ModelUpdate, error
|
|||||||
return nil, txErr
|
return nil, txErr
|
||||||
}
|
}
|
||||||
go cleanSessionCmds(context.Background(), swkeys.SessionId)
|
go cleanSessionCmds(context.Background(), swkeys.SessionId)
|
||||||
screen, err := GetFullScreenById(ctx, screenId)
|
screen, err := GetScreenById(ctx, screenId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
screenLines, err := GetScreenLinesById(ctx, screenId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -1349,9 +1349,9 @@ func PurgeScreenLines(ctx context.Context, screenId string) (*ModelUpdate, error
|
|||||||
LineId: lineId,
|
LineId: lineId,
|
||||||
Remove: true,
|
Remove: true,
|
||||||
}
|
}
|
||||||
screen.Lines = append(screen.Lines, line)
|
screenLines.Lines = append(screenLines.Lines, line)
|
||||||
}
|
}
|
||||||
return &ModelUpdate{Screens: []*ScreenType{screen}}, nil
|
return &ModelUpdate{Screens: []*ScreenType{screen}, ScreenLines: screenLines}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetRunningWindowCmds(ctx context.Context, sessionId string, windowId string) ([]*CmdType, error) {
|
func GetRunningWindowCmds(ctx context.Context, sessionId string, windowId string) ([]*CmdType, error) {
|
||||||
|
@ -202,7 +202,7 @@ type ClientData struct {
|
|||||||
FeOpts FeOptsType `json:"feopts"`
|
FeOpts FeOptsType `json:"feopts"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c ClientData) UseDBMap() {}
|
func (ClientData) UseDBMap() {}
|
||||||
|
|
||||||
type CloudAclType struct {
|
type CloudAclType struct {
|
||||||
UserId string `json:"userid"`
|
UserId string `json:"userid"`
|
||||||
@ -218,7 +218,6 @@ type SessionType struct {
|
|||||||
NotifyNum int64 `json:"notifynum"`
|
NotifyNum int64 `json:"notifynum"`
|
||||||
Archived bool `json:"archived,omitempty"`
|
Archived bool `json:"archived,omitempty"`
|
||||||
ArchivedTs int64 `json:"archivedts,omitempty"`
|
ArchivedTs int64 `json:"archivedts,omitempty"`
|
||||||
Screens []*ScreenType `json:"screens"`
|
|
||||||
Remotes []*RemoteInstance `json:"remotes"`
|
Remotes []*RemoteInstance `json:"remotes"`
|
||||||
|
|
||||||
// only for updates
|
// only for updates
|
||||||
@ -387,6 +386,16 @@ type SWKeys struct {
|
|||||||
WindowId string
|
WindowId string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ScreenLinesType struct {
|
||||||
|
SessionId string `json:"sessionid"`
|
||||||
|
ScreenId string `json:"screenid"`
|
||||||
|
WindowId string `json:"windowid"`
|
||||||
|
Lines []*LineType `json:"lines" dbmap:"-"`
|
||||||
|
Cmds []*CmdType `json:"cmds" dbmap:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ScreenLinesType) UseDBMap() {}
|
||||||
|
|
||||||
type ScreenType struct {
|
type ScreenType struct {
|
||||||
SessionId string `json:"sessionid"`
|
SessionId string `json:"sessionid"`
|
||||||
ScreenId string `json:"screenid"`
|
ScreenId string `json:"screenid"`
|
||||||
@ -404,13 +413,8 @@ type ScreenType struct {
|
|||||||
Archived bool `json:"archived,omitempty"`
|
Archived bool `json:"archived,omitempty"`
|
||||||
ArchivedTs int64 `json:"archivedts,omitempty"`
|
ArchivedTs int64 `json:"archivedts,omitempty"`
|
||||||
|
|
||||||
// only for "full"
|
|
||||||
Lines []*LineType `json:"lines"`
|
|
||||||
Cmds []*CmdType `json:"cmds"`
|
|
||||||
|
|
||||||
// only for updates
|
// only for updates
|
||||||
Remove bool `json:"remove,omitempty"`
|
Remove bool `json:"remove,omitempty"`
|
||||||
Full bool `json:"full,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ScreenType) ToMap() map[string]interface{} {
|
func (s *ScreenType) ToMap() map[string]interface{} {
|
||||||
|
@ -33,6 +33,7 @@ type ModelUpdate struct {
|
|||||||
Sessions []*SessionType `json:"sessions,omitempty"`
|
Sessions []*SessionType `json:"sessions,omitempty"`
|
||||||
ActiveSessionId string `json:"activesessionid,omitempty"`
|
ActiveSessionId string `json:"activesessionid,omitempty"`
|
||||||
Screens []*ScreenType `json:"screens,omitempty"`
|
Screens []*ScreenType `json:"screens,omitempty"`
|
||||||
|
ScreenLines *ScreenLinesType `json:"screenlines,omitempty"`
|
||||||
Line *LineType `json:"line,omitempty"`
|
Line *LineType `json:"line,omitempty"`
|
||||||
Lines []*LineType `json:"lines,omitempty"`
|
Lines []*LineType `json:"lines,omitempty"`
|
||||||
Cmd *CmdType `json:"cmd,omitempty"`
|
Cmd *CmdType `json:"cmd,omitempty"`
|
||||||
|
Loading…
Reference in New Issue
Block a user