2024-01-03 19:27:25 +01:00
#!/bin/sh
set -eu
2024-06-04 00:28:32 +02:00
##### Function definitions ####
derivePostgreSQLSettingsFromExistingConfigFile( ) {
2024-05-06 17:13:13 +02:00
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
2024-06-04 00:28:32 +02:00
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)
2024-05-06 17:13:13 +02:00
}
2024-06-04 00:28:32 +02:00
derivePostgreSQLSettingsFromEnvironment( ) {
2024-05-06 17:13:13 +02:00
# Configure gpgsql env vars
: " ${ PDNS_gpgsql_host : =pgsql } "
: " ${ PDNS_gpgsql_port : =5432 } "
: " ${ PDNS_gpgsql_user : = ${ PGSQL_ENV_POSTGRES_USER :- postgres } } "
: " ${ PDNS_gpgsql_password : = ${ PGSQL_ENV_POSTGRES_PASSWORD :- powerdns } } "
: " ${ PDNS_gpgsql_dbname : = ${ PGSQL_ENV_POSTGRES_DB :- powerdns } } "
2024-06-04 00:28:32 +02:00
2024-05-06 17:13:13 +02:00
# 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_gpgsql_dbname = " ${ PDNS_gpgsql_dbname } ${ NODE_NAME } "
fi
2024-06-04 00:28:32 +02:00
2024-05-06 17:13:13 +02:00
export PDNS_gpgsql_host PDNS_gpgsql_port PDNS_gpgsql_user PDNS_gpgsql_password PDNS_gpgsql_dbname
}
2024-06-04 00:28:32 +02:00
generatePostgreSQLCommand( ) {
2024-05-06 17:13:13 +02:00
PGSQL_COMMAND = " psql -h ${ PDNS_gpgsql_host } -p ${ PDNS_gpgsql_port } -U ${ PDNS_gpgsql_user } "
}
2024-06-04 00:28:32 +02:00
createDatabaseIfRequested( ) {
2024-05-06 17:13:13 +02:00
# Initialize DB if needed
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
fi
}
2024-06-04 00:28:32 +02:00
initDatabase( ) {
2024-05-06 17:13:13 +02:00
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_NUM_TABLE = $( $PGSQL_COMMAND -At -d " $PDNS_gpgsql_dbname " -c " $PGSQL_CHECK_IF_HAS_TABLE " )
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
else
echo "Database exists but already has tables, will not try to init" ;
fi
2024-06-04 00:28:32 +02:00
fi
2024-05-06 17:13:13 +02:00
}
2024-01-03 19:27:25 +01:00
2024-06-04 00:28:32 +02:00
initSuperslave( ) {
if [ " ${ PDNS_autosecondary :- no } " = 'yes' ] || [ " ${ PDNS_superslave :- no } " = 'yes' ] ; then
2024-05-06 17:13:13 +02:00
# Configure supermasters if needed
if [ " ${ SUPERMASTER_IPS :- } " ] ; then
$PGSQL_COMMAND -d " $PDNS_gpgsql_dbname " -c 'TRUNCATE supermasters;'
PGSQL_INSERT_SUPERMASTERS = ''
if [ " ${ SUPERMASTER_COUNT :- 0 } " -eq 0 ] ; then
SUPERMASTER_COUNT = 10
fi
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 }' )
if [ -z " ${ SUPERMASTER_HOST :- } " ] ; then
SUPERMASTER_HOST = $( hostname -f)
fi
if [ " ${ SUPERMASTER_IP :- } " ] ; then
PGSQL_INSERT_SUPERMASTERS = " ${ PGSQL_INSERT_SUPERMASTERS } INSERT INTO supermasters VALUES(' ${ SUPERMASTER_IP } ', ' ${ SUPERMASTER_HOST } ', 'admin'); "
fi
i = $(( i + 1 ))
done
$PGSQL_COMMAND -d " $PDNS_gpgsql_dbname " -c " $PGSQL_INSERT_SUPERMASTERS "
fi
fi
}
2024-01-03 19:27:25 +01:00
2024-06-04 00:28:32 +02:00
generateAndInstallConfigFileFromEnvironment( ) {
2024-05-06 17:13:13 +02:00
# Create config file from template
subvars --prefix 'PDNS_' < '/pdns.conf.tpl' > '/etc/pdns/pdns.conf'
}
2024-06-04 00:28:32 +02:00
#### End of function definitions, let's get to work ...
if [ " ${ USE_EXISTING_CONFIG_FILE :- false } " = 'true' ] ; then
2024-05-06 17:13:13 +02:00
derivePostgreSQLSettingsFromExistingConfigFile
else
derivePostgreSQLSettingsFromEnvironment
fi
generatePostgreSQLCommand
2024-01-03 19:27:25 +01:00
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
2024-05-06 17:13:13 +02:00
createDatabaseIfRequested
initDatabase
initSuperslave
2024-01-03 19:27:25 +01:00
2024-06-04 00:28:32 +02:00
if [ " ${ USE_EXISTING_CONFIG_FILE :- false } " = 'false' ] ; then
2024-05-06 17:13:13 +02:00
echo "(re-)generating config file from environment variables"
generateAndInstallConfigFileFromEnvironment
2024-01-03 19:27:25 +01:00
fi
unset PGPASSWORD
exec " $@ "