#!/bin/bash # shellcheck disable=SC2034 ENV_FILE="/.env" CRON_CONFIG_FILE="${HOME}/crontabs" BACKUP_DIR="/backups/tmp" RESTORE_DIR="/restore" RESTORE_EXTRACT_DIR="/extract" ######################################## # Check file is exist. # Arguments: # file ######################################## function check_file_exist() { if [[ ! -f "$1" ]]; then echo "cannot access $1: No such file" exit 1 fi } ######################################## # Check directory is exist. # Arguments: # directory ######################################## function check_dir_exist() { if [[ ! -d "$1" ]]; then echo "cannot access $1: No such directory" exit 1 fi } ######################################## # Configure PostgreSQL password file. # Arguments: # None ######################################## # shellcheck disable=SC2153 function configure_postgresql() { echo "${POSTGRES_HOST}:${POSTGRES_PORT}:${POSTGRES_DB}:${POSTGRES_USER}:${POSTGRES_PASSWORD}" > ~/.pgpass chmod 0600 ~/.pgpass } ######################################## # Export variables from .env file. # Arguments: # None # Outputs: # variables with prefix 'DOTENV_' # Reference: # https://gist.github.com/judy2k/7656bfe3b322d669ef75364a46327836#gistcomment-3632918 ######################################## # shellcheck source=/dev/null function export_env_file() { if [[ -f "${ENV_FILE}" ]]; then echo "find \"${ENV_FILE}\" file and export variables" set -a source <(sed -e '/^#/d;/^\s*$/d' -e 's/\(\w*\)[ \t]*=[ \t]*\(.*\)/DOTENV_\1=\2/' "${ENV_FILE}") set +a fi } ######################################## # Get variables from # environment variables, # secret file in environment variables, # secret file in .env file, # environment variables in .env file. # Arguments: # variable name # Outputs: # variable value ######################################## function get_env() { local VAR="$1" local VAR_FILE="${VAR}_FILE" local VAR_DOTENV="DOTENV_${VAR}" local VAR_DOTENV_FILE="DOTENV_${VAR_FILE}" local VALUE="" if [[ -n "${!VAR:-}" ]]; then VALUE="${!VAR}" elif [[ -n "${!VAR_FILE:-}" ]]; then VALUE="$(cat "${!VAR_FILE}")" elif [[ -n "${!VAR_DOTENV_FILE:-}" ]]; then VALUE="$(cat "${!VAR_DOTENV_FILE}")" elif [[ -n "${!VAR_DOTENV:-}" ]]; then VALUE="${!VAR_DOTENV}" fi export "${VAR}=${VALUE}" } ######################################## # Initialization environment variables. # Arguments: # None # Outputs: # environment variables ######################################## function init_env() { # export export_env_file init_env_dir init_env_db # CRON get_env CRON CRON="${CRON:-"5 * * * *"}" # BACKUP_KEEP_DAYS get_env BACKUP_KEEP_DAYS BACKUP_KEEP_DAYS="${BACKUP_KEEP_DAYS:-"0"}" # BACKUP_FILE_DATE_FORMAT get_env BACKUP_FILE_SUFFIX get_env BACKUP_FILE_DATE get_env BACKUP_FILE_DATE_SUFFIX BACKUP_FILE_DATE="$(echo "${BACKUP_FILE_DATE:-"%Y%m%d"}${BACKUP_FILE_DATE_SUFFIX}" | sed 's/[^0-9a-zA-Z%_-]//g')" BACKUP_FILE_DATE_FORMAT="$(echo "${BACKUP_FILE_SUFFIX:-"${BACKUP_FILE_DATE}"}" | sed 's/\///g')" # HEALTHCHECK_FILE get_env HEALTHCHECK_FILE HEALTHCHECK_FILE="${HEALTHCHECK_FILE:-/app/health}" # TIMEZONE get_env TIMEZONE local TIMEZONE_MATCHED_COUNT TIMEZONE_MATCHED_COUNT=$(find "/usr/share/zoneinfo" -type f -iname "${TIMEZONE}" 2> /dev/null | wc -l) if [[ "${TIMEZONE_MATCHED_COUNT}" -ne 1 ]]; then TIMEZONE="UTC" fi echo "========================================" echo "DATA_DIR: ${DATA_DIR}" echo "DATA_CONFIG: ${DATA_CONFIG}" echo "DATA_RSAKEY: ${DATA_RSAKEY}" echo "DATA_ATTACHMENTS: ${DATA_ATTACHMENTS}" echo "DATA_SENDS: ${DATA_SENDS}" echo "========================================" echo "DB_URL: postgresql://${POSTGRES_USER}:***(${#POSTGRES_PASSWORD} Chars)@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}" echo "========================================" echo "CRON: ${CRON}" echo "BACKUP_FILE_DATE_FORMAT: ${BACKUP_FILE_DATE_FORMAT} (example \"[filename].$(date +"${BACKUP_FILE_DATE_FORMAT}").[ext]\")" echo "BACKUP_KEEP_DAYS: ${BACKUP_KEEP_DAYS}" echo "TIMEZONE: ${TIMEZONE}" echo HEALTHCHECK_FILE="${HEALTHCHECK_FILE:-$APP_DIR/health}" echo "========================================" } function init_env_dir() { # DATA_DIR get_env DATA_DIR DATA_DIR="${DATA_DIR:-"/data"}" check_dir_exist "${DATA_DIR}" # DATA_CONFIG DATA_CONFIG="${DATA_DIR}/config.json" # DATA_ATTACHMENTS get_env DATA_ATTACHMENTS DATA_ATTACHMENTS="$(dirname "${DATA_ATTACHMENTS:-"${DATA_DIR}/attachments"}/useless")" DATA_ATTACHMENTS_DIRNAME="$(dirname "${DATA_ATTACHMENTS}")" DATA_ATTACHMENTS_BASENAME="$(basename "${DATA_ATTACHMENTS}")" # DATA_SEND get_env DATA_SENDS DATA_SENDS="$(dirname "${DATA_SENDS:-"${DATA_DIR}/sends"}/useless")" DATA_SENDS_DIRNAME="$(dirname "${DATA_SENDS}")" DATA_SENDS_BASENAME="$(basename "${DATA_SENDS}")" } function init_env_db() { DB_TYPE="POSTGRESQL" # POSTGRES_HOST get_env POSTGRES_HOST # PG_PORT get_env POSTGRES_PORT POSTGRES_PORT="${POSTGRES_PORT:-"5432"}" # POSTGRES_DB get_env POSTGRES_DB POSTGRES_DB="${POSTGRES_DB:-"vaultwarden"}" # POSTGRES_USER get_env POSTGRES_USER POSTGRES_USER="${POSTGRES_USER:-"vaultwarden"}" # POSTGRES_PASSWORD get_env POSTGRES_PASSWORD }