Skip to content

Commit 5fca3b1

Browse files
authored
better readable env vars (#270)
* better readable env vars
1 parent 1edf5ae commit 5fca3b1

File tree

8 files changed

+269
-160
lines changed

8 files changed

+269
-160
lines changed

README.md

+14-14
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ services:
146146
environment:
147147
LOG_LEVEL: "info"
148148
ORIGIN_URL: "https://192.168.1.2:3000"
149-
# ORIGIN_WEBURL: "https://some-other.url" # used in the web interface (default: <origin-url>
149+
# ORIGIN_WEB_URL: "https://some-other.url" # used in the web interface (default: <origin-url>
150150

151151
ORIGIN_USERNAME: "username"
152152
ORIGIN_PASSWORD: "password"
@@ -156,11 +156,11 @@ services:
156156
REPLICA1_URL: "http://192.168.1.4"
157157
REPLICA1_USERNAME: "username"
158158
REPLICA1_PASSWORD: "password"
159-
REPLICA1_APIPATH: "/some/path/control"
160-
# REPLICA1_WEBURL: "https://some-other.url" # used in the web interface (default: <replica-url>
161-
# REPLICA1_AUTOSETUP: true # if true, AdGuardHome is automatically initialized.
162-
# REPLICA1_INTERFACENAME: 'ens18' # use custom dhcp interface name
163-
# REPLICA1_DHCPSERVERENABLED: true/false (optional) enables/disables the dhcp server on the replica
159+
REPLICA1_API_PATH: "/some/path/control"
160+
# REPLICA1_WEB_URL: "https://some-other.url" # used in the web interface (default: <replica-url>
161+
# REPLICA1_AUTO_SETUP: true # if true, AdGuardHome is automatically initialized.
162+
# REPLICA1_INTERFACE_NAME: 'ens18' # use custom dhcp interface name
163+
# REPLICA1_DHCP_SERVER_ENABLED: true/false (optional) enables/disables the dhcp server on the replica
164164
CRON: "*/10 * * * *" # run every 10 minutes
165165
RUNONSTART: true
166166
# CONTINUE_ON_ERROR: false # If enabled, the synchronisation task will not fail on single errors, but will log the errors and continue
@@ -169,16 +169,16 @@ services:
169169
API_PORT: 8080
170170

171171
# Configure sync features; by default all features are enabled.
172-
# FEATURES_GENERALSETTINGS: true
173-
# FEATURES_QUERYLOGCONFIG: true
174-
# FEATURES_STATSCONFIG: true
175-
# FEATURES_CLIENTSETTINGS: true
172+
# FEATURES_GENERAL_SETTINGS: true
173+
# FEATURES_QUERY_LOG_CONFIG: true
174+
# FEATURES_STATS_CONFIG: true
175+
# FEATURES_CLIENT_SETTINGS: true
176176
# FEATURES_SERVICES: true
177177
# FEATURES_FILTERS: true
178-
# FEATURES_DHCP_SERVERCONFIG: true
179-
# FEATURES_DHCP_STATICLEASES: true
180-
# FEATURES_DNS_SERVERCONFIG: true
181-
# FEATURES_DNS_ACCESSLISTS: true
178+
# FEATURES_DHCP_SERVER_CONFIG: true
179+
# FEATURES_DHCP_STATIC_LEASES: true
180+
# FEATURES_DNS_SERVER_CONFIG: true
181+
# FEATURES_DNS_ACCESS_LISTS: true
182182
# FEATURES_DNS_REWRITES: true
183183
ports:
184184
- 8080:8080

cmd/root.go

+136-66
Original file line numberDiff line numberDiff line change
@@ -4,67 +4,58 @@ import (
44
"fmt"
55
"os"
66
"regexp"
7+
"strconv"
78
"strings"
89

910
"github.com/bakito/adguardhome-sync/pkg/log"
1011
"github.com/bakito/adguardhome-sync/pkg/types"
12+
"github.com/bakito/adguardhome-sync/pkg/utils"
1113
"github.com/bakito/adguardhome-sync/version"
1214
"github.com/mitchellh/go-homedir"
1315
"github.com/spf13/cobra"
1416
"github.com/spf13/viper"
1517
)
1618

1719
const (
18-
configCron = "cron"
19-
configRunOnStart = "runOnStart"
20+
configCron = "CRON"
21+
configRunOnStart = "RUN_ON_START"
2022
configPrintConfigOnly = "PRINT_CONFIG_ONLY"
2123
configContinueOnError = "CONTINUE_ON_ERROR"
22-
configLogLevel = "LOG_LEVEL"
23-
24-
configAPIPort = "api.port"
25-
configAPIUsername = "api.username"
26-
configAPIPassword = "api.password"
27-
configAPIDarkMode = "api.darkMode"
28-
29-
configFeatureDHCPServerConfig = "features.dhcp.serverConfig"
30-
configFeatureDHCPStaticLeases = "features.dhcp.staticLeases"
31-
configFeatureDNServerConfig = "features.dns.serverConfig"
32-
configFeatureDNSPAccessLists = "features.dns.accessLists"
33-
configFeatureDNSRewrites = "features.dns.rewrites"
34-
configFeatureGeneralSettings = "features.generalSettings"
35-
configFeatureQueryLogConfig = "features.queryLogConfig"
36-
configFeatureStatsConfig = "features.statsConfig"
37-
configFeatureClientSettings = "features.clientSettings"
38-
configFeatureServices = "features.services"
39-
configFeatureFilters = "features.filters"
40-
41-
configOriginURL = "origin.url"
42-
configOriginWebURL = "origin.webURL"
43-
configOriginAPIPath = "origin.apiPath"
44-
configOriginUsername = "origin.username"
45-
configOriginPassword = "origin.password"
46-
configOriginCookie = "origin.cookie"
47-
configOriginInsecureSkipVerify = "origin.insecureSkipVerify"
48-
49-
configReplicaURL = "replica.url"
50-
configReplicaWebURL = "replica.webURL"
51-
configReplicaAPIPath = "replica.apiPath"
52-
configReplicaUsername = "replica.username"
53-
configReplicaPassword = "replica.password"
54-
configReplicaCookie = "replica.cookie"
55-
configReplicaInsecureSkipVerify = "replica.insecureSkipVerify"
56-
configReplicaAutoSetup = "replica.autoSetup"
57-
configReplicaInterfaceName = "replica.interfaceName"
58-
59-
envReplicasUsernameFormat = "REPLICA%s_USERNAME" // #nosec G101
60-
envReplicasPasswordFormat = "REPLICA%s_PASSWORD" // #nosec G101
61-
envReplicasCookieFormat = "REPLICA%s_COOKIE" // #nosec G101
62-
envReplicasAPIPathFormat = "REPLICA%s_APIPATH"
63-
envReplicasInsecureSkipVerifyFormat = "REPLICA%s_INSECURESKIPVERIFY"
64-
envReplicasAutoSetup = "REPLICA%s_AUTOSETUP"
65-
envReplicasInterfaceName = "REPLICA%s_INTERFACENAME"
66-
envDHCPServerEnabled = "REPLICA%s_DHCPSERVERENABLED"
67-
envWebURL = "REPLICA%s_WEBURL"
24+
25+
configAPIPort = "API.PORT"
26+
configAPIUsername = "API.USERNAME"
27+
configAPIPassword = "API.PASSWORD"
28+
configAPIDarkMode = "API.DARK_MODE"
29+
30+
configFeatureDHCPServerConfig = "FEATURES.DHCP.SERVER_CONFIG"
31+
configFeatureDHCPStaticLeases = "FEATURES.DHCP.STATIC_LEASES"
32+
configFeatureDNServerConfig = "FEATURES.DNS.SERVER_CONFIG"
33+
configFeatureDNSPAccessLists = "FEATURES.DNS.ACCESS_LISTS"
34+
configFeatureDNSRewrites = "FEATURES.DNS.rewrites"
35+
configFeatureGeneralSettings = "FEATURES.GENERAL_SETTINGS"
36+
configFeatureQueryLogConfig = "FEATURES.QUERY_LOG_CONFIG"
37+
configFeatureStatsConfig = "FEATURES.STATS_CONFIG"
38+
configFeatureClientSettings = "FEATURES.CLIENT_SETTINGS"
39+
configFeatureServices = "FEATURES.SERVICES"
40+
configFeatureFilters = "FEATURES.FILTERS"
41+
42+
configOriginURL = "ORIGIN.URL"
43+
configOriginWebURL = "ORIGIN.WEB_URL"
44+
configOriginAPIPath = "ORIGIN.API_PATH"
45+
configOriginUsername = "ORIGIN.USERNAME"
46+
configOriginPassword = "ORIGIN.PASSWORD"
47+
configOriginCookie = "ORIGIN.COOKIE"
48+
configOriginInsecureSkipVerify = "ORIGIN.INSECURE_SKIP_VERIFY"
49+
50+
configReplicaURL = "REPLICA.URL"
51+
configReplicaWebURL = "REPLICA.WEB_URL"
52+
configReplicaAPIPath = "REPLICA.API_PATH"
53+
configReplicaUsername = "REPLICA.USERNAME"
54+
configReplicaPassword = "REPLICA.PASSWORD"
55+
configReplicaCookie = "REPLICA.COOKIE"
56+
configReplicaInsecureSkipVerify = "REPLICA.INSECURE_SKIP_VERIFY"
57+
configReplicaAutoSetup = "REPLICA.AUTO_SETUP"
58+
configReplicaInterfaceName = "REPLICA.INTERFACE_NAME"
6859
)
6960

7061
var (
@@ -147,33 +138,116 @@ func getConfig() (*types.Config, error) {
147138
cfg.Replicas = append(cfg.Replicas, collectEnvReplicas()...)
148139
}
149140

141+
handleDeprecatedEnvVars(cfg)
142+
150143
return cfg, nil
151144
}
152145

146+
func handleDeprecatedEnvVars(cfg *types.Config) {
147+
value := checkDeprecatedEnvVar("RUNONSTART", "RUN_ON_START")
148+
if value != "" {
149+
cfg.RunOnStart, _ = strconv.ParseBool(value)
150+
}
151+
value = checkDeprecatedEnvVar("API_DARKMODE", "API_DARK_MODE")
152+
if value != "" {
153+
cfg.API.DarkMode, _ = strconv.ParseBool(value)
154+
}
155+
value = checkDeprecatedEnvVar("FEATURES_GENERALSETTINGS", "FEATURES_GENERAL_SETTINGS")
156+
if value != "" {
157+
cfg.Features.GeneralSettings, _ = strconv.ParseBool(value)
158+
}
159+
value = checkDeprecatedEnvVar("FEATURES_QUERYLOGCONFIG", "FEATURES_QUERY_LOG_CONFIG")
160+
if value != "" {
161+
cfg.Features.QueryLogConfig, _ = strconv.ParseBool(value)
162+
}
163+
value = checkDeprecatedEnvVar("FEATURES_STATSCONFIG", "FEATURES_STATS_CONFIG")
164+
if value != "" {
165+
cfg.Features.StatsConfig, _ = strconv.ParseBool(value)
166+
}
167+
value = checkDeprecatedEnvVar("FEATURES_CLIENTSETTINGS", "FEATURES_CLIENT_SETTINGS")
168+
if value != "" {
169+
cfg.Features.ClientSettings, _ = strconv.ParseBool(value)
170+
}
171+
value = checkDeprecatedEnvVar("FEATURES_DHCP_SERVERCONFIG", "FEATURES_DHCP_SERVER_CONFIG")
172+
if value != "" {
173+
cfg.Features.DHCP.ServerConfig, _ = strconv.ParseBool(value)
174+
}
175+
value = checkDeprecatedEnvVar("FEATURES_DHCP_STATICLEASES", "FEATURES_DHCP_STATIC_LEASES")
176+
if value != "" {
177+
cfg.Features.DHCP.StaticLeases, _ = strconv.ParseBool(value)
178+
}
179+
value = checkDeprecatedEnvVar("FEATURES_DNS_ACCESSLISTS", "FEATURES_DNS_ACCESS_LISTS")
180+
if value != "" {
181+
cfg.Features.DNS.AccessLists, _ = strconv.ParseBool(value)
182+
}
183+
value = checkDeprecatedEnvVar("FEATURES_DNS_SERVERCONFIG", "FEATURES_DNS_SERVER_CONFIG")
184+
if value != "" {
185+
cfg.Features.DNS.ServerConfig, _ = strconv.ParseBool(value)
186+
}
187+
188+
if cfg.Replica != nil {
189+
value = checkDeprecatedEnvVar("REPLICA_WEBURL", "REPLICA_WEB_URL")
190+
if value != "" {
191+
cfg.Replica.WebURL = value
192+
}
193+
value = checkDeprecatedEnvVar("REPLICA_AUTOSETUP", "REPLICA_AUTO_SETUP")
194+
if value != "" {
195+
cfg.Replica.AutoSetup, _ = strconv.ParseBool(value)
196+
}
197+
value = checkDeprecatedEnvVar("REPLICA_INTERFACENAME", "REPLICA_INTERFACE_NAME")
198+
if value != "" {
199+
cfg.Replica.InterfaceName = value
200+
}
201+
value = checkDeprecatedEnvVar("REPLICA_DHCPSERVERENABLED", "REPLICA_DHCP_SERVER_ENABLED")
202+
if value != "" {
203+
if b, err := strconv.ParseBool(value); err != nil {
204+
cfg.Replica.DHCPServerEnabled = utils.Ptr(b)
205+
}
206+
}
207+
}
208+
}
209+
210+
func checkDeprecatedEnvVar(oldName string, newName string) string {
211+
old, oldOK := os.LookupEnv(oldName)
212+
if oldOK {
213+
logger.With("deprecated", oldName, "replacement", newName).
214+
Warn("Deprecated env variable is used, please use the correct one")
215+
}
216+
new, newOK := os.LookupEnv(newName)
217+
if newOK {
218+
return new
219+
}
220+
return old
221+
}
222+
223+
func checkDeprecatedReplicaEnvVar(oldPattern, newPattern, replicaID string) string {
224+
return checkDeprecatedEnvVar(fmt.Sprintf(oldPattern, replicaID), fmt.Sprintf(newPattern, replicaID))
225+
}
226+
153227
// Manually collect replicas from env.
154228
func collectEnvReplicas() []types.AdGuardInstance {
155229
var replicas []types.AdGuardInstance
156230
for _, v := range os.Environ() {
157231
if envReplicasURLPattern.MatchString(v) {
158232
sm := envReplicasURLPattern.FindStringSubmatch(v)
233+
index := sm[1]
159234
re := types.AdGuardInstance{
160235
URL: sm[2],
161-
WebURL: os.Getenv(fmt.Sprintf(envWebURL, sm[1])),
162-
Username: os.Getenv(fmt.Sprintf(envReplicasUsernameFormat, sm[1])),
163-
Password: os.Getenv(fmt.Sprintf(envReplicasPasswordFormat, sm[1])),
164-
Cookie: os.Getenv(fmt.Sprintf(envReplicasCookieFormat, sm[1])),
165-
APIPath: os.Getenv(fmt.Sprintf(envReplicasAPIPathFormat, sm[1])),
166-
InsecureSkipVerify: strings.EqualFold(os.Getenv(fmt.Sprintf(envReplicasInsecureSkipVerifyFormat, sm[1])), "true"),
167-
AutoSetup: strings.EqualFold(os.Getenv(fmt.Sprintf(envReplicasAutoSetup, sm[1])), "true"),
168-
InterfaceName: os.Getenv(fmt.Sprintf(envReplicasInterfaceName, sm[1])),
236+
WebURL: os.Getenv(fmt.Sprintf("REPLICA%s_WEB_URL", index)),
237+
APIPath: checkDeprecatedReplicaEnvVar("REPLICA%s_APIPATH", "REPLICA%s_API_PATH", index),
238+
Username: os.Getenv(fmt.Sprintf("REPLICA%s_USERNAME", index)),
239+
Password: os.Getenv(fmt.Sprintf("REPLICA%s_PASSWORD", index)),
240+
Cookie: os.Getenv(fmt.Sprintf("REPLICA%s_COOKIE", index)),
241+
InsecureSkipVerify: strings.EqualFold(checkDeprecatedReplicaEnvVar("REPLICA%s_INSECURESKIPVERIFY", "REPLICA%s_INSECURE_SKIP_VERIFY", index), "true"),
242+
AutoSetup: strings.EqualFold(checkDeprecatedReplicaEnvVar("REPLICA%s_AUTOSETUP", "REPLICA%s_AUTO_SETUP", index), "true"),
243+
InterfaceName: checkDeprecatedReplicaEnvVar("REPLICA%s_INTERFACENAME", "REPLICA%s_INTERFACE_NAME", index),
169244
}
170245

171-
if dhcpEnabled, ok := os.LookupEnv(fmt.Sprintf(envDHCPServerEnabled, sm[1])); ok {
172-
if strings.EqualFold(dhcpEnabled, "true") {
173-
re.DHCPServerEnabled = boolPtr(true)
174-
} else if strings.EqualFold(dhcpEnabled, "false") {
175-
re.DHCPServerEnabled = boolPtr(false)
176-
}
246+
dhcpEnabled := checkDeprecatedReplicaEnvVar("REPLICA%s_DHCPSERVERENABLED", "REPLICA%s_DHCP_SERVER_ENABLED", index)
247+
if strings.EqualFold(dhcpEnabled, "true") {
248+
re.DHCPServerEnabled = utils.Ptr(true)
249+
} else if strings.EqualFold(dhcpEnabled, "false") {
250+
re.DHCPServerEnabled = utils.Ptr(false)
177251
}
178252
if re.APIPath == "" {
179253
re.APIPath = "/control"
@@ -184,7 +258,3 @@ func collectEnvReplicas() []types.AdGuardInstance {
184258

185259
return replicas
186260
}
187-
188-
func boolPtr(b bool) *bool {
189-
return &b
190-
}

0 commit comments

Comments
 (0)