From 1e7f714b2b708610e86a3756cf56026563fd9b0a Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Tue, 2 Jun 2020 22:29:57 +0900 Subject: [PATCH] Add support for env variables to shim config (#7603) --- plugins/inputs/execd/shim/goshim.go | 25 +++++++-- plugins/inputs/execd/shim/shim_test.go | 54 +++++++++++++++++++ .../inputs/execd/shim/testdata/plugin.conf | 4 ++ 3 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 plugins/inputs/execd/shim/testdata/plugin.conf diff --git a/plugins/inputs/execd/shim/goshim.go b/plugins/inputs/execd/shim/goshim.go index 3741d2b80..4c1589b48 100644 --- a/plugins/inputs/execd/shim/goshim.go +++ b/plugins/inputs/execd/shim/goshim.go @@ -9,6 +9,7 @@ import ( "io/ioutil" "os" "os/signal" + "strings" "sync" "syscall" "time" @@ -23,9 +24,13 @@ import ( type empty struct{} var ( - stdout io.Writer = os.Stdout - stdin io.Reader = os.Stdin - forever = 100 * 365 * 24 * time.Hour + stdout io.Writer = os.Stdout + stdin io.Reader = os.Stdin + forever = 100 * 365 * 24 * time.Hour + envVarEscaper = strings.NewReplacer( + `"`, `\"`, + `\`, `\\`, + ) ) const ( @@ -257,11 +262,13 @@ func LoadConfig(filePath *string) ([]telegraf.Input, error) { return nil, err } + s := expandEnvVars(b) + conf := struct { Inputs map[string][]toml.Primitive }{} - md, err := toml.Decode(string(b), &conf) + md, err := toml.Decode(s, &conf) if err != nil { return nil, err } @@ -274,6 +281,16 @@ func LoadConfig(filePath *string) ([]telegraf.Input, error) { return loadedInputs, err } +func expandEnvVars(contents []byte) string { + return os.Expand(string(contents), getEnv) +} + +func getEnv(key string) string { + v := os.Getenv(key) + + return envVarEscaper.Replace(v) +} + func loadConfigIntoInputs(md toml.MetaData, inputConfigs map[string][]toml.Primitive) ([]telegraf.Input, error) { renderedInputs := []telegraf.Input{} diff --git a/plugins/inputs/execd/shim/shim_test.go b/plugins/inputs/execd/shim/shim_test.go index 498ef4ab5..5fd79895f 100644 --- a/plugins/inputs/execd/shim/shim_test.go +++ b/plugins/inputs/execd/shim/shim_test.go @@ -4,6 +4,7 @@ import ( "bufio" "bytes" "io" + "os" "strings" "testing" "time" @@ -11,6 +12,7 @@ import ( "github.com/stretchr/testify/require" "github.com/influxdata/telegraf" + "github.com/influxdata/telegraf/plugins/inputs" ) func TestShimWorks(t *testing.T) { @@ -118,3 +120,55 @@ func (i *testInput) Start(acc telegraf.Accumulator) error { func (i *testInput) Stop() { } + +func TestLoadConfig(t *testing.T) { + os.Setenv("SECRET_TOKEN", "xxxxxxxxxx") + os.Setenv("SECRET_VALUE", `test"\test`) + + inputs.Add("test", func() telegraf.Input { + return &serviceInput{} + }) + + c := "./testdata/plugin.conf" + inputs, err := LoadConfig(&c) + require.NoError(t, err) + + inp := inputs[0].(*serviceInput) + + require.Equal(t, "awesome name", inp.ServiceName) + require.Equal(t, "xxxxxxxxxx", inp.SecretToken) + require.Equal(t, `test"\test`, inp.SecretValue) +} + +type serviceInput struct { + ServiceName string `toml:"service_name"` + SecretToken string `toml:"secret_token"` + SecretValue string `toml:"secret_value"` +} + +func (i *serviceInput) SampleConfig() string { + return "" +} + +func (i *serviceInput) Description() string { + return "" +} + +func (i *serviceInput) Gather(acc telegraf.Accumulator) error { + acc.AddFields("measurement", + map[string]interface{}{ + "field": 1, + }, + map[string]string{ + "tag": "tag", + }, time.Unix(1234, 5678)) + + return nil +} + +func (i *serviceInput) Start(acc telegraf.Accumulator) error { + return nil +} + +func (i *serviceInput) Stop() { +} diff --git a/plugins/inputs/execd/shim/testdata/plugin.conf b/plugins/inputs/execd/shim/testdata/plugin.conf new file mode 100644 index 000000000..78dbb33a9 --- /dev/null +++ b/plugins/inputs/execd/shim/testdata/plugin.conf @@ -0,0 +1,4 @@ +[[inputs.test]] + service_name = "awesome name" + secret_token = "${SECRET_TOKEN}" + secret_value = "$SECRET_VALUE"