2017-12-11 14:18:53 +01:00
#!/bin/sh
2016-09-02 22:48:20 +02:00
2023-12-19 23:12:51 +01:00
set -eu
2016-09-02 22:48:20 +02:00
2024-05-06 17:13:13 +02:00
##### 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
: " ${ PDNS_gmysql_host : = ${ MYSQL_ENV_MYSQL_HOST :- mysql } } "
: " ${ PDNS_gmysql_port : = ${ MYSQL_ENV_MYSQL_PORT :- 3306 } } "
: " ${ PDNS_gmysql_user : = ${ MYSQL_ENV_MYSQL_USER :- root } } "
if [ " ${ PDNS_gmysql_user } " = 'root' ] ; then
: " ${ PDNS_gmysql_password : = ${ MYSQL_ENV_MYSQL_ROOT_PASSWORD :- } } "
fi
: " ${ PDNS_gmysql_password : = ${ MYSQL_ENV_MYSQL_PASSWORD :- powerdns } } "
: " ${ PDNS_gmysql_dbname : = ${ MYSQL_ENV_MYSQL_DATABASE :- powerdns } } "
# Use first part of node name as database name suffix
if [ " ${ NODE_NAME :- } " ] ; then
NODE_NAME = $( echo " ${ NODE_NAME } " | sed -e 's/\..*//' -e 's/-//' )
PDNS_gmysql_dbname = " ${ PDNS_gmysql_dbname } ${ NODE_NAME } "
fi
export PDNS_gmysql_host PDNS_gmysql_port PDNS_gmysql_user PDNS_gmysql_password PDNS_gmysql_dbname
}
function generateMySQLCommand {
EXTRA = ''
# Password Auth
if [ " ${ PDNS_gmysql_password } " ] ; then
EXTRA = " ${ EXTRA } -p ${ PDNS_gmysql_password } "
fi
# Allow socket connections
if [ " ${ PDNS_gmysql_socket :- } " ] ; then
export PDNS_gmysql_host = 'localhost'
EXTRA = " ${ EXTRA } --socket= ${ PDNS_gmysql_socket } "
fi
MYSQL_COMMAND = " mysql -h ${ PDNS_gmysql_host } -P ${ PDNS_gmysql_port } -u ${ PDNS_gmysql_user } ${ EXTRA } "
}
function createDatabaseIfRequested {
# Initialize DB if needed
if [ " ${ SKIP_DB_CREATE :- false } " != 'true' ] ; then
$MYSQL_COMMAND -e " CREATE DATABASE IF NOT EXISTS ${ PDNS_gmysql_dbname } "
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_NUM_TABLE = $( $MYSQL_COMMAND --batch --skip-column-names -e " $MYSQL_CHECK_IF_HAS_TABLE " )
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
else
echo "Database exists but already has tables, will not try to init" ;
fi
fi
}
function migrateDatabaseTo47 {
# 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_NUM_TABLE = $( $MYSQL_COMMAND --batch --skip-column-names -e " $MYSQL_CHECK_IF_47 " )
if [ " $MYSQL_NUM_TABLE " -eq 0 ] ; then
2023-01-16 14:10:39 +01:00
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
2024-05-06 17:13:13 +02:00
fi
}
2023-01-16 14:10:39 +01:00
2024-05-06 17:13:13 +02:00
function initSuperslave {
2023-12-19 23:12:51 +01:00
if [ " ${ PDNS_superslave :- no } " = 'yes' ] ; then
2020-03-29 19:01:11 +02:00
# Configure supermasters if needed
if [ " ${ SUPERMASTER_IPS :- } " ] ; then
2023-12-19 23:12:51 +01:00
$MYSQL_COMMAND -D " $PDNS_gmysql_dbname " -e 'TRUNCATE supermasters;'
2020-03-29 19:01:11 +02:00
MYSQL_INSERT_SUPERMASTERS = ''
2023-12-19 23:12:51 +01:00
if [ " ${ SUPERMASTER_COUNT :- 0 } " -eq 0 ] ; then
2020-03-29 19:01:11 +02:00
SUPERMASTER_COUNT = 10
fi
2023-12-19 23:12:51 +01:00
i = 1; while [ $i -le " ${ SUPERMASTER_COUNT } " ] ; do
SUPERMASTER_HOST = $( echo " ${ SUPERMASTER_HOSTS :- } " | awk -v col = " $i " '{ print $col }' )
SUPERMASTER_IP = $( echo " ${ SUPERMASTER_IPS } " | awk -v col = " $i " '{ print $col }' )
2020-03-29 19:01:11 +02:00
if [ -z " ${ SUPERMASTER_HOST :- } " ] ; then
SUPERMASTER_HOST = $( hostname -f)
fi
if [ " ${ SUPERMASTER_IP :- } " ] ; then
MYSQL_INSERT_SUPERMASTERS = " ${ MYSQL_INSERT_SUPERMASTERS } INSERT INTO supermasters VALUES(' ${ SUPERMASTER_IP } ', ' ${ SUPERMASTER_HOST } ', 'admin'); "
fi
i = $(( i + 1 ))
done
$MYSQL_COMMAND -D " $PDNS_gmysql_dbname " -e " $MYSQL_INSERT_SUPERMASTERS "
fi
2016-09-02 22:48:20 +02:00
fi
2024-05-06 17:13:13 +02:00
}
function generateAndInstallConfigFileFromEnvironment {
# Create config file from template
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
2016-09-02 22:48:20 +02:00
2024-05-06 17:13:13 +02:00
createDatabaseIfRequested
initDatabase
migrateDatabaseTo47
initSuperslave
if [ ${ USE_EXISTING_CONFIG_FILE :- false } = 'false' ] ; then
echo "(re-)generating config file from environment variables"
generateAndInstallConfigFileFromEnvironment
fi
2020-03-29 19:01:11 +02:00
2018-11-22 19:45:43 +01:00
exec " $@ "
2024-05-06 17:13:13 +02:00