#!/bin/sh set -e echoerr() { printf "%s\n" "$*" >&2; } file_env() { local var="" local fileVar="" eval var="\$${1}" eval fileVar="\$${1}_FILE" local def="${2:-}" if [ -n "${var:-}" ] && [ -n "${fileVar:-}" ]; then echo >&2 "error: both ${1} and ${1}_FILE are set (but are exclusive)" exit 1 fi local val="$def" if [ -n "${var:-}" ]; then val="${var}" elif [ -n "${fileVar:-}" ]; then val="$(cat "${fileVar}")" fi export "${1}"="$val" unset "${1}_FILE" } SEMAPHORE_CONFIG_PATH="${SEMAPHORE_CONFIG_PATH:-/etc/semaphore}" SEMAPHORE_TMP_PATH="${SEMAPHORE_TMP_PATH:-/tmp/semaphore}" # Semaphore database env config SEMAPHORE_DB_DIALECT="${SEMAPHORE_DB_DIALECT:-mysql}" SEMAPHORE_DB_HOST="${SEMAPHORE_DB_HOST:-0.0.0.0}" SEMAPHORE_DB_PATH="${SEMAPHORE_DB_PATH:-/var/lib/semaphore}" SEMAPHORE_DB_PORT="${SEMAPHORE_DB_PORT:-}" SEMAPHORE_DB="${SEMAPHORE_DB:-semaphore}" file_env 'SEMAPHORE_DB_USER' 'semaphore' file_env 'SEMAPHORE_DB_PASS' 'semaphore' # Email alert env config SEMAPHORE_WEB_ROOT="${SEMAPHORE_WEB_ROOT:-}" # Semaphore Admin env config file_env 'SEMAPHORE_ADMIN' 'admin' SEMAPHORE_ADMIN_EMAIL="${SEMAPHORE_ADMIN_EMAIL:-admin@localhost}" SEMAPHORE_ADMIN_NAME="${SEMAPHORE_ADMIN_NAME:-Semaphore Admin}" file_env 'SEMAPHORE_ADMIN_PASSWORD' 'semaphorepassword' #Semaphore LDAP env config SEMAPHORE_LDAP_ACTIVATED="${SEMAPHORE_LDAP_ACTIVATED:-no}" SEMAPHORE_LDAP_HOST="${SEMAPHORE_LDAP_HOST:-}" SEMAPHORE_LDAP_PORT="${SEMAPHORE_LDAP_PORT:-}" SEMAPHORE_LDAP_NEEDTLS="${SEMAPHORE_LDAP_NEEDTLS:-no}" SEMAPHORE_LDAP_DN_BIND="${SEMAPHORE_LDAP_DN_BIND:-}" file_env 'SEMAPHORE_LDAP_PASSWORD' SEMAPHORE_LDAP_DN_SEARCH="${SEMAPHORE_LDAP_DN_SEARCH:-}" SEMAPHORE_LDAP_SEARCH_FILTER="${SEMAPHORE_LDAP_SEARCH_FILTER:-(uid=%s)}" SEMAPHORE_LDAP_MAPPING_DN="${SEMAPHORE_LDAP_MAPPING_DN:-dn}" SEMAPHORE_LDAP_MAPPING_USERNAME="${SEMAPHORE_LDAP_MAPPING_USERNAME:-uid}" SEMAPHORE_LDAP_MAPPING_FULLNAME="${SEMAPHORE_LDAP_MAPPING_FULLNAME:-cn}" SEMAPHORE_LDAP_MAPPING_EMAIL="${SEMAPHORE_LDAP_MAPPING_EMAIL:-mail}" file_env 'SEMAPHORE_ACCESS_KEY_ENCRYPTION' [ -d "${SEMAPHORE_TMP_PATH}" ] || mkdir -p "${SEMAPHORE_TMP_PATH}" || { echo "Can't create Semaphore tmp path ${SEMAPHORE_TMP_PATH}." exit 1 } [ -d "${SEMAPHORE_CONFIG_PATH}" ] || mkdir -p "${SEMAPHORE_CONFIG_PATH}" || { echo "Can't create Semaphore Config path ${SEMAPHORE_CONFIG_PATH}." exit 1 } [ -d "${SEMAPHORE_DB_PATH}" ] || mkdir -p "${SEMAPHORE_DB_PATH}" || { echo "Can't create data path ${SEMAPHORE_DB_PATH}." exit 1 } # wait on db to be up if [ "${SEMAPHORE_DB_DIALECT}" != 'bolt' ]; then echoerr "Attempting to connect to database ${SEMAPHORE_DB} on ${SEMAPHORE_DB_HOST}:${SEMAPHORE_DB_PORT} with user ${SEMAPHORE_DB_USER} ..." TIMEOUT=30 while ! $(nc -z "$SEMAPHORE_DB_HOST" "$SEMAPHORE_DB_PORT") >/dev/null 2>&1; do TIMEOUT=$(expr $TIMEOUT - 1) if [ $TIMEOUT -eq 0 ]; then echoerr "Could not connect to database server. Exiting." exit 1 fi echo -n "." sleep 1 done fi if [ -n "${SEMAPHORE_DB_PORT}" ]; then SEMAPHORE_DB_HOST="${SEMAPHORE_DB_HOST}:${SEMAPHORE_DB_PORT}" fi case ${SEMAPHORE_DB_DIALECT} in mysql) SEMAPHORE_DB_DIALECT_ID=1;; bolt) SEMAPHORE_DB_DIALECT_ID=2;; postgres) SEMAPHORE_DB_DIALECT_ID=3;; *) echoerr "Unknown database dialect: ${SEMAPHORE_DB_DIALECT}" exit 1 ;; esac # Create a config if it does not exist in the current config path if [ ! -f "${SEMAPHORE_CONFIG_PATH}/config.json" ]; then echoerr "Generating ${SEMAPHORE_TMP_PATH}/config.stdin ..." cat << EOF > "${SEMAPHORE_TMP_PATH}/config.stdin" ${SEMAPHORE_DB_DIALECT_ID} EOF if [ "${SEMAPHORE_DB_DIALECT}" = "bolt" ]; then cat << EOF >> "${SEMAPHORE_TMP_PATH}/config.stdin" ${SEMAPHORE_DB_PATH}/database.boltdb EOF else cat << EOF >> "${SEMAPHORE_TMP_PATH}/config.stdin" ${SEMAPHORE_DB_HOST} ${SEMAPHORE_DB_USER} ${SEMAPHORE_DB_PASS} ${SEMAPHORE_DB} EOF fi cat << EOF >> "${SEMAPHORE_TMP_PATH}/config.stdin" ${SEMAPHORE_TMP_PATH} ${SEMAPHORE_WEB_ROOT} ${SEMAPHORE_EMAIL_ALERT} EOF if [ "${SEMAPHORE_EMAIL_ALERT}" = "yes" ]; then cat << EOF >> "${SEMAPHORE_TMP_PATH}/config.stdin" ${SEMAPHORE_EMAIL_HOST} 25 ${SEMAPHORE_EMAIL_SENDER} EOF fi cat << EOF >> "${SEMAPHORE_TMP_PATH}/config.stdin" no no no no ${SEMAPHORE_LDAP_ACTIVATED} EOF if [ "${SEMAPHORE_LDAP_ACTIVATED}" = "yes" ]; then cat << EOF >> "${SEMAPHORE_TMP_PATH}/config.stdin" ${SEMAPHORE_LDAP_HOST}:${SEMAPHORE_LDAP_PORT} ${SEMAPHORE_LDAP_NEEDTLS} ${SEMAPHORE_LDAP_DN_BIND} ${SEMAPHORE_LDAP_PASSWORD} ${SEMAPHORE_LDAP_DN_SEARCH} ${SEMAPHORE_LDAP_SEARCH_FILTER} ${SEMAPHORE_LDAP_MAPPING_DN} ${SEMAPHORE_LDAP_MAPPING_USERNAME} ${SEMAPHORE_LDAP_MAPPING_FULLNAME} ${SEMAPHORE_LDAP_MAPPING_EMAIL} EOF fi; cat << EOF >> "${SEMAPHORE_TMP_PATH}/config.stdin" ${SEMAPHORE_CONFIG_PATH} ${SEMAPHORE_ADMIN} ${SEMAPHORE_ADMIN_EMAIL} ${SEMAPHORE_ADMIN_NAME} ${SEMAPHORE_ADMIN_PASSWORD} EOF cat "${SEMAPHORE_TMP_PATH}/config.stdin" $1 setup - < "${SEMAPHORE_TMP_PATH}/config.stdin" echoerr "Run Semaphore with semaphore server --config ${SEMAPHORE_CONFIG_PATH}/config.json" fi # run our command exec "$@"