From bc65850ac568bc54a66d0884274a54b4d0a19144 Mon Sep 17 00:00:00 2001 From: tomfeigin Date: Wed, 27 Apr 2022 15:11:36 +0300 Subject: [PATCH] Allow setting environment variables for services (#312) Setting environment variables for services running with systemd, OSx or windows --- service.go | 2 ++ service_darwin.go | 7 +++++++ service_systemd_linux.go | 4 ++++ service_windows.go | 26 ++++++++++++++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/service.go b/service.go index e0ceaf3..015b1b9 100644 --- a/service.go +++ b/service.go @@ -134,6 +134,8 @@ type Config struct { // System specific options. Option KeyValue + + EnvVars map[string]string } var ( diff --git a/service_darwin.go b/service_darwin.go index 574bc67..2dffa92 100644 --- a/service_darwin.go +++ b/service_darwin.go @@ -285,6 +285,13 @@ var launchdConfig = ` "http://www.apple.com/DTDs/PropertyList-1.0.dtd" > + EnvironmentVariables + + {{range $k, $v := .EnvVars -}} + {{html $k}} + {{html $v}} + {{end -}} + Label {{html .Name}} ProgramArguments diff --git a/service_systemd_linux.go b/service_systemd_linux.go index 77dc013..f5c1ba4 100644 --- a/service_systemd_linux.go +++ b/service_systemd_linux.go @@ -318,6 +318,10 @@ StandardError=file:/var/log/{{.Name}}.err RestartSec=120 EnvironmentFile=-/etc/sysconfig/{{.Name}} +{{range $k, $v := .EnvVars -}} +Environment={{$k}}={{$v}} +{{end -}} + [Install] WantedBy=multi-user.target ` diff --git a/service_windows.go b/service_windows.go index 9e930f6..3758a27 100644 --- a/service_windows.go +++ b/service_windows.go @@ -222,6 +222,27 @@ loop: return false, 0 } +func (ws *windowsService) setEnvironmentVariablesInRegistry() error { + k, _, err := registry.CreateKey( + registry.LOCAL_MACHINE, `SYSTEM\CurrentControlSet\Services\`+ws.Name, + registry.QUERY_VALUE|registry.SET_VALUE|registry.CREATE_SUB_KEY) + if err != nil { + return fmt.Errorf("failed creating env var registry key, err = %v", err) + } + envStrings := make([]string, 0, len(ws.EnvVars)) + for k, v := range ws.EnvVars { + envStrings = append(envStrings, k+"="+v) + } + + if err := k.SetStringsValue("Environment", envStrings); err != nil { + return fmt.Errorf("failed setting env var registry key, err = %v", err) + } + if err := k.Close(); err != nil { + return fmt.Errorf("failed closing env var registry key, err = %v", err) + } + return nil +} + func (ws *windowsService) Install() error { exepath, err := ws.execPath() if err != nil { @@ -233,6 +254,11 @@ func (ws *windowsService) Install() error { return err } defer m.Disconnect() + + if err := ws.setEnvironmentVariablesInRegistry(); err != nil { + return err + } + s, err := m.OpenService(ws.Name) if err == nil { s.Close()