move some sh parsing to shexec

This commit is contained in:
sawka 2022-10-24 21:29:11 -07:00
parent 3b7dd7c01e
commit c9195b3cfd
2 changed files with 11 additions and 59 deletions

View File

@ -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 {

View File

@ -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))