From 6f9e68f4de8c62153f692fe8553c43fb24c7e530 Mon Sep 17 00:00:00 2001 From: Lenard Hess Date: Tue, 21 Mar 2023 22:59:25 +0100 Subject: [PATCH] Implemented _env suffix for configuration With this change, any config value may be set through an environment variable by appending '_env' to the keyword (i.e. 'password_env' instead of 'password') and setting the value to the name of the environment variable that contains the actual configuration value. This allows keeping sensitive info (i.e. login and password) out of the configuration file. Example configuration snippet: protocol=namecheap, \ server=dynamicdns.park-your-domain.com, \ login_env=DD_LOGIN, \ password_env=DD_PASSWORD \ @ With this configuration snippet, ddclient will use the contents of DD_LOGIN as the login value and the contents of DD_PASSWORD as the password value. These can in turn be supplied via the command line, .env files or any other mechanism to safeguard sensitive information. --- ddclient.in | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/ddclient.in b/ddclient.in index de45312..620f8e6 100755 --- a/ddclient.in +++ b/ddclient.in @@ -1616,6 +1616,25 @@ sub _read_config { ## verify that keywords are valid...and check the value foreach my $k (keys %locals) { + # Handle '_env' keyword suffix + if ($k =~ /(.*)_env$/) + { + debug("Loading value for $1 from environment variable $locals{$k}."); + if (exists($ENV{$locals{$k}})) + { + # Set the value to the value of the environment variable + $locals{$1} = $ENV{$locals{$k}}; + # Remove the '_env' suffix from the key + $k = $1; + } + else + { + warning("Environment variable '$locals{$k}' not set for keyword '$k' (ignored)"); + delete $locals{$k}; + next; + } + } + $locals{$k} = $passwords{$k} if defined $passwords{$k}; if (!exists $variables{'merged'}{$k}) { warning("unrecognized keyword '%s' (ignored)", $k);