mirror of
https://github.com/wavetermdev/backup.git
synced 2026-08-05 13:57:07 -07:00
simplify screen focus types (remove cmd-fg). send all screen focus updates. fix display issue with rtnstate (prompt vars)
This commit is contained in:
@@ -671,8 +671,8 @@ func ScreenSetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (ss
|
||||
}
|
||||
if pk.Kwargs["focus"] != "" {
|
||||
focusVal := pk.Kwargs["focus"]
|
||||
if focusVal != sstore.ScreenFocusInput && focusVal != sstore.ScreenFocusCmd && focusVal != sstore.ScreenFocusCmdFg {
|
||||
return nil, fmt.Errorf("/screen:set invalid focus argument %q, must be %s", focusVal, formatStrs([]string{sstore.ScreenFocusInput, sstore.ScreenFocusCmd, sstore.ScreenFocusCmdFg}, "or", false))
|
||||
if focusVal != sstore.ScreenFocusInput && focusVal != sstore.ScreenFocusCmd {
|
||||
return nil, fmt.Errorf("/screen:set invalid focus argument %q, must be %s", focusVal, formatStrs([]string{sstore.ScreenFocusInput, sstore.ScreenFocusCmd}, "or", false))
|
||||
}
|
||||
varsUpdated = append(varsUpdated, "focus")
|
||||
updateMap[sstore.ScreenField_Focus] = focusVal
|
||||
@@ -1367,7 +1367,7 @@ func addLineForCmd(ctx context.Context, metaCmd string, shouldFocus bool, ids re
|
||||
updateMap := make(map[string]interface{})
|
||||
updateMap[sstore.ScreenField_SelectedLine] = rtnLine.LineNum
|
||||
if shouldFocus {
|
||||
updateMap[sstore.ScreenField_Focus] = sstore.ScreenFocusCmdFg
|
||||
updateMap[sstore.ScreenField_Focus] = sstore.ScreenFocusCmd
|
||||
}
|
||||
screen, err = sstore.UpdateScreen(ctx, ids.ScreenId, updateMap)
|
||||
if err != nil {
|
||||
|
||||
+23
-7
@@ -1106,7 +1106,6 @@ func (msh *MShellProc) ReInit(ctx context.Context) (*packet.InitPacketType, erro
|
||||
msh.StateMap[hval] = initPk.State
|
||||
})
|
||||
msh.updateRemoteStateVars(ctx, msh.RemoteId, initPk)
|
||||
|
||||
return initPk, nil
|
||||
}
|
||||
|
||||
@@ -1144,6 +1143,7 @@ func stripScVarsFromStateDiff(stateDiff *packet.ShellStateDiff) *packet.ShellSta
|
||||
var mapDiff statediff.MapDiffType
|
||||
err := mapDiff.Decode(stateDiff.VarsDiff)
|
||||
if err != nil {
|
||||
log.Printf("error decoding statediff in stripScVarsFromStateDiff: %v\n", err)
|
||||
return stateDiff
|
||||
}
|
||||
delete(mapDiff.ToAdd, "PROMPT")
|
||||
@@ -1645,9 +1645,9 @@ func (msh *MShellProc) handleCmdDonePacket(donePk *packet.CmdDonePacketType) {
|
||||
msh.WriteToPtyBuffer("*error updating cmddone: %v\n", err)
|
||||
return
|
||||
}
|
||||
screen, err := sstore.UpdateScreenWithCmdFg(context.Background(), donePk.CK.GetGroupId(), donePk.CK.GetCmdId())
|
||||
screen, err := sstore.UpdateScreenFocusForDoneCmd(context.Background(), donePk.CK.GetGroupId(), donePk.CK.GetCmdId())
|
||||
if err != nil {
|
||||
msh.WriteToPtyBuffer("*error trying to update cmd-fg screens: %v\n", err)
|
||||
msh.WriteToPtyBuffer("*error trying to update screen focus type: %v\n", err)
|
||||
// fall-through (nothing to do)
|
||||
}
|
||||
if screen != nil {
|
||||
@@ -1692,7 +1692,7 @@ func (msh *MShellProc) handleCmdDonePacket(donePk *packet.CmdDonePacketType) {
|
||||
// fall-through (nothing to do)
|
||||
}
|
||||
}
|
||||
sstore.MainBus.SendScreenUpdate(donePk.CK.GetGroupId(), update)
|
||||
sstore.MainBus.SendUpdate(update)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -1707,7 +1707,11 @@ func (msh *MShellProc) handleCmdFinalPacket(finalPk *packet.CmdFinalPacketType)
|
||||
return
|
||||
}
|
||||
log.Printf("finalpk %s (hangup): %s\n", finalPk.CK, finalPk.Error)
|
||||
sstore.HangupCmd(context.Background(), finalPk.CK)
|
||||
screen, err := sstore.HangupCmd(context.Background(), finalPk.CK)
|
||||
if err != nil {
|
||||
log.Printf("error in hangup-cmd in handleCmdFinalPacket: %v\n", err)
|
||||
return
|
||||
}
|
||||
rtnCmd, err = sstore.GetCmdByScreenId(context.Background(), finalPk.CK.GetGroupId(), finalPk.CK.GetCmdId())
|
||||
if err != nil {
|
||||
log.Printf("error getting cmd(2) in handleCmdFinalPacket: %v\n", err)
|
||||
@@ -1718,7 +1722,10 @@ func (msh *MShellProc) handleCmdFinalPacket(finalPk *packet.CmdFinalPacketType)
|
||||
return
|
||||
}
|
||||
update := &sstore.ModelUpdate{Cmd: rtnCmd}
|
||||
sstore.MainBus.SendScreenUpdate(finalPk.CK.GetGroupId(), update)
|
||||
if screen != nil {
|
||||
update.Screens = []*sstore.ScreenType{screen}
|
||||
}
|
||||
sstore.MainBus.SendUpdate(update)
|
||||
}
|
||||
|
||||
// TODO notify FE about cmd errors
|
||||
@@ -1777,17 +1784,26 @@ func (msh *MShellProc) makeHandleCmdFinalPacketClosure(finalPk *packet.CmdFinalP
|
||||
}
|
||||
}
|
||||
|
||||
func sendScreenUpdates(screens []*sstore.ScreenType) {
|
||||
for _, screen := range screens {
|
||||
sstore.MainBus.SendUpdate(&sstore.ModelUpdate{Screens: []*sstore.ScreenType{screen}})
|
||||
}
|
||||
}
|
||||
|
||||
func (msh *MShellProc) ProcessPackets() {
|
||||
defer msh.WithLock(func() {
|
||||
if msh.Status == StatusConnected {
|
||||
msh.Status = StatusDisconnected
|
||||
}
|
||||
err := sstore.HangupRunningCmdsByRemoteId(context.Background(), msh.Remote.RemoteId)
|
||||
screens, err := sstore.HangupRunningCmdsByRemoteId(context.Background(), msh.Remote.RemoteId)
|
||||
if err != nil {
|
||||
msh.writeToPtyBuffer_nolock("error calling HUP on cmds %v\n", err)
|
||||
}
|
||||
msh.notifyHangups_nolock()
|
||||
go msh.NotifyRemoteUpdate()
|
||||
if len(screens) > 0 {
|
||||
go sendScreenUpdates(screens)
|
||||
}
|
||||
})
|
||||
dataPosMap := make(map[base.CommandKey]int64)
|
||||
for pk := range msh.ServerProc.Output.MainCh {
|
||||
|
||||
@@ -102,6 +102,8 @@ func ParseFuncs(funcs string) (map[string]string, error) {
|
||||
const MaxDiffKeyLen = 40
|
||||
const MaxDiffValLen = 50
|
||||
|
||||
var IgnoreVars = map[string]bool{"PROMPT": true, "PROMPT_VERSION": true, "MSHELL": true}
|
||||
|
||||
func displayStateUpdateDiff(buf *bytes.Buffer, oldState packet.ShellState, newState packet.ShellState) {
|
||||
if newState.Cwd != oldState.Cwd {
|
||||
buf.WriteString(fmt.Sprintf("cwd %s\n", newState.Cwd))
|
||||
@@ -110,6 +112,9 @@ func displayStateUpdateDiff(buf *bytes.Buffer, oldState packet.ShellState, newSt
|
||||
newEnvMap := shexec.DeclMapFromState(&newState)
|
||||
oldEnvMap := shexec.DeclMapFromState(&oldState)
|
||||
for key, newVal := range newEnvMap {
|
||||
if IgnoreVars[key] {
|
||||
continue
|
||||
}
|
||||
oldVal, found := oldEnvMap[key]
|
||||
if !found || !shexec.DeclsEqual(false, oldVal, newVal) {
|
||||
var exportStr string
|
||||
@@ -120,6 +125,9 @@ func displayStateUpdateDiff(buf *bytes.Buffer, oldState packet.ShellState, newSt
|
||||
}
|
||||
}
|
||||
for key, _ := range oldEnvMap {
|
||||
if IgnoreVars[key] {
|
||||
continue
|
||||
}
|
||||
_, found := newEnvMap[key]
|
||||
if !found {
|
||||
buf.WriteString(fmt.Sprintf("unset %s\n", utilfn.EllipsisStr(key, MaxDiffKeyLen)))
|
||||
|
||||
+33
-12
@@ -940,32 +940,52 @@ func HangupAllRunningCmds(ctx context.Context) error {
|
||||
query = `UPDATE cmd SET status = ? WHERE status = ?`
|
||||
tx.Exec(query, CmdStatusHangup, CmdStatusRunning)
|
||||
for _, cmdPtr := range cmdPtrs {
|
||||
insertScreenCmdUpdate(tx, cmdPtr.ScreenId, cmdPtr.CmdId, UpdateType_CmdStatus)
|
||||
if isWebShare(tx, cmdPtr.ScreenId) {
|
||||
insertScreenCmdUpdate(tx, cmdPtr.ScreenId, cmdPtr.CmdId, UpdateType_CmdStatus)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
func HangupRunningCmdsByRemoteId(ctx context.Context, remoteId string) error {
|
||||
return WithTx(ctx, func(tx *TxWrap) error {
|
||||
// TODO send update
|
||||
func HangupRunningCmdsByRemoteId(ctx context.Context, remoteId string) ([]*ScreenType, error) {
|
||||
return WithTxRtn(ctx, func(tx *TxWrap) ([]*ScreenType, error) {
|
||||
var cmdPtrs []CmdPtr
|
||||
query := `SELECT screenid, cmdid FROM cmd WHERE status = ? AND remoteid = ?`
|
||||
tx.Select(&cmdPtrs, query, CmdStatusRunning, remoteId)
|
||||
query = `UPDATE cmd SET status = ? WHERE status = ? AND remoteid = ?`
|
||||
tx.Exec(query, CmdStatusHangup, CmdStatusRunning, remoteId)
|
||||
var rtn []*ScreenType
|
||||
for _, cmdPtr := range cmdPtrs {
|
||||
insertScreenCmdUpdate(tx, cmdPtr.ScreenId, cmdPtr.CmdId, UpdateType_CmdStatus)
|
||||
if isWebShare(tx, cmdPtr.ScreenId) {
|
||||
insertScreenCmdUpdate(tx, cmdPtr.ScreenId, cmdPtr.CmdId, UpdateType_CmdStatus)
|
||||
}
|
||||
screen, err := UpdateScreenFocusForDoneCmd(tx.Context(), cmdPtr.ScreenId, cmdPtr.CmdId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if screen != nil {
|
||||
rtn = append(rtn, screen)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
return rtn, nil
|
||||
})
|
||||
}
|
||||
|
||||
func HangupCmd(ctx context.Context, ck base.CommandKey) error {
|
||||
return WithTx(ctx, func(tx *TxWrap) error {
|
||||
// TODO send update
|
||||
func HangupCmd(ctx context.Context, ck base.CommandKey) (*ScreenType, error) {
|
||||
return WithTxRtn(ctx, func(tx *TxWrap) (*ScreenType, error) {
|
||||
query := `UPDATE cmd SET status = ? WHERE screenid = ? AND cmdid = ?`
|
||||
tx.Exec(query, CmdStatusHangup, ck.GetGroupId(), ck.GetCmdId())
|
||||
insertScreenCmdUpdate(tx, ck.GetGroupId(), ck.GetCmdId(), UpdateType_CmdStatus)
|
||||
return nil
|
||||
if isWebShare(tx, ck.GetGroupId()) {
|
||||
insertScreenCmdUpdate(tx, ck.GetGroupId(), ck.GetCmdId(), UpdateType_CmdStatus)
|
||||
}
|
||||
screen, err := UpdateScreenFocusForDoneCmd(tx.Context(), ck.GetGroupId(), ck.GetCmdId())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return screen, nil
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1777,14 +1797,14 @@ func GetLineResolveItems(ctx context.Context, screenId string) ([]ResolveItem, e
|
||||
return rtn, nil
|
||||
}
|
||||
|
||||
func UpdateScreenWithCmdFg(ctx context.Context, screenId string, cmdId string) (*ScreenType, error) {
|
||||
func UpdateScreenFocusForDoneCmd(ctx context.Context, screenId string, cmdId string) (*ScreenType, error) {
|
||||
return WithTxRtn(ctx, func(tx *TxWrap) (*ScreenType, error) {
|
||||
query := `SELECT screenid
|
||||
FROM screen s
|
||||
WHERE s.screenid = ? AND s.focustype = 'cmd-fg'
|
||||
WHERE s.screenid = ? AND s.focustype = ?
|
||||
AND s.selectedline IN (SELECT linenum FROM line l WHERE l.screenid = s.screenid AND l.cmdid = ?)
|
||||
`
|
||||
if !tx.Exists(query, screenId, cmdId) {
|
||||
if !tx.Exists(query, screenId, ScreenFocusCmd, cmdId) {
|
||||
return nil, nil
|
||||
}
|
||||
editMap := make(map[string]interface{})
|
||||
@@ -1803,6 +1823,7 @@ func StoreStateBase(ctx context.Context, state *packet.ShellState) error {
|
||||
Ts: time.Now().UnixMilli(),
|
||||
}
|
||||
stateBase.BaseHash, stateBase.Data = state.EncodeAndHash()
|
||||
// envMap := shexec.DeclMapFromState(state)
|
||||
txErr := WithTx(ctx, func(tx *TxWrap) error {
|
||||
query := `SELECT basehash FROM state_base WHERE basehash = ?`
|
||||
if tx.Exists(query, stateBase.BaseHash) {
|
||||
|
||||
@@ -173,6 +173,6 @@ func DeleteScreenDir(ctx context.Context, screenId string) error {
|
||||
if err != nil {
|
||||
return fmt.Errorf("error getting screendir: %w", err)
|
||||
}
|
||||
fmt.Printf("remove-all %s\n", screenDir)
|
||||
log.Printf("remove-all %s\n", screenDir)
|
||||
return os.RemoveAll(screenDir)
|
||||
}
|
||||
|
||||
@@ -82,7 +82,6 @@ const (
|
||||
const (
|
||||
ScreenFocusInput = "input"
|
||||
ScreenFocusCmd = "cmd"
|
||||
ScreenFocusCmdFg = "cmd-fg"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
Reference in New Issue
Block a user