mirror of
https://github.com/wavetermdev/backup.git
synced 2026-08-05 13:57:07 -07:00
data getting written to ptyout files in scripthaus dir
This commit is contained in:
+17
-1
@@ -20,6 +20,7 @@ import (
|
||||
"github.com/scripthaus-dev/mshell/pkg/cmdtail"
|
||||
"github.com/scripthaus-dev/mshell/pkg/packet"
|
||||
"github.com/scripthaus-dev/sh2-server/pkg/remote"
|
||||
"github.com/scripthaus-dev/sh2-server/pkg/scbase"
|
||||
"github.com/scripthaus-dev/sh2-server/pkg/scpacket"
|
||||
"github.com/scripthaus-dev/sh2-server/pkg/sstore"
|
||||
"github.com/scripthaus-dev/sh2-server/pkg/wsshell"
|
||||
@@ -333,7 +334,22 @@ func HandleGetPtyOut(w http.ResponseWriter, r *http.Request) {
|
||||
w.Write([]byte(fmt.Sprintf("must specify sessionid and cmdid")))
|
||||
return
|
||||
}
|
||||
pathStr := GetPtyOutFile(sessionId, cmdId)
|
||||
if _, err := uuid.Parse(sessionId); err != nil {
|
||||
w.WriteHeader(500)
|
||||
w.Write([]byte(fmt.Sprintf("invalid sessionid: %v", err)))
|
||||
return
|
||||
}
|
||||
if _, err := uuid.Parse(cmdId); err != nil {
|
||||
w.WriteHeader(500)
|
||||
w.Write([]byte(fmt.Sprintf("invalid cmdid: %v", err)))
|
||||
return
|
||||
}
|
||||
pathStr, err := scbase.PtyOutFile(sessionId, cmdId)
|
||||
if err != nil {
|
||||
w.WriteHeader(500)
|
||||
w.Write([]byte(fmt.Sprintf("cannot get ptyout file name: %v", err)))
|
||||
return
|
||||
}
|
||||
fd, err := os.Open(pathStr)
|
||||
if err != nil {
|
||||
if errors.Is(err, fs.ErrNotExist) {
|
||||
|
||||
+39
-6
@@ -2,6 +2,7 @@ package remote
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
"fmt"
|
||||
"os/exec"
|
||||
@@ -132,7 +133,6 @@ func (msh *MShellProc) Launch() {
|
||||
return
|
||||
}
|
||||
msh.ServerProc = cproc
|
||||
fmt.Printf("START MAKECLIENTPROC: %#v\n", msh.ServerProc.InitPk)
|
||||
msh.Status = StatusConnected
|
||||
go func() {
|
||||
exitErr := cproc.Cmd.Wait()
|
||||
@@ -170,7 +170,7 @@ func RunCommand(ctx context.Context, pk *scpacket.FeCommandPacketType, cmdId str
|
||||
runPacket.UsePty = true
|
||||
runPacket.TermOpts = &packet.TermOpts{Rows: DefaultTermRows, Cols: DefaultTermCols, Term: DefaultTerm}
|
||||
runPacket.Command = strings.TrimSpace(pk.CmdStr)
|
||||
fmt.Printf("RUN-CMD> %s\n", runPacket.CK)
|
||||
fmt.Printf("RUN-CMD> %s reqid=%s (msh=%v)\n", runPacket.CK, runPacket.ReqId, msh.Remote)
|
||||
msh.ServerProc.Output.RegisterRpc(runPacket.ReqId)
|
||||
err := shexec.SendRunPacketAndRunData(ctx, msh.ServerProc.Input, runPacket)
|
||||
if err != nil {
|
||||
@@ -218,6 +218,17 @@ func (runner *MShellProc) WithLock(fn func()) {
|
||||
fn()
|
||||
}
|
||||
|
||||
func makeDataAckPacket(ck base.CommandKey, fdNum int, ackLen int, err error) *packet.DataAckPacketType {
|
||||
ack := packet.MakeDataAckPacket()
|
||||
ack.CK = ck
|
||||
ack.FdNum = fdNum
|
||||
ack.AckLen = ackLen
|
||||
if err != nil {
|
||||
ack.Error = err.Error()
|
||||
}
|
||||
return ack
|
||||
}
|
||||
|
||||
func (runner *MShellProc) ProcessPackets() {
|
||||
defer runner.WithLock(func() {
|
||||
if runner.Status == StatusConnected {
|
||||
@@ -225,10 +236,27 @@ func (runner *MShellProc) ProcessPackets() {
|
||||
}
|
||||
})
|
||||
for pk := range runner.ServerProc.Output.MainCh {
|
||||
fmt.Printf("MSH> %s | %#v\n", packet.AsString(pk), pk)
|
||||
if pk.GetType() == packet.DataPacketStr {
|
||||
dataPacket := pk.(*packet.DataPacketType)
|
||||
fmt.Printf("data %s fd=%d len=%d eof=%v err=%v\n", dataPacket.CK, dataPacket.FdNum, packet.B64DecodedLen(dataPacket.Data64), dataPacket.Eof, dataPacket.Error)
|
||||
dataPk := pk.(*packet.DataPacketType)
|
||||
realData, err := base64.StdEncoding.DecodeString(dataPk.Data64)
|
||||
if err != nil {
|
||||
ack := makeDataAckPacket(dataPk.CK, dataPk.FdNum, 0, err)
|
||||
runner.ServerProc.Input.SendPacket(ack)
|
||||
continue
|
||||
}
|
||||
var ack *packet.DataAckPacketType
|
||||
if len(realData) > 0 {
|
||||
err = sstore.AppendToCmdPtyBlob(context.Background(), dataPk.CK.GetSessionId(), dataPk.CK.GetCmdId(), realData)
|
||||
if err != nil {
|
||||
ack = makeDataAckPacket(dataPk.CK, dataPk.FdNum, 0, err)
|
||||
} else {
|
||||
ack = makeDataAckPacket(dataPk.CK, dataPk.FdNum, len(realData), nil)
|
||||
}
|
||||
}
|
||||
if ack != nil {
|
||||
runner.ServerProc.Input.SendPacket(ack)
|
||||
}
|
||||
fmt.Printf("data %s fd=%d len=%d eof=%v err=%v\n", dataPk.CK, dataPk.FdNum, len(realData), dataPk.Eof, dataPk.Error)
|
||||
continue
|
||||
}
|
||||
if pk.GetType() == packet.CmdDataPacketStr {
|
||||
@@ -251,6 +279,11 @@ func (runner *MShellProc) ProcessPackets() {
|
||||
fmt.Printf("stderr> %s\n", rawPacket.Data)
|
||||
continue
|
||||
}
|
||||
fmt.Printf("runner-packet: %v\n", pk)
|
||||
if pk.GetType() == packet.CmdStartPacketStr {
|
||||
startPk := pk.(*packet.CmdStartPacketType)
|
||||
fmt.Printf("start> reqid=%s (%p)\n", startPk.RespId, runner.ServerProc.Output)
|
||||
continue
|
||||
}
|
||||
fmt.Printf("MSH> %s\n", packet.AsString(pk))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user