screen deletion working, bug fixes

This commit is contained in:
sawka
2022-07-15 01:57:45 -07:00
parent 275e177218
commit 5b1eb383e3
4 changed files with 106 additions and 13 deletions
+20 -4
View File
@@ -9,6 +9,7 @@ import (
"io/fs"
"net/http"
"os"
"runtime/debug"
"strconv"
"strings"
"sync"
@@ -334,6 +335,15 @@ type runCommandResponse struct {
}
func HandleRunCommand(w http.ResponseWriter, r *http.Request) {
defer func() {
r := recover()
if r == nil {
return
}
fmt.Printf("[error] in run-command: %v\n", r)
debug.PrintStack()
return
}()
w.Header().Set("Access-Control-Allow-Origin", r.Header.Get("Origin"))
w.Header().Set("Access-Control-Allow-Credentials", "true")
w.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS")
@@ -385,8 +395,7 @@ func ProcessFeCommandPacket(ctx context.Context, pk *scpacket.FeCommandPacketTyp
}
colonIdx := strings.Index(metaCmd, ":")
if colonIdx != -1 {
metaCmd = metaCmd[0:colonIdx]
metaSubCmd = metaCmd[colonIdx+1:]
metaCmd, metaSubCmd = metaCmd[0:colonIdx], metaCmd[colonIdx+1:]
}
if metaCmd == "" {
return nil, fmt.Errorf("invalid command, got bare '/', with no command")
@@ -440,6 +449,13 @@ func ProcessFeCommandPacket(ctx context.Context, pk *scpacket.FeCommandPacketTyp
}
func RunScreenCmd(ctx context.Context, sessionId string, screenId string, subCmd string, commandStr string) error {
if subCmd == "close" {
err := sstore.DeleteScreen(ctx, sessionId, screenId)
if err != nil {
return err
}
return nil
}
if subCmd != "" {
return fmt.Errorf("invalid /screen subcommand '%s'", subCmd)
}
@@ -458,11 +474,11 @@ func RunScreenCmd(ctx context.Context, sessionId string, screenId string, subCmd
return sstore.SwitchScreenById(ctx, sessionId, screens[screenNum-1].ScreenId)
}
for _, screen := range screens {
if screen.Name == commandStr {
if screen.ScreenId == commandStr || screen.Name == commandStr {
return sstore.SwitchScreenById(ctx, sessionId, screen.ScreenId)
}
}
return fmt.Errorf("could not switch to screen '%s' (name not found)", commandStr)
return fmt.Errorf("could not switch to screen '%s' (name/id not found)", commandStr)
}
// /api/start-session
+4
View File
@@ -143,6 +143,10 @@ func (ws *WSState) RunWSRead() {
fmt.Printf("[error] invalid watchscreen sessionid: %v\n", err)
continue
}
if wsPk.ScreenId == "" {
ws.UnWatchScreen()
continue
}
if _, err := uuid.Parse(wsPk.ScreenId); err != nil {
fmt.Printf("[error] invalid watchscreen screenid: %v\n", err)
continue
+70 -8
View File
@@ -167,6 +167,7 @@ func GetSessionById(ctx context.Context, id string) (*SessionType, error) {
tx.SelectWrap(&session.Screens, query, session.SessionId)
query = `SELECT * FROM remote_instance WHERE sessionid = ?`
tx.SelectWrap(&session.Remotes, query, session.SessionId)
session.Full = true
return nil
})
if err != nil {
@@ -270,6 +271,16 @@ func InsertScreen(ctx context.Context, sessionId string, screenName string, acti
}
return nil
})
newScreen, err := GetScreenById(ctx, sessionId, newScreenId)
if err != nil {
return "", err
}
update, session := MakeSingleSessionUpdate(sessionId)
if activate {
session.ActiveScreenId = newScreenId
}
session.Screens = append(session.Screens, newScreen)
MainBus.SendUpdate("", update)
return newScreenId, txErr
}
@@ -285,6 +296,7 @@ func GetScreenById(ctx context.Context, sessionId string, screenId string) (*Scr
rtnScreen = &screen
query = `SELECT * FROM screen_window WHERE sessionid = ? AND screenid = ?`
tx.SelectWrap(&screen.Windows, query, sessionId, screenId)
screen.Full = true
return nil
})
if txErr != nil {
@@ -385,6 +397,31 @@ func HangupRunningCmdsByRemoteId(ctx context.Context, remoteId string) error {
})
}
func getNextId(ids []string, delId string) string {
fmt.Printf("getnextid %v | %v\n", ids, delId)
if len(ids) == 0 {
return ""
}
if len(ids) == 1 {
if ids[0] == delId {
return ""
}
return ids[0]
}
for idx := 0; idx < len(ids); idx++ {
if ids[idx] == delId {
var rtnIdx int
if idx == len(ids)-1 {
rtnIdx = idx - 1
} else {
rtnIdx = idx + 1
}
return ids[rtnIdx]
}
}
return ids[0]
}
func SwitchScreenById(ctx context.Context, sessionId string, screenId string) error {
txErr := WithTx(ctx, func(tx *TxWrap) error {
query := `SELECT screenid FROM screen WHERE sessionid = ? AND screenid = ?`
@@ -395,14 +432,39 @@ func SwitchScreenById(ctx context.Context, sessionId string, screenId string) er
tx.ExecWrap(query, screenId, sessionId)
return nil
})
sessionUpdate := SessionType{
SessionId: sessionId,
ActiveScreenId: screenId,
NotifyNum: -1,
}
update := &SessionUpdate{
Sessions: []SessionType{sessionUpdate},
}
update, session := MakeSingleSessionUpdate(sessionId)
session.ActiveScreenId = screenId
MainBus.SendUpdate("", update)
return txErr
}
func CleanWindows() {
}
func DeleteScreen(ctx context.Context, sessionId string, screenId string) error {
var newActiveScreenId string
txErr := WithTx(ctx, func(tx *TxWrap) error {
isActive := tx.Exists(`SELECT sessionid FROM session WHERE sessionid = ? AND activescreenid = ?`, sessionId, screenId)
fmt.Printf("delete-screen %s %s | %v\n", sessionId, screenId, isActive)
if isActive {
screenIds := tx.SelectStrings(`SELECT screenid FROM screen WHERE sessionid = ? ORDER BY screenidx`, sessionId)
nextId := getNextId(screenIds, screenId)
tx.ExecWrap(`UPDATE session SET activescreenid = ? WHERE sessionid = ?`, nextId, sessionId)
newActiveScreenId = nextId
}
query := `DELETE FROM screen_window WHERE sessionid = ? AND screenid = ?`
tx.ExecWrap(query, sessionId, screenId)
query = `DELETE FROM screen WHERE sessionid = ? AND screenid = ?`
tx.ExecWrap(query, sessionId, screenId)
return nil
})
if txErr != nil {
return txErr
}
go CleanWindows()
update, session := MakeSingleSessionUpdate(sessionId)
session.ActiveScreenId = newActiveScreenId
session.Screens = append(session.Screens, &ScreenType{SessionId: sessionId, ScreenId: screenId, Remove: true})
MainBus.SendUpdate("", update)
return nil
}
+12 -1
View File
@@ -23,7 +23,18 @@ type WindowUpdate struct {
}
type SessionUpdate struct {
Sessions []SessionType `json:"sessions"`
Sessions []*SessionType `json:"sessions"`
}
func MakeSingleSessionUpdate(sessionId string) (*SessionUpdate, *SessionType) {
session := &SessionType{
SessionId: sessionId,
NotifyNum: -1,
}
update := &SessionUpdate{
Sessions: []*SessionType{session},
}
return update, session
}
type CmdUpdate struct {