101 lines
3.1 KiB
Bash
Executable File
101 lines
3.1 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
# usage: file_env VAR [DEFAULT]
|
|
# ie: file_env 'XYZ_DB_PASSWORD' 'example'
|
|
# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
|
|
# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)
|
|
# source: https://github.com/docker-library/mariadb/blob/master/docker-entrypoint.sh
|
|
file_env() {
|
|
local var="$1"
|
|
local fileVar="${var}_FILE"
|
|
local def="${2:-}"
|
|
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
|
echo "Both $var and $fileVar are set (but are exclusive)"
|
|
exit 1
|
|
fi
|
|
local val="$def"
|
|
if [ "${!var:-}" ]; then
|
|
val="${!var}"
|
|
elif [ "${!fileVar:-}" ]; then
|
|
val="$(< "${!fileVar}")"
|
|
fi
|
|
export "$var"="$val"
|
|
unset "$fileVar"
|
|
}
|
|
|
|
# Loads various settings that are used elsewhere in the script
|
|
docker_setup_env() {
|
|
# Initialize values that might be stored in a file
|
|
|
|
file_env 'MYSQL_AUTOCONF' $MYSQL_DEFAULT_AUTOCONF
|
|
file_env 'MYSQL_HOST' $MYSQL_DEFAULT_HOST
|
|
file_env 'MYSQL_DNSSEC' 'no'
|
|
file_env 'MYSQL_DB' $MYSQL_DEFAULT_DB
|
|
file_env 'MYSQL_PASS' $MYSQL_DEFAULT_PASS
|
|
file_env 'MYSQL_USER' $MYSQL_DEFAULT_USER
|
|
file_env 'MYSQL_PORT' $MYSQL_DEFAULT_PORT
|
|
}
|
|
|
|
docker_setup_env
|
|
|
|
# --help, --version
|
|
[ "$1" = "--help" ] || [ "$1" = "--version" ] && exec pdns_server $1
|
|
# treat everything except -- as exec cmd
|
|
[ "${1:0:2}" != "--" ] && exec "$@"
|
|
|
|
if $MYSQL_AUTOCONF ; then
|
|
# Set MySQL Credentials in pdns.conf
|
|
sed -r -i "s/^[# ]*gmysql-host=.*/gmysql-host=${MYSQL_HOST}/g" /etc/pdns/pdns.conf
|
|
sed -r -i "s/^[# ]*gmysql-port=.*/gmysql-port=${MYSQL_PORT}/g" /etc/pdns/pdns.conf
|
|
sed -r -i "s/^[# ]*gmysql-user=.*/gmysql-user=${MYSQL_USER}/g" /etc/pdns/pdns.conf
|
|
sed -r -i "s/^[# ]*gmysql-password=.*/gmysql-password=${MYSQL_PASS}/g" /etc/pdns/pdns.conf
|
|
sed -r -i "s/^[# ]*gmysql-dbname=.*/gmysql-dbname=${MYSQL_DB}/g" /etc/pdns/pdns.conf
|
|
sed -r -i "s/^[# ]*gmysql-dnssec=.*/gmysql-dnssec=${MYSQL_DNSSEC}/g" /etc/pdns/pdns.conf
|
|
|
|
MYSQLCMD="mysql --host=${MYSQL_HOST} --user=${MYSQL_USER} --password=${MYSQL_PASS} --port=${MYSQL_PORT} -r -N"
|
|
|
|
# wait for Database come ready
|
|
isDBup () {
|
|
echo "SHOW STATUS" | $MYSQLCMD 1>/dev/null
|
|
echo $?
|
|
}
|
|
|
|
RETRY=10
|
|
until [ `isDBup` -eq 0 ] || [ $RETRY -le 0 ] ; do
|
|
echo "Waiting for database to come up"
|
|
sleep 5
|
|
RETRY=$(expr $RETRY - 1)
|
|
done
|
|
if [ $RETRY -le 0 ]; then
|
|
>&2 echo Error: Could not connect to Database on $MYSQL_HOST:$MYSQL_PORT
|
|
exit 1
|
|
fi
|
|
|
|
# init database if necessary
|
|
echo "CREATE DATABASE IF NOT EXISTS $MYSQL_DB;" | $MYSQLCMD
|
|
MYSQLCMD="$MYSQLCMD $MYSQL_DB"
|
|
|
|
if [ "$(echo "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = \"$MYSQL_DB\";" | $MYSQLCMD)" -le 1 ]; then
|
|
echo Initializing Database
|
|
cat /etc/pdns/schema.sql | $MYSQLCMD
|
|
|
|
# Run custom mysql post-init sql scripts
|
|
if [ -d "/etc/pdns/mysql-postinit" ]; then
|
|
for SQLFILE in $(ls -1 /etc/pdns/mysql-postinit/*.sql | sort) ; do
|
|
echo Source $SQLFILE
|
|
cat $SQLFILE | $MYSQLCMD
|
|
done
|
|
fi
|
|
fi
|
|
|
|
unset -v MYSQL_PASS
|
|
fi
|
|
|
|
# Run pdns server
|
|
trap "pdns_control quit" SIGHUP SIGINT SIGTERM
|
|
|
|
pdns_server "$@" &
|
|
|
|
wait
|