mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-11-10 17:26:10 +08:00
46 lines
1 KiB
Go
46 lines
1 KiB
Go
package js
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"github.com/StackExchange/dnscontrol/models"
|
|
|
|
"github.com/robertkrimen/otto"
|
|
//load underscore js into vm by default
|
|
_ "github.com/robertkrimen/otto/underscore"
|
|
)
|
|
|
|
//ExecuteJavascript accepts a javascript string and runs it, returning the resulting dnsConfig.
|
|
func ExecuteJavascript(script string, devMode bool) (*models.DNSConfig, error) {
|
|
vm := otto.New()
|
|
|
|
helperJs := GetHelpers(devMode)
|
|
// run helper script to prime vm and initialize variables
|
|
if _, err := vm.Run(string(helperJs)); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// run user script
|
|
if _, err := vm.Run(script); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// export conf as string and unmarshal
|
|
value, err := vm.Run(`JSON.stringify(conf)`)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
str, err := value.ToString()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
conf := &models.DNSConfig{}
|
|
if err = json.Unmarshal([]byte(str), conf); err != nil {
|
|
return nil, err
|
|
}
|
|
return conf, nil
|
|
}
|
|
|
|
func GetHelpers(devMode bool) string {
|
|
return FSMustString(devMode, "/helpers.js")
|
|
}
|