From 368c16eb60c9b5e019d9ff5e70f80b64d4774254 Mon Sep 17 00:00:00 2001 From: sawka Date: Thu, 7 Jul 2022 22:46:28 -0700 Subject: [PATCH] get input working --- cmd/main-server.go | 22 ++++++++++++---------- pkg/remote/remote.go | 25 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/cmd/main-server.go b/cmd/main-server.go index 21cdc332..924243fe 100644 --- a/cmd/main-server.go +++ b/cmd/main-server.go @@ -16,7 +16,6 @@ import ( "github.com/google/uuid" "github.com/gorilla/mux" - "github.com/scripthaus-dev/mshell/pkg/base" "github.com/scripthaus-dev/mshell/pkg/cmdtail" "github.com/scripthaus-dev/mshell/pkg/packet" "github.com/scripthaus-dev/sh2-server/pkg/remote" @@ -254,18 +253,21 @@ func sendCmdInput(pk *packet.InputPacketType) error { if err != nil { return err } - if len(pk.InputData) > MaxInputDataSize { - return fmt.Errorf("input data size too large, len=%d (max=%d)", len(pk.InputData), MaxInputDataSize) + if pk.RemoteId == "" { + return fmt.Errorf("input must set remoteid") } - fileNames, err := base.GetCommandFileNames(pk.CK) - if err != nil { - return err + if len(pk.InputData64) == 0 && pk.SigNum == 0 { + return fmt.Errorf("empty input packet") } - err = writeToFifo(fileNames.StdinFifo, []byte(pk.InputData)) - if err != nil { - return err + inputLen := packet.B64DecodedLen(pk.InputData64) + if inputLen > MaxInputDataSize { + return fmt.Errorf("input data size too large, len=%d (max=%d)", inputLen, MaxInputDataSize) } - return nil + msh := remote.GetRemoteById(pk.RemoteId) + if msh == nil { + return fmt.Errorf("cannot connect to remote") + } + return msh.SendInput(pk) } // params: name diff --git a/pkg/remote/remote.go b/pkg/remote/remote.go index d6cfda2b..a25d15ed 100644 --- a/pkg/remote/remote.go +++ b/pkg/remote/remote.go @@ -168,6 +168,31 @@ func (msh *MShellProc) IsConnected() bool { return msh.Status == StatusConnected } +func (msh *MShellProc) IsCmdRunning(ck base.CommandKey) bool { + msh.Lock.Lock() + defer msh.Lock.Unlock() + for _, runningCk := range msh.RunningCmds { + if runningCk == ck { + return true + } + } + return false +} + +func (msh *MShellProc) SendInput(pk *packet.InputPacketType) error { + if !msh.IsConnected() { + return fmt.Errorf("remote is not connected, cannot send input") + } + if !msh.IsCmdRunning(pk.CK) { + return fmt.Errorf("cannot send input, cmd is not running") + } + dataPk := packet.MakeDataPacket() + dataPk.CK = pk.CK + dataPk.FdNum = 0 // stdin + dataPk.Data64 = pk.InputData64 + return msh.ServerProc.Input.SendPacket(dataPk) +} + func convertRemoteState(rs scpacket.RemoteState) sstore.RemoteState { return sstore.RemoteState{Cwd: rs.Cwd} }