From 3b7dd7c01e944a0e239ec1ae94fc14ca0fba70d3 Mon Sep 17 00:00:00 2001 From: sawka Date: Sat, 22 Oct 2022 14:46:39 -0700 Subject: [PATCH] working on source command --- pkg/cmdrunner/cmdrunner.go | 79 ++++++++++++++++++++++++++++++-------- pkg/cmdrunner/shparse.go | 2 + pkg/remote/remote.go | 3 ++ 3 files changed, 68 insertions(+), 16 deletions(-) diff --git a/pkg/cmdrunner/cmdrunner.go b/pkg/cmdrunner/cmdrunner.go index c865707b..ecb6a747 100644 --- a/pkg/cmdrunner/cmdrunner.go +++ b/pkg/cmdrunner/cmdrunner.go @@ -39,6 +39,10 @@ var ColorNames = []string{"black", "red", "green", "yellow", "blue", "magenta", var RemoteColorNames = []string{"red", "green", "yellow", "blue", "magenta", "cyan", "white", "orange"} var RemoteSetArgs = []string{"alias", "connectmode", "key", "password", "autoinstall", "color"} +var WindowCmds = []string{"run", "comment", "cd", "cr", "setenv", "unset", "clear", "sw", "alias", "unalias", "function", "source"} +var NoHistCmds = []string{"compgen", "line", "history"} +var GlobalCmds = []string{"session", "screen", "remote"} + var hostNameRe = regexp.MustCompile("^[a-z][a-z0-9.-]*$") var userHostRe = regexp.MustCompile("^(sudo@)?([a-z][a-z0-9-]*)@([a-z][a-z0-9.-]*)(?::([0-9]+))?$") var remoteAliasRe = regexp.MustCompile("^[a-zA-Z][a-zA-Z0-9_-]*$") @@ -100,13 +104,17 @@ func init() { registerCmdFn("remote:installcancel", RemoteInstallCancelCommand) registerCmdFn("sw:set", SwSetCommand) + registerCmdFn("sw:resize", SwResizeCommand) - registerCmdFn("window:resize", WindowResizeCommand) + // sw:resize + registerCmdFn("window:resize", SwResizeCommand) registerCmdFn("line", LineCommand) registerCmdFn("line:show", LineShowCommand) registerCmdFn("history", HistoryCommand) + + registerCmdFn("source", SourceCommand) } func getValidCommands() []string { @@ -216,6 +224,54 @@ func resolveNonNegInt(arg string, def int) (int, error) { return ival, nil } +func getUITermOpts(uiContext *scpacket.UIContextType) *packet.TermOpts { + termOpts := &packet.TermOpts{Rows: shexec.DefaultTermRows, Cols: shexec.DefaultTermCols, Term: remote.DefaultTerm, MaxPtySize: shexec.DefaultMaxPtySize} + if uiContext != nil && uiContext.TermOpts != nil { + pkOpts := uiContext.TermOpts + if pkOpts.Cols > 0 { + termOpts.Cols = base.BoundInt(pkOpts.Cols, shexec.MinTermCols, shexec.MaxTermCols) + } + if pkOpts.MaxPtySize > 0 { + termOpts.MaxPtySize = base.BoundInt64(pkOpts.MaxPtySize, shexec.MinMaxPtySize, shexec.MaxMaxPtySize) + } + } + return termOpts +} + +func SourceCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) { + ids, err := resolveUiIds(ctx, pk, R_Session|R_Screen|R_Window|R_RemoteConnected) + if err != nil { + return nil, fmt.Errorf("/source error: %w", err) + } + if len(pk.Args) != 1 { + return nil, fmt.Errorf("/source takes one argument (the file to source)") + } + cmdId := scbase.GenSCUUID() + runPacket := packet.MakeRunPacket() + runPacket.ReqId = uuid.New().String() + runPacket.CK = base.MakeCommandKey(ids.SessionId, cmdId) + runPacket.State = ids.Remote.RemoteState + runPacket.StateComplete = true + runPacket.UsePty = true + runPacket.TermOpts = getUITermOpts(pk.UIContext) + runPacket.Command = strings.TrimSpace(fmt.Sprintf("source %s", shellescape.Quote(pk.Args[0]))) + runPacket.ReturnState = true + cmd, callback, err := remote.RunCommand(ctx, cmdId, ids.Remote.RemotePtr, ids.Remote.RemoteState, runPacket) + if callback != nil { + defer callback() + } + if err != nil { + return nil, err + } + update, err := addLineForCmd(ctx, "/source", true, ids, cmd) + if err != nil { + return nil, err + } + update.Interactive = pk.Interactive + sstore.MainBus.SendUpdate(ids.SessionId, update) + return nil, nil +} + func RunCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) { ids, err := resolveUiIds(ctx, pk, R_Session|R_Screen|R_Window|R_RemoteConnected) if err != nil { @@ -229,16 +285,7 @@ func RunCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.U runPacket.State = ids.Remote.RemoteState runPacket.StateComplete = true runPacket.UsePty = true - runPacket.TermOpts = &packet.TermOpts{Rows: shexec.DefaultTermRows, Cols: shexec.DefaultTermCols, Term: remote.DefaultTerm, MaxPtySize: shexec.DefaultMaxPtySize} - if pk.UIContext != nil && pk.UIContext.TermOpts != nil { - pkOpts := pk.UIContext.TermOpts - if pkOpts.Cols > 0 { - runPacket.TermOpts.Cols = base.BoundInt(pkOpts.Cols, shexec.MinTermCols, shexec.MaxTermCols) - } - if pkOpts.MaxPtySize > 0 { - runPacket.TermOpts.MaxPtySize = base.BoundInt64(pkOpts.MaxPtySize, shexec.MinMaxPtySize, shexec.MaxMaxPtySize) - } - } + runPacket.TermOpts = getUITermOpts(pk.UIContext) runPacket.Command = strings.TrimSpace(cmdStr) cmd, callback, err := remote.RunCommand(ctx, cmdId, ids.Remote.RemotePtr, ids.Remote.RemoteState, runPacket) if callback != nil { @@ -1610,26 +1657,26 @@ func resizeRunningCommand(ctx context.Context, cmd *sstore.CmdType, newCols int) return nil } -func WindowResizeCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) { +func SwResizeCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) { ids, err := resolveUiIds(ctx, pk, R_Session|R_Screen|R_Window) if err != nil { return nil, err } colsStr := pk.Kwargs["cols"] if colsStr == "" { - return nil, fmt.Errorf("/window:resize requires a numeric 'cols' argument") + return nil, fmt.Errorf("/sw:resize requires a numeric 'cols' argument") } cols, err := strconv.Atoi(colsStr) if err != nil { - return nil, fmt.Errorf("/window:resize requires a numeric 'cols' argument: %v", err) + return nil, fmt.Errorf("/sw:resize requires a numeric 'cols' argument: %v", err) } if cols <= 0 { - return nil, fmt.Errorf("/window:resize invalid zero/negative 'cols' argument") + return nil, fmt.Errorf("/sw:resize invalid zero/negative 'cols' argument") } cols = base.BoundInt(cols, shexec.MinTermCols, shexec.MaxTermCols) runningCmds, err := sstore.GetRunningWindowCmds(ctx, ids.SessionId, ids.WindowId) if err != nil { - return nil, fmt.Errorf("/window:resize cannot get running commands: %v", err) + return nil, fmt.Errorf("/sw:resize cannot get running commands: %v", err) } if len(runningCmds) == 0 { return nil, nil diff --git a/pkg/cmdrunner/shparse.go b/pkg/cmdrunner/shparse.go index 156c53f5..e0fab17c 100644 --- a/pkg/cmdrunner/shparse.go +++ b/pkg/cmdrunner/shparse.go @@ -97,6 +97,8 @@ var BareMetaCmds = []BareMetaCmdDecl{ BareMetaCmdDecl{"export", "setenv"}, BareMetaCmdDecl{"unset", "unset"}, BareMetaCmdDecl{"clear", "clear"}, + BareMetaCmdDecl{".", "source"}, + BareMetaCmdDecl{"source", "source"}, } func SubMetaCmd(cmd string) string { diff --git a/pkg/remote/remote.go b/pkg/remote/remote.go index 6d077fcc..e0b36355 100644 --- a/pkg/remote/remote.go +++ b/pkg/remote/remote.go @@ -1196,6 +1196,9 @@ func (msh *MShellProc) handleCmdDonePacket(donePk *packet.CmdDonePacketType) { update.ScreenWindows = sws if update != nil { sstore.MainBus.SendUpdate(donePk.CK.GetSessionId(), update) + } + if donePk.FinalState != nil { + } return }