Skip to content

Commit

Permalink
Add shell filter and adjust filter types to changed filter path
Browse files Browse the repository at this point in the history
  • Loading branch information
stirante committed Aug 23, 2021
1 parent cf2b40f commit eee381f
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 5 deletions.
3 changes: 2 additions & 1 deletion src/filters.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ var FilterTypes = map[string]filterDefinition{}
func RegisterFilters() {
RegisterPythonFilter(FilterTypes)
RegisterNodeJSFilter(FilterTypes)
RegisterShellFilter(FilterTypes)
}

func Setup() error {
Expand Down Expand Up @@ -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)
}
Expand Down
4 changes: 2 additions & 2 deletions src/nodejs_filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -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())
}
}

Expand Down
1 change: 1 addition & 0 deletions src/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand Down
4 changes: 2 additions & 2 deletions src/python_filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -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())
}
}

Expand Down
69 changes: 69 additions & 0 deletions src/shell_filter.go
Original file line number Diff line number Diff line change
@@ -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)
}

0 comments on commit eee381f

Please sign in to comment.