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.
This commit is contained in:
Lenard Hess 2023-03-21 22:59:25 +01:00 committed by Reuben Thomas
parent 2af841acdb
commit 52b5eea6f4

View file

@ -1645,6 +1645,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);