#!/bin/bash set -e ${DEBUG:+-x} function copy_and_export() { dest_dir=$OPT_DIR/_pg_ssl_certs mkdir -p $dest_dir local src_path=$1 if [[ -f "$src_path" ]]; then src_filename=$(basename -- $src_path) cp $src_path $dest_dir/ chmod 600 $dest_dir/$src_filename echo "$dest_dir/$src_filename" fi } function save_and_export() { local key=$1 local value=$2 export "$key"="$value" echo "export $1=$2" >>"$OPT_DIR"/config_env } function postgres_ssl_setup() { # workaround to deal with immutable k8s secrets if [[ ${POSTGRE_SSL_MODE:-} == 'verify-ca' || ${POSTGRE_SSL_MODE:-} == 'verify-full' ]]; then if [[ -z ${POSTGRE_SSLROOTCERT:-} ]]; then echo >&3 "=>POSTGRE_SSLROOTCERT is required" exit 1 else save_and_export PGSSLMODE "$POSTGRE_SSL_MODE" save_and_export PGSSLROOTCERT "$(copy_and_export $POSTGRE_SSLROOTCERT)" fi if [[ ${POSTGRE_SSL_MODE:-} == 'verify-full' ]]; then if [[ -z ${POSTGRE_SSLCERT:-} || -z ${POSTGRE_SSLKEY:-} ]]; then echo >&3 "=> One of required variables POSTGRE_SSLCERT or POSTGRE_SSLKEY were not set" exit 1 fi fi if [[ -n ${POSTGRE_SSLCERT:-} ]]; then save_and_export PGSSLCERT "$(copy_and_export $POSTGRE_SSLCERT)" fi if [[ -n ${POSTGRE_SSLKEY:-} ]]; then save_and_export PGSSLKEY "$(copy_and_export $POSTGRE_SSLKEY)" fi elif [[ ${POSTGRE_SSL_MODE:-} == 'disable' || ${POSTGRE_SSL_MODE:-} == 'allow' || ${POSTGRE_SSL_MODE:-} == 'prefer' || ${POSTGRE_SSL_MODE:-} == 'require' ]]; then save_and_export PGSSLMODE "$POSTGRE_SSL_MODE" fi } function postgres_ready(){ python3 << END import sys import os import psycopg try: conn = psycopg.connect(dbname=os.getenv('POSTGRE_NAME', 'root'), user=os.getenv('POSTGRE_USER'), password=os.getenv('POSTGRE_PASSWORD'), host=os.getenv('POSTGRE_HOST'), port=os.getenv('POSTGRE_PORT'), sslmode=os.getenv('PGSSLMODE'), sslrootcert=os.getenv('PGSSLROOTCERT'), sslcert=os.getenv('PGSSLCERT'), sslkey=os.getenv('PGSSLKEY')) except psycopg.OperationalError as e: print(e) sys.exit(-1) sys.exit(0) END } if [[ -n "${POSTGRE_HOST:-}" ]]; then postgres_ssl_setup echo >&3 "=> Waiting for postgres..." until postgres_ready; do echo >&3 "==> Postgres is unavailable - sleeping..." sleep 1 done echo >&3 "=> Postgres is up." elif [ -n "${MYSQL_HOST:-}" ]; then echo >&3 "=> Waiting for MySQL..." while ! mysqladmin ping -h"$MYSQL_HOST" -P"${MYSQL_PORT:-3306}" --silent; do echo >&3 "==> MySQL is unavailable - sleeping..." sleep 1 done echo >&3 "=> MySQL is up." else echo >&3 "=> Skipping wait for database." fi