diff --git a/agent/consul/server.go b/agent/consul/server.go index 4520b1111..e153f9b28 100644 --- a/agent/consul/server.go +++ b/agent/consul/server.go @@ -427,7 +427,7 @@ func NewServerLogger(config *Config, logger *log.Logger, tokens *token.Store) (* } go s.Flood(nil, portFn, s.serfWAN) } - + // Start enterprise specific functionality if err := s.startEnterprise(); err != nil { s.Shutdown() diff --git a/agent/proxy/manager.go b/agent/proxy/manager.go index e3c6dd779..65ffff738 100644 --- a/agent/proxy/manager.go +++ b/agent/proxy/manager.go @@ -433,6 +433,9 @@ func (m *Manager) newProxy(mp *local.ManagedProxy) (Proxy, error) { return nil, fmt.Errorf("error configuring proxy logs: %s", err) } + // Pass in the environmental variables for the proxy process + cmd.Env = os.Environ() + // Build the daemon structure proxy.Command = &cmd proxy.ProxyID = id diff --git a/agent/proxy/manager_test.go b/agent/proxy/manager_test.go index 42286493c..d9e63b6c6 100644 --- a/agent/proxy/manager_test.go +++ b/agent/proxy/manager_test.go @@ -5,6 +5,7 @@ import ( "os" "os/exec" "path/filepath" + "sort" "testing" "time" @@ -261,6 +262,50 @@ func TestManagerRun_daemonPid(t *testing.T) { require.NotEmpty(pidRaw) } +// Test to check if the parent and the child processes +// have the same environmental variables + +func TestManagerPassesEnvironment(t *testing.T) { + t.Parallel() + + require := require.New(t) + state := local.TestState(t) + m, closer := testManager(t) + defer closer() + m.State = state + defer m.Kill() + + // Add Proxy for the test + td, closer := testTempDir(t) + defer closer() + path := filepath.Join(td, "env-variables") + testStateProxy(t, state, "environTest", helperProcess("environ", path)) + + //Run the manager + go m.Run() + + //Get the environmental variables from the OS + var fileContent []byte + var err error + var data []byte + envData := os.Environ() + sort.Strings(envData) + for _, envVariable := range envData { + data = append(data, envVariable...) + data = append(data, "\n"...) + } + + // Check if the file written to from the spawned process + // has the necessary environmental variable data + retry.Run(t, func(r *retry.R) { + if fileContent, err = ioutil.ReadFile(path); err != nil { + r.Fatalf("No file ya dummy") + } + }) + + require.Equal(fileContent, data) +} + // Test the Snapshot/Restore works. func TestManagerRun_snapshotRestore(t *testing.T) { t.Parallel() diff --git a/agent/proxy/proxy_test.go b/agent/proxy/proxy_test.go index 0a9237319..0ac0446a8 100644 --- a/agent/proxy/proxy_test.go +++ b/agent/proxy/proxy_test.go @@ -7,7 +7,9 @@ import ( "os" "os/exec" "os/signal" + "sort" "strconv" + "strings" "syscall" "testing" "time" @@ -124,7 +126,6 @@ func TestHelperProcess(t *testing.T) { default: } } - case "stop-kill": // Setup listeners so it is ignored ch := make(chan os.Signal, 1) @@ -139,6 +140,36 @@ func TestHelperProcess(t *testing.T) { } time.Sleep(25 * time.Millisecond) } + // Check if the external process can access the enivironmental variables + case "environ": + stop := make(chan os.Signal, 1) + signal.Notify(stop, os.Interrupt) + defer signal.Stop(stop) + + //Get the path for the file to be written to + path := args[0] + var data []byte + + //Get the environmental variables + envData := os.Environ() + + //Sort the env data for easier comparison + sort.Strings(envData) + for _, envVariable := range envData { + if strings.HasPrefix(envVariable, "CONSUL") || strings.HasPrefix(envVariable, "CONNECT") { + continue + } + data = append(data, envVariable...) + data = append(data, "\n"...) + } + if err := ioutil.WriteFile(path, data, 0644); err != nil { + t.Fatalf("[Error] File write failed : %s", err) + } + + // Clean up after we receive the signal to exit + defer os.Remove(path) + + <-stop case "output": fmt.Fprintf(os.Stdout, "hello stdout\n")