#!/usr/bin/env bash set -eo pipefail ## Add -x to set if you want really explicit feedback. ## -u breaks unbound variables ## This docker-entrypoint will take a copy of the configuration and install any ## ENVVARS and then copy any required files into the /app/ directory next to any ## custom files added by the user. # default to run whatever the user wanted like "/bin/ash" ## If user runs no need to run any more of the entrypoint script. if [[ -z "$@" ]]; then echof info "User did not attempt input. Now executing docker-entrypoint." else echof info "Running $@." exec "$@" exit 1 fi ENVVARS=("MYSQL_ENV_MYSQL_USER" "MYSQL_ENV_MYSQL_PASSWORD" "MYSQL_ENV_MYSQL_DATABASE" "MYSQL_ENV_MYSQL_ADDRESS" "GOOGLE_ANALYTICS_UID" "SITE_TITLE" "SITE_ADDRESS" "SITE_DESCRIPTION" ) # MYSQL_ENV_MYSQL_USER=alphauser # MYSQL_ENV_MYSQL_PASSWORD=alphapassword # MYSQL_ENV_MYSQL_DATABASE=alphadatabase # MYSQL_ENV_MYSQL_ADDRESS=alphaaddress # GOOGLE_ANALYTICS_UID=alphauid # SITE_TITLE=AlphaTitle # SITE_ADDRESS=alpha.address.com SITE_DESCRIPTION=alpha.description ## There might be a better way to do this now I'm working on something for configuring things more magically. function set_conf() { case $1 in MYSQL_ENV_MYSQL_USER ) if [[ -z "$MYSQL_ENV_MYSQL_USER" ]]; then echof info "User did not attempt to configure $MYSQL_ENV_MYSQL_USER" else echof info "Configuring $MYSQL_ENV_MYSQL_USER." echof info "Setting '$MYSQL_ENV_MYSQL_USER' $MYSQL_ENV_MYSQL_USER in /app/config/mysqlConfig.json" sed -i 's/"username": "root"/"username": "'$MYSQL_ENV_MYSQL_USER'"/' /app/config/mysqlConfig.json fi ;; MYSQL_ENV_MYSQL_PASSWORD ) if [[ -z "$MYSQL_ENV_MYSQL_PASSWORD" ]]; then echof info "User did not attempt to configure $MYSQL_ENV_MYSQL_PASSWORD" else ## This echo should be sanitized of any secrets before this is finished. echof info "Setting '$MYSQL_ENV_MYSQL_PASSWORD' $MYSQL_ENV_MYSQL_PASSWORD in /app/config/mysqlConfig.json" sed -i 's/"password": ""/"password": "'$MYSQL_ENV_MYSQL_PASSWORD'"/' /app/config/mysqlConfig.json fi ;; MYSQL_ENV_MYSQL_DATABASE ) if [[ -z "$MYSQL_ENV_MYSQL_DATABASE" ]]; then echof info "User did not attempt to configure $MYSQL_ENV_MYSQL_DATABASE" else echof info "Setting '$MYSQL_ENV_MYSQL_DATABASE' $MYSQL_ENV_MYSQL_DATABASE in /app/config/mysqlConfig.json" sed -i 's/"database": "lbry"/"database": "'$MYSQL_ENV_MYSQL_DATABASE'"/' /app/config/mysqlConfig.json fi ;; MYSQL_SERVER_ADDRESS ) if [[ -z "$MYSQL_SERVER_ADDRESS" ]]; then echof info "User did not attempt to configure $MYSQL_SERVER_ADDRESS" else echof warn "This variable is not currently available." fi ;; SITE_ADDRESS ) if [[ -z "$SITE_ADDRESS" ]]; then echof info "User did not attempt to configure $SITE_ADDRESS" else echof info "Setting '$SITE_ADDRESS' $SITE_ADDRESS in /app/config/siteConfig.json" sed -i 's,"host": "https://www.example.com","host": "https://"$SITE_ADDRESS,' /app/config/siteConfig.json fi ;; GOOGLE_ANALYTICS_UID ) if [[ -z "$GOOGLE_ANALYTICS_UID" ]]; then echof info "User did not attempt to configure $GOOGLE_ANALYTICS_UID" else echof info "Setting '$GOOGLE_ANALYTICS_UID' $GOOGLE_ANALYTICS_UID in /app/config/siteConfig.json" sed -i 's/"googleId": null/"googleId": '$GOOGLE_ANALYTICS_UID'/' /app/config/siteConfig.json fi ;; SITE_TITLE ) if [[ -z "$SITE_TITLE" ]]; then echof info "User did not attempt to configure $SITE_TITLE" else echof info "Setting '$SITE_TITLE' $SITE_TITLE in /app/config/siteConfig.json" sed -i 's/"title": "My Site"/"title": "'$SITE_TITLE'"/' /app/config/siteConfig.json fi ;; SITE_DESCRIPTION ) if [[ -z "$SITE_DESCRIPTION" ]]; then echof info "User did not attempt to configure $SITE_DESCRIPTION" else echof info "Setting '$SITE_DESCRIPTION' $SITE_DESCRIPTION in /app/config/siteConfig.json" sed -i 's/"description": "A decentralized hosting platform built on LBRY"/"Description": "'$SITE_DESCRIPTION'"/' /app/config/siteConfig.json fi ;; esac } function configure_speech() { # install configuration changes here. echof info "Installing configuration files into /app/config/." mkdir -p /app/config/ cp /usr/local/src/spee.ch/cli/defaults/mysqlConfig.json /app/config/mysqlConfig.json cp /usr/local/src/spee.ch/cli/defaults/siteConfig.json /app/config/siteConfig.json echof info "Installing any environment variables that have been set." for i in "${ENVVARS[@]}"; do if [[ -z "$i" ]]; then echof info "$i was not set, moving on." else set_conf $i fi done } function final_permset() { # ## Finally reassert permissions in case there is user added drift. # rddo /app "test_for_dir" '775 "speech:speech"' # rfdo /app "test_for_file" '665 "speech:speech"' # ## Define any permission exceptions here. # # test_for_dir /app/config 775 "speech:speech" # # test_for_file /app/config/siteConfig.json 665 "speech:speech" echof info "Copied Spee.ch and set permissions" } ################################### ## Actual installation function. ## ################################### # if Spee.ch is not yet installed, copy it into web root. # This could be updated to be part of an upgrade mechanism. if [ "$(ls -A /app)" ]; then echof warn "/app is not Empty. It contains:" 1>&2 ls -A 1>&2 ## If siteConfig.json isn't installed add it and configure or ignore and proceed. if [ ! -e '/app/config/siteConfig.json' ]; then echof warn "Spee.ch doesn't appear to have a configuration." echof blank "Installing config" configure_speech else ## If the file exists skip configuration and proceed. echof info "Spee.ch config already installed skipping configuration step." final_permset fi ## Install all other files after installing siteConfig.json echof info "Making an attempt to nicely merge files using:" echof run "mv -fnu /usr/local/src/spee.ch/* /app/" mv -fnu /usr/local/src/spee.ch/* /app/ final_permset else echof info "Speech not installed, installing fresh copy now." configure_speech echof run "cp -r /usr/local/src/spee.ch/* /app/" cp -r /usr/local/src/spee.ch/* /app/ final_permset fi ## Superfluous permissions assertion maybe axe this later. # echof run 'test_for_dir /app/config/siteConfig.json 775 "speech:speech"' # test_for_file /app/config/siteConfig.json 775 "speech:speech"