From eee381f4f85ed5923ce13facbdd199eb020857d8 Mon Sep 17 00:00:00 2001 From: stirante Date: Mon, 23 Aug 2021 22:42:29 +0200 Subject: [PATCH] Add shell filter and adjust filter types to changed filter path --- src/filters.go | 3 +- src/nodejs_filter.go | 4 +-- src/project.go | 1 + src/python_filter.go | 4 +-- src/shell_filter.go | 69 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 src/shell_filter.go diff --git a/src/filters.go b/src/filters.go index 1abd8253..d48a182b 100644 --- a/src/filters.go +++ b/src/filters.go @@ -26,6 +26,7 @@ var FilterTypes = map[string]filterDefinition{} func RegisterFilters() { RegisterPythonFilter(FilterTypes) RegisterNodeJSFilter(FilterTypes) + RegisterShellFilter(FilterTypes) } func Setup() error { @@ -152,7 +153,7 @@ func (filter *Filter) RunFilter(absoluteLocation string) { RunStandardFilter(*filter) } else { if f, ok := FilterTypes[filter.RunWith]; ok { - f.filter(*filter, filter.Settings, absoluteLocation+string(os.PathSeparator)+filter.Location) + f.filter(*filter, filter.Settings, absoluteLocation) } else { Logger.Warnf("Filter type '%s' not supported", filter.RunWith) } diff --git a/src/nodejs_filter.go b/src/nodejs_filter.go index fafe1a11..b7bac237 100644 --- a/src/nodejs_filter.go +++ b/src/nodejs_filter.go @@ -20,10 +20,10 @@ func RegisterNodeJSFilter(filters map[string]filterDefinition) { func runNodeJSFilter(filter Filter, settings map[string]interface{}, absoluteLocation string) { if len(settings) == 0 { - RunSubProcess("node", append([]string{absoluteLocation}, filter.Arguments...), GetAbsoluteWorkingDirectory()) + RunSubProcess("node", append([]string{absoluteLocation + string(os.PathSeparator) + filter.Location}, filter.Arguments...), GetAbsoluteWorkingDirectory()) } else { jsonSettings, _ := json.Marshal(settings) - RunSubProcess("node", append([]string{absoluteLocation, string(jsonSettings)}, filter.Arguments...), GetAbsoluteWorkingDirectory()) + RunSubProcess("node", append([]string{absoluteLocation + string(os.PathSeparator) + filter.Location, string(jsonSettings)}, filter.Arguments...), GetAbsoluteWorkingDirectory()) } } diff --git a/src/project.go b/src/project.go index 4aa206c6..a7820081 100644 --- a/src/project.go +++ b/src/project.go @@ -27,6 +27,7 @@ type Filter struct { Name string `json:"name"` Location string `json:"location"` RunWith string `json:"run_with"` + Command string `json:"command"` Arguments []string `json:"arguments"` Url string `json:"url"` Filter string `json:"filter"` diff --git a/src/python_filter.go b/src/python_filter.go index 11dd01b6..15be3c58 100644 --- a/src/python_filter.go +++ b/src/python_filter.go @@ -30,10 +30,10 @@ func runPythonFilter(filter Filter, settings map[string]interface{}, absoluteLoc command = dir + "/venv/Scripts/python" + suffix } if len(settings) == 0 { - RunSubProcess(command, append([]string{"-u", absoluteLocation}, filter.Arguments...), GetAbsoluteWorkingDirectory()) + RunSubProcess(command, append([]string{"-u", absoluteLocation + string(os.PathSeparator) + filter.Location}, filter.Arguments...), GetAbsoluteWorkingDirectory()) } else { jsonSettings, _ := json.Marshal(settings) - RunSubProcess(command, append([]string{"-u", absoluteLocation, string(jsonSettings)}, filter.Arguments...), GetAbsoluteWorkingDirectory()) + RunSubProcess(command, append([]string{"-u", absoluteLocation + string(os.PathSeparator) + filter.Location, string(jsonSettings)}, filter.Arguments...), GetAbsoluteWorkingDirectory()) } } diff --git a/src/shell_filter.go b/src/shell_filter.go new file mode 100644 index 00000000..003697f7 --- /dev/null +++ b/src/shell_filter.go @@ -0,0 +1,69 @@ +package src + +import ( + "encoding/json" + "go.uber.org/zap" + "os" + "os/exec" + "strconv" + "strings" +) + +const shellFilterName = "shell" + +var shells = [][]string{{"powershell", "-command"}, {"cmd", "/k"}, {"bash", "-c"}, {"sh", "-c"}} + +func RegisterShellFilter(filters map[string]filterDefinition) { + filters[shellFilterName] = filterDefinition{ + filter: runShellFilter, + install: func(filter Filter, path string) { + + }, + check: checkShellRequirements, + } +} + +func runShellFilter(filter Filter, settings map[string]interface{}, absoluteLocation string) { + if len(settings) == 0 { + executeCommand(filter.Command, filter.Arguments, absoluteLocation, GetAbsoluteWorkingDirectory()) + } else { + jsonSettings, _ := json.Marshal(settings) + executeCommand(filter.Command, append([]string{string(jsonSettings)}, filter.Arguments...), absoluteLocation, GetAbsoluteWorkingDirectory()) + } +} + +func executeCommand(command string, args []string, absoluteLocation string, workingDir string) { + for i, arg := range args { + args[i] = strconv.Quote(arg) + } + joined := strings.Join(append([]string{command}, args...), " ") + Logger.Debug(joined) + shell, arg := findShell() + cmd := exec.Command(shell, arg, joined) + cmd.Dir = workingDir + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.Env = append(os.Environ(), "FILTER_DIR="+absoluteLocation) + + err := cmd.Run() + + if err != nil { + Logger.Fatal(zap.Error(err)) + } +} + +func findShell() (string, string) { + for _, shell := range shells { + _, err := exec.LookPath(shell[0]) + if err == nil { + return shell[0], shell[1] + } + } + Logger.Fatal("Unable to find a valid shell") + return "", "" +} + +func checkShellRequirements() { + shell, _ := findShell() + Logger.Debugf("Using shell: %s", shell) +}