diff --git a/pkg/cmdrunner/cmdrunner.go b/pkg/cmdrunner/cmdrunner.go index ecb6a747..00b1a4f8 100644 --- a/pkg/cmdrunner/cmdrunner.go +++ b/pkg/cmdrunner/cmdrunner.go @@ -39,7 +39,7 @@ 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 WindowCmds = []string{"run", "comment", "cd", "cr", "setenv", "unset", "clear", "sw", "alias", "unalias", "function", "source", "reset"} var NoHistCmds = []string{"compgen", "line", "history"} var GlobalCmds = []string{"session", "screen", "remote"} @@ -78,6 +78,7 @@ func init() { registerCmdFn("setenv", SetEnvCommand) registerCmdFn("unset", UnSetCommand) registerCmdFn("clear", ClearCommand) + registerCmdFn("reset", ResetCommand) registerCmdFn("session", SessionCommand) registerCmdFn("session:open", SessionOpenCommand) @@ -947,7 +948,7 @@ func SetEnvCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstor if len(pk.Args) == 0 { var infoLines []string for varName, varVal := range envMap { - line := fmt.Sprintf("%s=%s", varName, shellescape.Quote(varVal)) + line := fmt.Sprintf("%s=%s", shellescape.Quote(varName), shellescape.Quote(varVal)) infoLines = append(infoLines, line) } update := sstore.ModelUpdate{ @@ -1563,6 +1564,10 @@ func SessionCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (ssto return update, nil } +func ResetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) { + return nil, nil +} + func ClearCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) { ids, err := resolveUiIds(ctx, pk, R_Session|R_Screen|R_Window) if err != nil { diff --git a/pkg/cmdrunner/shparse.go b/pkg/cmdrunner/shparse.go index e0fab17c..25c67105 100644 --- a/pkg/cmdrunner/shparse.go +++ b/pkg/cmdrunner/shparse.go @@ -3,40 +3,15 @@ package cmdrunner import ( "context" "fmt" - "io" "regexp" "strings" + "github.com/scripthaus-dev/mshell/pkg/shexec" "github.com/scripthaus-dev/sh2-server/pkg/scpacket" "mvdan.cc/sh/v3/expand" "mvdan.cc/sh/v3/syntax" ) -type parseEnviron struct { - Env map[string]string -} - -func (e *parseEnviron) Get(name string) expand.Variable { - val, ok := e.Env[name] - if !ok { - return expand.Variable{} - } - return expand.Variable{ - Exported: true, - Kind: expand.String, - Str: val, - } -} - -func (e *parseEnviron) Each(fn func(name string, vr expand.Variable) bool) { - for key, _ := range e.Env { - rtn := fn(key, e.Get(key)) - if !rtn { - break - } - } -} - func DumpPacket(pk *scpacket.FeCommandPacketType) { if pk == nil || pk.MetaCmd == "" { fmt.Printf("[no metacmd]\n") @@ -55,14 +30,6 @@ func DumpPacket(pk *scpacket.FeCommandPacketType) { } } -func doCmdSubst(commandStr string, w io.Writer, word *syntax.CmdSubst) error { - return nil -} - -func doProcSubst(w *syntax.ProcSubst) (string, error) { - return "", nil -} - func isQuoted(source string, w *syntax.Word) bool { if w == nil { return false @@ -99,6 +66,7 @@ var BareMetaCmds = []BareMetaCmdDecl{ BareMetaCmdDecl{"clear", "clear"}, BareMetaCmdDecl{".", "source"}, BareMetaCmdDecl{"source", "source"}, + BareMetaCmdDecl{"reset", "reset"}, } func SubMetaCmd(cmd string) string { @@ -186,15 +154,7 @@ func EvalMetaCommand(ctx context.Context, origPk *scpacket.FeCommandPacketType) return nil, fmt.Errorf("parsing metacmd, position %v", err) } envMap := make(map[string]string) // later we can add vars like session, window, screen, remote, and user - cfg := &expand.Config{ - Env: &parseEnviron{Env: envMap}, - GlobStar: false, - NullGlob: false, - NoUnset: false, - CmdSubst: func(w io.Writer, word *syntax.CmdSubst) error { return doCmdSubst(commandArgs, w, word) }, - ProcSubst: doProcSubst, - ReadDir: nil, - } + cfg := shexec.GetParserConfig(envMap) // process arguments for idx, w := range words { literalVal, err := expand.Literal(cfg, w) @@ -234,7 +194,7 @@ func parseAliasStmt(stmt *syntax.Stmt) (string, string, error) { return "", "", fmt.Errorf("invalid alias cmd word (not 'alias')") } secondWord := callExpr.Args[1] - val, err := quotedLitToStr(secondWord) + val, err := shexec.QuotedLitToStr(secondWord) if err != nil { return "", "", err } @@ -245,19 +205,6 @@ func parseAliasStmt(stmt *syntax.Stmt) (string, string, error) { return val[0:eqIdx], val[eqIdx+1:], nil } -func quotedLitToStr(word *syntax.Word) (string, error) { - cfg := &expand.Config{ - Env: &parseEnviron{Env: make(map[string]string)}, - GlobStar: false, - NullGlob: false, - NoUnset: false, - CmdSubst: func(w io.Writer, word *syntax.CmdSubst) error { return doCmdSubst("", w, word) }, - ProcSubst: doProcSubst, - ReadDir: nil, - } - return expand.Literal(cfg, word) -} - func ParseAliases(aliases string) (map[string]string, error) { r := strings.NewReader(aliases) parser := syntax.NewParser(syntax.Variant(syntax.LangBash))