From 512aa7d4b3c12f2efd21fc7369235fd5247c1aa5 Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Tue, 27 Oct 2020 15:43:00 +0100 Subject: [PATCH] NEW FEATURE: Set JS variables from command line (#913) * Add ability to specify variables that are passed to js * Use SplitN to respect a = in value part * Add JSON parsing for cli variables * Remove JSON parsing for cli variables * Add a function to set CLI defaults * Update static.go --- commands/commands.go | 7 +++++++ commands/printIR.go | 15 ++++++++++++++- pkg/js/helpers.js | 9 +++++++++ pkg/js/js.go | 7 ++++++- pkg/js/static.go | 7 ++++--- 5 files changed, 40 insertions(+), 5 deletions(-) diff --git a/commands/commands.go b/commands/commands.go index 40b943427..7ef7ee01a 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -160,6 +160,7 @@ type ExecuteDSLArgs struct { JSFile string JSONFile string DevMode bool + Variable cli.StringSlice } func (args *ExecuteDSLArgs) flags() []cli.Flag { @@ -182,6 +183,12 @@ func (args *ExecuteDSLArgs) flags() []cli.Flag { Destination: &args.DevMode, Usage: "Use helpers.js from disk instead of embedded copy", }, + &cli.StringSliceFlag{ + Name: "variable", + Aliases: []string{"v"}, + Destination: &args.Variable, + Usage: "Add variable that is passed to JS", + }, } } diff --git a/commands/printIR.go b/commands/printIR.go index da1d8debd..e89806655 100644 --- a/commands/printIR.go +++ b/commands/printIR.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "os" + "strings" "github.com/urfave/cli/v2" @@ -102,7 +103,7 @@ func ExecuteDSL(args ExecuteDSLArgs) (*models.DNSConfig, error) { return nil, fmt.Errorf("no config specified") } - dnsConfig, err := js.ExecuteJavascript(args.JSFile, args.DevMode) + dnsConfig, err := js.ExecuteJavascript(args.JSFile, args.DevMode, stringSliceToMap(args.Variable)) if err != nil { return nil, fmt.Errorf("executing %s: %w", args.JSFile, err) } @@ -139,3 +140,15 @@ func exit(err error) error { } return cli.NewExitError(err, 1) } + +// stringSliceToMap converts cli.StringSlice to map[string]string for further processing +func stringSliceToMap(stringSlice cli.StringSlice) map[string]string { + mapString := make(map[string]string, len(stringSlice.Value())) + for _, values := range stringSlice.Value() { + parts := strings.SplitN(values, "=", 2) + if len(parts) == 2 { + mapString[parts[0]] = parts[1] + } + } + return mapString +} diff --git a/pkg/js/helpers.js b/pkg/js/helpers.js index 0cbb70dc6..60257a56a 100644 --- a/pkg/js/helpers.js +++ b/pkg/js/helpers.js @@ -938,3 +938,12 @@ function require_glob() { } return files } + +// Set default values for CLI variables +function CLI_DEFAULTS(defaults) { + for (var key in defaults) { + if (typeof this[key] === "undefined") { + this[key] = defaults[key] + } + } +} diff --git a/pkg/js/js.go b/pkg/js/js.go index daa4b2acb..1787dcaeb 100644 --- a/pkg/js/js.go +++ b/pkg/js/js.go @@ -25,7 +25,7 @@ import ( var currentDirectory string // ExecuteJavascript accepts a javascript string and runs it, returning the resulting dnsConfig. -func ExecuteJavascript(file string, devMode bool) (*models.DNSConfig, error) { +func ExecuteJavascript(file string, devMode bool, variables map[string]string) (*models.DNSConfig, error) { script, err := ioutil.ReadFile(file) if err != nil { return nil, err @@ -40,6 +40,11 @@ func ExecuteJavascript(file string, devMode bool) (*models.DNSConfig, error) { vm.Set("REV", reverse) vm.Set("glob", listFiles) // used for require_glob() + // add cli variables to otto + for key, value := range variables { + vm.Set(key, value) + } + helperJs := GetHelpers(devMode) // run helper script to prime vm and initialize variables if _, err := vm.Run(helperJs); err != nil { diff --git a/pkg/js/static.go b/pkg/js/static.go index 63e552fba..48f99c951 100644 --- a/pkg/js/static.go +++ b/pkg/js/static.go @@ -212,8 +212,8 @@ var _escData = map[string]*_escFile{ "/helpers.js": { name: "helpers.js", local: "pkg/js/helpers.js", - size: 27737, - modtime: 0, + size: 27948, + modtime: 1603735487, compressed: ` H4sIAAAAAAAC/+x9aXcbN7Lod/2Kis67adJuU4tjzz3UcN5wtGR0Rtsh6VzP1dPjhdggCbuJ7gHQoplY +e3vYG2gF0rWmSRfnj8kbKBQKBQKtQAFKCo4Bi4YmYnoaGdnbw/O57DJCsAJESCWhMOcpDhWZauCC2AF @@ -335,7 +335,8 @@ EHNvmM2WBf1sjPHhu3flA7Gj1mtNdviIsYYhw+tBibQc/cie+7MeT8kMd0gsYT3Q8BxgZIfo0j7XDOU5 ZoqYRZrdd7rqp/d3PCDNkDJZc5JiHZQOeemHOx50CIUfs67kETGvWWdUsCwFRDdrtInVC86ynUlod3eJ beolR5SIzZvZEs8+m0jxKhO4bwkj3Nz5oyr+ZTJMLWiSzdRxIE5giVM1FpcpO85UQjdRocNG0pStKTDC P/f8XFaliaamF7fJY1IpDu9gALuf+O6ROdecYaleFCWEztIiwdD7xC173KPl8hMGinadzNChRZrGJWb/ -uX/vJFHjaTlKNLR2FFBLOraq23nc+X8BAAD//9enlT5ZbAAA +uX/vJFHjaTlKNLR2FFBLOraqs6KMhdsRNmyX/R1fnEsiifR7uWdWL86n7jFsm7lru3fi+hmrC8zV+sqb +sdKu337Gmzu1ebnrTk12q3rVA3Q41XdNzT3u/L8AAAD///wzemcsbQAA `, }, }