mirror of
https://github.com/pschiffe/docker-pdns.git
synced 2025-01-18 19:11:14 +01:00
Added possibility to use an existing config file for recursor or auth… (#135)
* Added possibility to use an existing config file for recursor or authorative mysql-powerdns-server, in case the configuration file is handed in from a volume or bind mount (in which it should be mounted as read only!). * ammended changes to PostgreSQL init to provide the same features as the MySQL one. * do not forget to init superslaves if needed. * typos and really do install config file by environment. --------- Co-authored-by: Kai Schlachter <kai.schlachter@bahag.com>
This commit is contained in:
parent
5ec6211f6d
commit
3ba3021b68
3 changed files with 225 additions and 104 deletions
|
@ -2,6 +2,22 @@
|
||||||
|
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
|
##### Function definitions ####
|
||||||
|
|
||||||
|
|
||||||
|
function deriveMySQLSettingsFromExistingConfigFile {
|
||||||
|
if [ ! -f /etc/pdns/pdns.conf ]; then
|
||||||
|
echo "Use of existing file /etc/pdns/pdns.conf requested but file does not exist!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
PDNS_gmysql_host=`sed -n 's/^gmysql-host=\(.*\)/\1/p' < /etc/pdns/pdns.conf`
|
||||||
|
PDNS_gmysql_port=`sed -n 's/^gmysql-port=\(.*\)/\1/p' < /etc/pdns/pdns.conf`
|
||||||
|
PDNS_gmysql_user=`sed -n 's/^gmysql-user=\(.*\)/\1/p' < /etc/pdns/pdns.conf`
|
||||||
|
PDNS_gmysql_password=`sed -n 's/^gmysql-password=\(.*\)/\1/p' < /etc/pdns/pdns.conf`
|
||||||
|
PDNS_gmysql_dbname=`sed -n 's/^gmysql-dbname=\(.*\)/\1/p' < /etc/pdns/pdns.conf`
|
||||||
|
}
|
||||||
|
|
||||||
|
function deriveMySQLSettingsFromEnvironment {
|
||||||
# Configure mysql env vars
|
# Configure mysql env vars
|
||||||
: "${PDNS_gmysql_host:=${MYSQL_ENV_MYSQL_HOST:-mysql}}"
|
: "${PDNS_gmysql_host:=${MYSQL_ENV_MYSQL_HOST:-mysql}}"
|
||||||
: "${PDNS_gmysql_port:=${MYSQL_ENV_MYSQL_PORT:-3306}}"
|
: "${PDNS_gmysql_port:=${MYSQL_ENV_MYSQL_PORT:-3306}}"
|
||||||
|
@ -19,8 +35,9 @@ if [ "${NODE_NAME:-}" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export PDNS_gmysql_host PDNS_gmysql_port PDNS_gmysql_user PDNS_gmysql_password PDNS_gmysql_dbname
|
export PDNS_gmysql_host PDNS_gmysql_port PDNS_gmysql_user PDNS_gmysql_password PDNS_gmysql_dbname
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateMySQLCommand {
|
||||||
EXTRA=''
|
EXTRA=''
|
||||||
|
|
||||||
# Password Auth
|
# Password Auth
|
||||||
|
@ -35,24 +52,30 @@ if [ "${PDNS_gmysql_socket:-}" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
MYSQL_COMMAND="mysql -h ${PDNS_gmysql_host} -P ${PDNS_gmysql_port} -u ${PDNS_gmysql_user}${EXTRA}"
|
MYSQL_COMMAND="mysql -h ${PDNS_gmysql_host} -P ${PDNS_gmysql_port} -u ${PDNS_gmysql_user}${EXTRA}"
|
||||||
|
}
|
||||||
|
|
||||||
# Wait for MySQL to respond
|
|
||||||
until $MYSQL_COMMAND -e ';' ; do
|
|
||||||
>&2 echo 'MySQL is unavailable - sleeping'
|
|
||||||
sleep 3
|
|
||||||
done
|
|
||||||
|
|
||||||
|
function createDatabaseIfRequested {
|
||||||
# Initialize DB if needed
|
# Initialize DB if needed
|
||||||
if [ "${SKIP_DB_CREATE:-false}" != 'true' ]; then
|
if [ "${SKIP_DB_CREATE:-false}" != 'true' ]; then
|
||||||
$MYSQL_COMMAND -e "CREATE DATABASE IF NOT EXISTS ${PDNS_gmysql_dbname}"
|
$MYSQL_COMMAND -e "CREATE DATABASE IF NOT EXISTS ${PDNS_gmysql_dbname}"
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function initDatabase {
|
||||||
|
if [ "${SKIP_DB_INIT:-false}" != 'true' ]; then
|
||||||
MYSQL_CHECK_IF_HAS_TABLE="SELECT COUNT(DISTINCT table_name) FROM information_schema.columns WHERE table_schema = '${PDNS_gmysql_dbname}';"
|
MYSQL_CHECK_IF_HAS_TABLE="SELECT COUNT(DISTINCT table_name) FROM information_schema.columns WHERE table_schema = '${PDNS_gmysql_dbname}';"
|
||||||
MYSQL_NUM_TABLE=$($MYSQL_COMMAND --batch --skip-column-names -e "$MYSQL_CHECK_IF_HAS_TABLE")
|
MYSQL_NUM_TABLE=$($MYSQL_COMMAND --batch --skip-column-names -e "$MYSQL_CHECK_IF_HAS_TABLE")
|
||||||
if [ "$MYSQL_NUM_TABLE" -eq 0 ]; then
|
if [ "$MYSQL_NUM_TABLE" -eq 0 ]; then
|
||||||
|
echo "Database exists and has no tables yet, doing init";
|
||||||
$MYSQL_COMMAND -D "$PDNS_gmysql_dbname" < /usr/share/doc/pdns/schema.mysql.sql
|
$MYSQL_COMMAND -D "$PDNS_gmysql_dbname" < /usr/share/doc/pdns/schema.mysql.sql
|
||||||
|
else
|
||||||
|
echo "Database exists but already has tables, will not try to init";
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function migrateDatabaseTo47 {
|
||||||
# SQL migration to version 4.7
|
# SQL migration to version 4.7
|
||||||
MYSQL_CHECK_IF_47="SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = '${PDNS_gmysql_dbname}' AND table_name = 'domains' AND column_name = 'options';"
|
MYSQL_CHECK_IF_47="SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = '${PDNS_gmysql_dbname}' AND table_name = 'domains' AND column_name = 'options';"
|
||||||
MYSQL_NUM_TABLE=$($MYSQL_COMMAND --batch --skip-column-names -e "$MYSQL_CHECK_IF_47")
|
MYSQL_NUM_TABLE=$($MYSQL_COMMAND --batch --skip-column-names -e "$MYSQL_CHECK_IF_47")
|
||||||
|
@ -60,7 +83,9 @@ if [ "$MYSQL_NUM_TABLE" -eq 0 ]; then
|
||||||
echo 'Migrating MySQL schema to version 4.7...'
|
echo 'Migrating MySQL schema to version 4.7...'
|
||||||
$MYSQL_COMMAND -D "$PDNS_gmysql_dbname" < /usr/share/doc/pdns/4.3.0_to_4.7.0_schema.mysql.sql
|
$MYSQL_COMMAND -D "$PDNS_gmysql_dbname" < /usr/share/doc/pdns/4.3.0_to_4.7.0_schema.mysql.sql
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function initSuperslave {
|
||||||
if [ "${PDNS_superslave:-no}" = 'yes' ]; then
|
if [ "${PDNS_superslave:-no}" = 'yes' ]; then
|
||||||
# Configure supermasters if needed
|
# Configure supermasters if needed
|
||||||
if [ "${SUPERMASTER_IPS:-}" ]; then
|
if [ "${SUPERMASTER_IPS:-}" ]; then
|
||||||
|
@ -83,8 +108,41 @@ if [ "${PDNS_superslave:-no}" = 'yes' ]; then
|
||||||
$MYSQL_COMMAND -D "$PDNS_gmysql_dbname" -e "$MYSQL_INSERT_SUPERMASTERS"
|
$MYSQL_COMMAND -D "$PDNS_gmysql_dbname" -e "$MYSQL_INSERT_SUPERMASTERS"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateAndInstallConfigFileFromEnvironment {
|
||||||
# Create config file from template
|
# Create config file from template
|
||||||
subvars --prefix 'PDNS_' < '/pdns.conf.tpl' > '/etc/pdns/pdns.conf'
|
subvars --prefix 'PDNS_' < '/pdns.conf.tpl' > '/etc/pdns/pdns.conf'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#### End of function definitions, let's get to work ...
|
||||||
|
|
||||||
|
if [ ${USE_EXISTING_CONFIG_FILE:-false} = 'true' ]; then
|
||||||
|
deriveMySQLSettingsFromExistingConfigFile
|
||||||
|
else
|
||||||
|
deriveMySQLSettingsFromEnvironment
|
||||||
|
fi
|
||||||
|
|
||||||
|
generateMySQLCommand
|
||||||
|
|
||||||
|
# Wait for MySQL to respond
|
||||||
|
until $MYSQL_COMMAND -e ';' ; do
|
||||||
|
>&2 echo 'MySQL is unavailable - sleeping'
|
||||||
|
sleep 3
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
createDatabaseIfRequested
|
||||||
|
initDatabase
|
||||||
|
migrateDatabaseTo47
|
||||||
|
initSuperslave
|
||||||
|
|
||||||
|
if [ ${USE_EXISTING_CONFIG_FILE:-false} = 'false' ]; then
|
||||||
|
echo "(re-)generating config file from environment variables"
|
||||||
|
generateAndInstallConfigFileFromEnvironment
|
||||||
|
fi
|
||||||
|
|
||||||
exec "$@"
|
exec "$@"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,19 @@
|
||||||
|
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
|
function derivePostgreSQLSettingsFromExistingConfigFile {
|
||||||
|
if [ ! -f /etc/pdns/pdns.conf ]; then
|
||||||
|
echo "Use of existing file /etc/pdns/pdns.conf requested but file does not exist!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
PDNS_gpgsql_host=`sed -n 's/^gpgsql-host=\(.*\)/\1/p' < /etc/pdns/pdns.conf`
|
||||||
|
PDNS_gpgsql_port=`sed -n 's/^gpgsql-port=\(.*\)/\1/p' < /etc/pdns/pdns.conf`
|
||||||
|
PDNS_gpgsql_user=`sed -n 's/^gpgsql-user=\(.*\)/\1/p' < /etc/pdns/pdns.conf`
|
||||||
|
PDNS_gpgsql_password=`sed -n 's/^gpgsql-password=\(.*\)/\1/p' < /etc/pdns/pdns.conf`
|
||||||
|
PDNS_gpgsql_dbname=`sed -n 's/^gpgsql-dbname=\(.*\)/\1/p' < /etc/pdns/pdns.conf`
|
||||||
|
}
|
||||||
|
|
||||||
|
function derivePostgreSQLSettingsFromEnvironment {
|
||||||
# Configure gpgsql env vars
|
# Configure gpgsql env vars
|
||||||
: "${PDNS_gpgsql_host:=pgsql}"
|
: "${PDNS_gpgsql_host:=pgsql}"
|
||||||
: "${PDNS_gpgsql_port:=5432}"
|
: "${PDNS_gpgsql_port:=5432}"
|
||||||
|
@ -16,29 +29,35 @@ if [ "${NODE_NAME:-}" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export PDNS_gpgsql_host PDNS_gpgsql_port PDNS_gpgsql_user PDNS_gpgsql_password PDNS_gpgsql_dbname
|
export PDNS_gpgsql_host PDNS_gpgsql_port PDNS_gpgsql_user PDNS_gpgsql_password PDNS_gpgsql_dbname
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
PGPASSWORD="${PDNS_gpgsql_password}"
|
|
||||||
export PGPASSWORD
|
function generatePostgreSQLCommand {
|
||||||
PGSQL_COMMAND="psql -h ${PDNS_gpgsql_host} -p ${PDNS_gpgsql_port} -U ${PDNS_gpgsql_user}"
|
PGSQL_COMMAND="psql -h ${PDNS_gpgsql_host} -p ${PDNS_gpgsql_port} -U ${PDNS_gpgsql_user}"
|
||||||
|
}
|
||||||
|
|
||||||
# Wait for pgsql to respond
|
function createDatabaseIfRequested {
|
||||||
until $PGSQL_COMMAND -c ';' ; do
|
|
||||||
>&2 echo 'Pgsql is unavailable - sleeping'
|
|
||||||
sleep 3
|
|
||||||
done
|
|
||||||
|
|
||||||
# Initialize DB if needed
|
# Initialize DB if needed
|
||||||
if [ "${SKIP_DB_CREATE:-false}" != 'true' ]; then
|
if [ "${SKIP_DB_CREATE:-false}" != 'true' ]; then
|
||||||
echo "SELECT 'CREATE DATABASE ${PDNS_gpgsql_dbname}' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '${PDNS_gpgsql_dbname}')\gexec" | $PGSQL_COMMAND
|
echo "SELECT 'CREATE DATABASE ${PDNS_gpgsql_dbname}' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '${PDNS_gpgsql_dbname}')\gexec" | $PGSQL_COMMAND
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function initDatabase {
|
||||||
|
if [ "${SKIP_DB_INIT:-false}" != 'true' ]; then
|
||||||
PGSQL_CHECK_IF_HAS_TABLE="SELECT COUNT(DISTINCT table_name) FROM information_schema.columns WHERE table_catalog = '${PDNS_gpgsql_dbname}' AND table_schema = 'public';"
|
PGSQL_CHECK_IF_HAS_TABLE="SELECT COUNT(DISTINCT table_name) FROM information_schema.columns WHERE table_catalog = '${PDNS_gpgsql_dbname}' AND table_schema = 'public';"
|
||||||
PGSQL_NUM_TABLE=$($PGSQL_COMMAND -At -d "$PDNS_gpgsql_dbname" -c "$PGSQL_CHECK_IF_HAS_TABLE")
|
PGSQL_NUM_TABLE=$($PGSQL_COMMAND -At -d "$PDNS_gpgsql_dbname" -c "$PGSQL_CHECK_IF_HAS_TABLE")
|
||||||
if [ "$PGSQL_NUM_TABLE" -eq 0 ]; then
|
if [ "$PGSQL_NUM_TABLE" -eq 0 ]; then
|
||||||
|
echo "Database exists and has no tables yet, doing init";
|
||||||
$PGSQL_COMMAND -d "$PDNS_gpgsql_dbname" < /usr/share/doc/pdns/schema.pgsql.sql
|
$PGSQL_COMMAND -d "$PDNS_gpgsql_dbname" < /usr/share/doc/pdns/schema.pgsql.sql
|
||||||
|
else
|
||||||
|
echo "Database exists but already has tables, will not try to init";
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function initSuperslave {
|
||||||
if [ "${PDNS_superslave:-no}" = 'yes' ]; then
|
if [ "${PDNS_superslave:-no}" = 'yes' ]; then
|
||||||
# Configure supermasters if needed
|
# Configure supermasters if needed
|
||||||
if [ "${SUPERMASTER_IPS:-}" ]; then
|
if [ "${SUPERMASTER_IPS:-}" ]; then
|
||||||
|
@ -61,10 +80,41 @@ if [ "${PDNS_superslave:-no}" = 'yes' ]; then
|
||||||
$PGSQL_COMMAND -d "$PDNS_gpgsql_dbname" -c "$PGSQL_INSERT_SUPERMASTERS"
|
$PGSQL_COMMAND -d "$PDNS_gpgsql_dbname" -c "$PGSQL_INSERT_SUPERMASTERS"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateAndInstallConfigFileFromEnvironment {
|
||||||
|
# Create config file from template
|
||||||
|
subvars --prefix 'PDNS_' < '/pdns.conf.tpl' > '/etc/pdns/pdns.conf'
|
||||||
|
}
|
||||||
|
###End of function definitions
|
||||||
|
|
||||||
|
if [ ${USE_EXISTING_CONFIG_FILE:-false} = 'true' ]; then
|
||||||
|
derivePostgreSQLSettingsFromExistingConfigFile
|
||||||
|
else
|
||||||
|
derivePostgreSQLSettingsFromEnvironment
|
||||||
|
fi
|
||||||
|
|
||||||
|
generatePostgreSQLCommand
|
||||||
|
|
||||||
|
PGPASSWORD="${PDNS_gpgsql_password}"
|
||||||
|
export PGPASSWORD
|
||||||
|
|
||||||
|
# Wait for pgsql to respond
|
||||||
|
until $PGSQL_COMMAND -c ';' ; do
|
||||||
|
>&2 echo 'Pgsql is unavailable - sleeping'
|
||||||
|
sleep 3
|
||||||
|
done
|
||||||
|
|
||||||
|
createDatabaseIfRequested
|
||||||
|
initDatabase
|
||||||
|
initSuperslave
|
||||||
|
|
||||||
|
if [ ${USE_EXISTING_CONFIG_FILE:-false} = 'false' ]; then
|
||||||
|
echo "(re-)generating config file from environment variables"
|
||||||
|
generateAndInstallConfigFileFromEnvironment
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
unset PGPASSWORD
|
unset PGPASSWORD
|
||||||
|
|
||||||
# Create config file from template
|
|
||||||
subvars --prefix 'PDNS_' < '/pdns.conf.tpl' > '/etc/pdns/pdns.conf'
|
|
||||||
|
|
||||||
exec "$@"
|
exec "$@"
|
||||||
|
|
|
@ -2,12 +2,17 @@
|
||||||
|
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
|
#### Function definitions
|
||||||
|
function deriveConfigValuesFromEnvrionement {
|
||||||
# Configure base vars
|
# Configure base vars
|
||||||
: "${PDNS_local_port:=53}"
|
: "${PDNS_local_port:=53}"
|
||||||
: "${PDNS_local_address:=0.0.0.0}"
|
: "${PDNS_local_address:=0.0.0.0}"
|
||||||
: "${PDNS_allow_from:=0.0.0.0/0}"
|
: "${PDNS_allow_from:=0.0.0.0/0}"
|
||||||
|
|
||||||
export PDNS_local_port PDNS_local_address PDNS_allow_from
|
export PDNS_local_port PDNS_local_address PDNS_allow_from
|
||||||
|
}
|
||||||
|
|
||||||
|
### end of function definitions
|
||||||
|
|
||||||
if [ -f /etc/fedora-release ]; then
|
if [ -f /etc/fedora-release ]; then
|
||||||
config_file=/etc/pdns-recursor/recursor.conf
|
config_file=/etc/pdns-recursor/recursor.conf
|
||||||
|
@ -17,10 +22,18 @@ elif [ -f /etc/alpine-release ]; then
|
||||||
pdns_user=recursor
|
pdns_user=recursor
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Create config file from template
|
if [ ${USE_EXISTING_CONFIG_FILE:-false} = 'false' ]; then
|
||||||
|
deriveConfigValuesFromEnvrionement
|
||||||
|
echo "generating config file from environment"
|
||||||
subvars --prefix 'PDNS_' < '/recursor.conf.tpl' > "${config_file}"
|
subvars --prefix 'PDNS_' < '/recursor.conf.tpl' > "${config_file}"
|
||||||
|
chown "${pdns_user}:" "${config_file}"
|
||||||
|
else
|
||||||
|
echo "using existing config file ${config_file}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create config file from template
|
||||||
|
|
||||||
# Fix config file ownership
|
# Fix config file ownership
|
||||||
chown "${pdns_user}:" "${config_file}"
|
|
||||||
|
|
||||||
exec "$@"
|
exec "$@"
|
||||||
|
|
Loading…
Reference in a new issue