From 5fcbe209bb193b09f70e616b181da6520cc9f5a6 Mon Sep 17 00:00:00 2001 From: sawka Date: Thu, 7 Jul 2022 22:13:45 -0700 Subject: [PATCH] implement globalstore callback for cmd status changes --- pkg/remote/remote.go | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/pkg/remote/remote.go b/pkg/remote/remote.go index 5941233a..d6cfda2b 100644 --- a/pkg/remote/remote.go +++ b/pkg/remote/remote.go @@ -32,8 +32,9 @@ const ( var GlobalStore *Store type Store struct { - Lock *sync.Mutex - Map map[string]*MShellProc // key=remoteid + Lock *sync.Mutex + Map map[string]*MShellProc // key=remoteid + CmdStatusCallback func(ck base.CommandKey, status string) } type RemoteState struct { @@ -53,6 +54,8 @@ type MShellProc struct { Status string ServerProc *shexec.ClientProc Err error + + RunningCmds []base.CommandKey } func LoadRemotes(ctx context.Context) error { @@ -227,9 +230,16 @@ func RunCommand(ctx context.Context, pk *scpacket.FeCommandPacketType, cmdId str if err != nil { return nil, err } + msh.AddRunningCmd(startPk.CK) return cmd, nil } +func (msh *MShellProc) AddRunningCmd(ck base.CommandKey) { + msh.Lock.Lock() + defer msh.Lock.Unlock() + msh.RunningCmds = append(msh.RunningCmds, ck) +} + func (msh *MShellProc) PacketRpc(ctx context.Context, pk packet.RpcPacketType) (*packet.ResponsePacketType, error) { if !msh.IsConnected() { return nil, fmt.Errorf("runner is not connected") @@ -277,6 +287,9 @@ func (msh *MShellProc) handleCmdDonePacket(donePk *packet.CmdDonePacketType) { fmt.Printf("[error] updating cmddone: %v\n", err) return } + if GlobalStore.CmdStatusCallback != nil { + GlobalStore.CmdStatusCallback(donePk.CK, sstore.CmdStatusDone) + } return } @@ -289,6 +302,15 @@ func (msh *MShellProc) handleCmdErrorPacket(errPk *packet.CmdErrorPacketType) { return } +func (msh *MShellProc) notifyHangups_nolock() { + if GlobalStore.CmdStatusCallback != nil { + for _, ck := range msh.RunningCmds { + GlobalStore.CmdStatusCallback(ck, sstore.CmdStatusHangup) + } + } + msh.RunningCmds = nil +} + func (runner *MShellProc) ProcessPackets() { defer runner.WithLock(func() { if runner.Status == StatusConnected { @@ -298,6 +320,7 @@ func (runner *MShellProc) ProcessPackets() { if err != nil { fmt.Printf("[error] calling HUP on remoteid=%d cmds\n", runner.Remote.RemoteId) } + runner.notifyHangups_nolock() }) for pk := range runner.ServerProc.Output.MainCh { if pk.GetType() == packet.DataPacketStr {