mirror of
https://github.com/dockersrc/scripts
synced 2026-01-10 14:09:52 -05:00
🦈🏠🐜❗ Initial Commit ❗🐜🦈🏠
This commit is contained in:
404
init/update/00-golang.sh
Executable file
404
init/update/00-golang.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing golang - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="golang"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/golang" # set etc directory
|
||||
CONF_DIR="/config/golang" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/golang" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_GOLANG:-/data/db/golang}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="golang" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${GOLANG_USER_NAME:-}" # normal user name
|
||||
root_user_name="${GOLANG_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${GOLANG_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${GOLANG_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/golang.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/golang.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
405
init/update/00-jellyfin.sh
Executable file
405
init/update/00-jellyfin.sh
Executable file
@@ -0,0 +1,405 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing jellyfin - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="jellyfin"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/jellyfin" # set etc directory
|
||||
CONF_DIR="/config/jellyfin" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/jellyfin" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_JELLYFIN:-/data/db/jellyfin}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="jellyfin" # command to execute
|
||||
EXEC_CMD_ARGS="--datadir --cachedir $DATA_DIR/cache " # command arguments
|
||||
EXEC_CMD_ARGS+="--ffmpeg /usr/lib/jellyfin-ffmpeg/ffmpeg" #
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${JELLYFIN_USER_NAME:-}" # normal user name
|
||||
root_user_name="${JELLYFIN_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${JELLYFIN_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${JELLYFIN_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/jellyfin.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/jellyfin.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-lenpaste.sh
Executable file
404
init/update/00-lenpaste.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing lenpaste - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="lenpaste"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/lenpaste" # set etc directory
|
||||
CONF_DIR="/config/lenpaste" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/lenpaste" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_LENPASTE:-/data/db/lenpaste}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="lenpaste" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${LENPASTE_USER_NAME:-}" # normal user name
|
||||
root_user_name="${LENPASTE_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${LENPASTE_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${LENPASTE_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/lenpaste.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/lenpaste.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-lighttpd.sh
Executable file
404
init/update/00-lighttpd.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing lighttpd - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="lighttpd"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/lighttpd" # set etc directory
|
||||
CONF_DIR="/config/lighttpd" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/lighttpd" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_LIGHTTPD:-/data/db/lighttpd}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="lighttpd" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${LIGHTTPD_USER_NAME:-}" # normal user name
|
||||
root_user_name="${LIGHTTPD_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${LIGHTTPD_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${LIGHTTPD_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/lighttpd.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/lighttpd.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-link-warden.sh
Executable file
404
init/update/00-link-warden.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing link-warden - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="link-warden"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/link-warden" # set etc directory
|
||||
CONF_DIR="/config/link-warden" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/link-warden" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_LINK_WARDEN:-/data/db/link-warden}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="link-warden" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${LINK_WARDEN_USER_NAME:-}" # normal user name
|
||||
root_user_name="${LINK_WARDEN_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${LINK_WARDEN_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${LINK_WARDEN_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/link-warden.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/link-warden.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-memos.sh
Executable file
404
init/update/00-memos.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing memos - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="memos"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/memos" # set etc directory
|
||||
CONF_DIR="/config/memos" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/memos" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_MEMOS:-/data/db/memos}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="memos" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${MEMOS_USER_NAME:-}" # normal user name
|
||||
root_user_name="${MEMOS_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${MEMOS_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${MEMOS_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/memos.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/memos.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-mpd.sh
Executable file
404
init/update/00-mpd.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing mpd - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="mpd"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/mpd" # set etc directory
|
||||
CONF_DIR="/config/mpd" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/mpd" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_MPD:-/data/db/mpd}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="mpd" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${MPD_USER_NAME:-}" # normal user name
|
||||
root_user_name="${MPD_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${MPD_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${MPD_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/mpd.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/mpd.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-navidrome.sh
Executable file
404
init/update/00-navidrome.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing navidrome - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="navidrome"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/navidrome" # set etc directory
|
||||
CONF_DIR="/config/navidrome" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/navidrome" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_NAVIDROME:-/data/db/navidrome}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="navidrome" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${NAVIDROME_USER_NAME:-}" # normal user name
|
||||
root_user_name="${NAVIDROME_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${NAVIDROME_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${NAVIDROME_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/navidrome.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/navidrome.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-neovim.sh
Executable file
404
init/update/00-neovim.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing neovim - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="neovim"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/neovim" # set etc directory
|
||||
CONF_DIR="/config/neovim" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/neovim" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_NEOVIM:-/data/db/neovim}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="neovim" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${NEOVIM_USER_NAME:-}" # normal user name
|
||||
root_user_name="${NEOVIM_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${NEOVIM_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${NEOVIM_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/neovim.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/neovim.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-nextcloud.sh
Executable file
404
init/update/00-nextcloud.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing nextcloud - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="nextcloud"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/nextcloud" # set etc directory
|
||||
CONF_DIR="/config/nextcloud" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/nextcloud" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_NEXTCLOUD:-/data/db/nextcloud}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="nextcloud" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${NEXTCLOUD_USER_NAME:-}" # normal user name
|
||||
root_user_name="${NEXTCLOUD_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${NEXTCLOUD_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${NEXTCLOUD_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/nextcloud.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/nextcloud.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
408
init/update/00-nginx.sh
Executable file
408
init/update/00-nginx.sh
Executable file
@@ -0,0 +1,408 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing nginx - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="nginx"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/nginx" # set etc directory
|
||||
CONF_DIR="/config/nginx" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/nginx" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_NGINX:-/data/db/nginx}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT="80"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="nginx" # command to execute
|
||||
EXEC_CMD_ARGS="-c /etc/nginx/nginx.conf" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="yes"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${NGINX_USER_NAME:-}" # normal user name
|
||||
root_user_name="${NGINX_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${NGINX_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${NGINX_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/nginx.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
if [ "$SSL_ENABLED" = "true" ]; then
|
||||
[ -f "$CONF_DIR/nginx.ssl.conf" ] && __file_copy "$CONF_DIR/nginx.ssl.conf" "$ETC_DIR/nginx.conf"
|
||||
[ -f "$CONF_DIR/vhosts.d/default.ssl.conf" ] && __file_copy "$CONF_DIR/vhosts.d/default.ssl.conf" "$ETC_DIR/vhosts.d/default.conf"
|
||||
fi
|
||||
# replace variables
|
||||
__replace "REPLACE_SERVER_DIR" "$WWW_DIR" "$ETC_DIR/vhosts.d/default.conf"
|
||||
__replace "REPLACE_SERVER_PORT" "${SERVICE_PORT:-80}" "$ETC_DIR/nginx.conf"
|
||||
__replace "REPLACE_SERVER_PORT" "${SERVICE_PORT:-80}" "$ETC_DIR/vhosts.d/default.conf"
|
||||
__replace "REPLACE_SERVER_NAME" "${SERVER_NAME:-$HOSTNAME}" "$ETC_DIR/nginx.conf"
|
||||
__replace "REPLACE_SERVER_NAME" "${SERVER_NAME:-$HOSTNAME}" "$ETC_DIR/vhosts.d/default.conf"
|
||||
[ -f "$WWW_DIR/index.php" ] && __replace "REPLACE_SERVER_SOFTWARE" "nginx" "$WWW_DIR/index.php"
|
||||
[ -f "$WWW_DIR/index.html" ] && __replace "REPLACE_SERVER_SOFTWARE" "nginx" "$WWW_DIR/index.html"
|
||||
# custom commands
|
||||
[ -f "$ETC_DIR/nginx.ssl.conf" ] && rm -Rf "$ETC_DIR/nginx.ssl.conf"
|
||||
[ -f "$ETC_DIR/vhosts.d/default.ssl.conf" ] && rm -Rf "$ETC_DIR/vhosts.d/default.ssl.conf"
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-nodejs.sh
Executable file
404
init/update/00-nodejs.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing nodejs - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="nodejs"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/nodejs" # set etc directory
|
||||
CONF_DIR="/config/nodejs" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/nodejs" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_NODEJS:-/data/db/nodejs}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="nodejs" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${NODEJS_USER_NAME:-}" # normal user name
|
||||
root_user_name="${NODEJS_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${NODEJS_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${NODEJS_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/nodejs.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/nodejs.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-opencv.sh
Executable file
404
init/update/00-opencv.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing opencv - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="opencv"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/opencv" # set etc directory
|
||||
CONF_DIR="/config/opencv" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/opencv" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_OPENCV:-/data/db/opencv}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="opencv" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${OPENCV_USER_NAME:-}" # normal user name
|
||||
root_user_name="${OPENCV_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${OPENCV_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${OPENCV_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/opencv.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/opencv.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-php.sh
Executable file
404
init/update/00-php.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing php - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="php"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/php" # set etc directory
|
||||
CONF_DIR="/config/php" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/php" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_PHP:-/data/db/php}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="php" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${PHP_USER_NAME:-}" # normal user name
|
||||
root_user_name="${PHP_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${PHP_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${PHP_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/php.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/php.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-podman.sh
Executable file
404
init/update/00-podman.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing podman - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="podman"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/podman" # set etc directory
|
||||
CONF_DIR="/config/podman" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/podman" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_PODMAN:-/data/db/podman}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="podman" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${PODMAN_USER_NAME:-}" # normal user name
|
||||
root_user_name="${PODMAN_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${PODMAN_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${PODMAN_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/podman.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/podman.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-postgres.sh
Executable file
404
init/update/00-postgres.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing postgres - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="postgres"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/postgres" # set etc directory
|
||||
CONF_DIR="/config/postgres" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/postgres" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_POSTGRES:-/data/db/postgres}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="postgres" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${POSTGRES_USER_NAME:-}" # normal user name
|
||||
root_user_name="${POSTGRES_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${POSTGRES_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${POSTGRES_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/postgres.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/postgres.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-proftpd.sh
Executable file
404
init/update/00-proftpd.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing proftpd - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="proftpd"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/proftpd" # set etc directory
|
||||
CONF_DIR="/config/proftpd" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/proftpd" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_PROFTPD:-/data/db/proftpd}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="proftpd" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${PROFTPD_USER_NAME:-}" # normal user name
|
||||
root_user_name="${PROFTPD_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${PROFTPD_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${PROFTPD_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/proftpd.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/proftpd.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-readme-to-dockerhub.sh
Executable file
404
init/update/00-readme-to-dockerhub.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing readme-to-dockerhub - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="readme-to-dockerhub"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/readme-to-dockerhub" # set etc directory
|
||||
CONF_DIR="/config/readme-to-dockerhub" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/readme-to-dockerhub" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_README_TO_DOCKERHUB:-/data/db/readme-to-dockerhub}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="readme-to-dockerhub" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${README_TO_DOCKERHUB_USER_NAME:-}" # normal user name
|
||||
root_user_name="${README_TO_DOCKERHUB_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${README_TO_DOCKERHUB_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${README_TO_DOCKERHUB_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/readme-to-dockerhub.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/readme-to-dockerhub.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-redis.sh
Executable file
404
init/update/00-redis.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing redis - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="redis"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/redis" # set etc directory
|
||||
CONF_DIR="/config/redis" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/redis" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_REDIS:-/data/db/redis}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="redis" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${REDIS_USER_NAME:-}" # normal user name
|
||||
root_user_name="${REDIS_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${REDIS_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${REDIS_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/redis.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/redis.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-registry-web.sh
Executable file
404
init/update/00-registry-web.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing registry-web - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="registry-web"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/registry-web" # set etc directory
|
||||
CONF_DIR="/config/registry-web" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/registry-web" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_REGISTRY_WEB:-/data/db/registry-web}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="registry-web" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${REGISTRY_WEB_USER_NAME:-}" # normal user name
|
||||
root_user_name="${REGISTRY_WEB_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${REGISTRY_WEB_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${REGISTRY_WEB_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/registry-web.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/registry-web.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-registry.sh
Executable file
404
init/update/00-registry.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing registry - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="registry"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/registry" # set etc directory
|
||||
CONF_DIR="/config/registry" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/registry" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_REGISTRY:-/data/db/registry}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="registry" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${REGISTRY_USER_NAME:-}" # normal user name
|
||||
root_user_name="${REGISTRY_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${REGISTRY_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${REGISTRY_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/registry.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/registry.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-soft-serve.sh
Executable file
404
init/update/00-soft-serve.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing soft-serve - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="soft-serve"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/soft-serve" # set etc directory
|
||||
CONF_DIR="/config/soft-serve" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/soft-serve" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_SOFT_SERVE:-/data/db/soft-serve}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="soft-serve" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${SOFT_SERVE_USER_NAME:-}" # normal user name
|
||||
root_user_name="${SOFT_SERVE_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${SOFT_SERVE_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${SOFT_SERVE_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/soft-serve.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/soft-serve.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-sqlite3.sh
Executable file
404
init/update/00-sqlite3.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing sqlite3 - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="sqlite3"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/sqlite3" # set etc directory
|
||||
CONF_DIR="/config/sqlite3" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/sqlite3" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_SQLITE3:-/data/db/sqlite3}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="sqlite3" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${SQLITE3_USER_NAME:-}" # normal user name
|
||||
root_user_name="${SQLITE3_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${SQLITE3_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${SQLITE3_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/sqlite3.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/sqlite3.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-squidguard.sh
Executable file
404
init/update/00-squidguard.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing squidguard - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="squidguard"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/squidguard" # set etc directory
|
||||
CONF_DIR="/config/squidguard" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/squidguard" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_SQUIDGUARD:-/data/db/squidguard}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="squidguard" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${SQUIDGUARD_USER_NAME:-}" # normal user name
|
||||
root_user_name="${SQUIDGUARD_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${SQUIDGUARD_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${SQUIDGUARD_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/squidguard.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/squidguard.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-ssl-ca.sh
Executable file
404
init/update/00-ssl-ca.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing ssl-ca - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="ssl-ca"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/ssl-ca" # set etc directory
|
||||
CONF_DIR="/config/ssl-ca" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/ssl-ca" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_SSL_CA:-/data/db/ssl-ca}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="ssl-ca" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${SSL_CA_USER_NAME:-}" # normal user name
|
||||
root_user_name="${SSL_CA_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${SSL_CA_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${SSL_CA_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/ssl-ca.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/ssl-ca.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-supabase.sh
Executable file
404
init/update/00-supabase.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing supabase - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="supabase"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/supabase" # set etc directory
|
||||
CONF_DIR="/config/supabase" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/supabase" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_SUPABASE:-/data/db/supabase}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="supabase" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${SUPABASE_USER_NAME:-}" # normal user name
|
||||
root_user_name="${SUPABASE_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${SUPABASE_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${SUPABASE_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/supabase.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/supabase.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-system-scripts.sh
Executable file
404
init/update/00-system-scripts.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing system-scripts - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="system-scripts"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/system-scripts" # set etc directory
|
||||
CONF_DIR="/config/system-scripts" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/system-scripts" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_SYSTEM_SCRIPTS:-/data/db/system-scripts}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="system-scripts" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${SYSTEM_SCRIPTS_USER_NAME:-}" # normal user name
|
||||
root_user_name="${SYSTEM_SCRIPTS_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${SYSTEM_SCRIPTS_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${SYSTEM_SCRIPTS_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/system-scripts.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/system-scripts.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-tftpd.sh
Executable file
404
init/update/00-tftpd.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing tftpd - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="tftpd"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/tftpd" # set etc directory
|
||||
CONF_DIR="/config/tftpd" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/tftpd" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_TFTPD:-/data/db/tftpd}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="tftpd" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${TFTPD_USER_NAME:-}" # normal user name
|
||||
root_user_name="${TFTPD_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${TFTPD_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${TFTPD_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/tftpd.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/tftpd.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-theHarvester.sh
Executable file
404
init/update/00-theHarvester.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing theHarvester - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="theHarvester"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/theHarvester" # set etc directory
|
||||
CONF_DIR="/config/theHarvester" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/theHarvester" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_THEHARVESTER:-/data/db/theHarvester}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="theHarvester" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${THEHARVESTER_USER_NAME:-}" # normal user name
|
||||
root_user_name="${THEHARVESTER_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${THEHARVESTER_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${THEHARVESTER_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/theHarvester.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/theHarvester.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-tor-browser.sh
Executable file
404
init/update/00-tor-browser.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing tor-browser - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="tor-browser"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/tor-browser" # set etc directory
|
||||
CONF_DIR="/config/tor-browser" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/tor-browser" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_TOR_BROWSER:-/data/db/tor-browser}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="tor-browser" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${TOR_BROWSER_USER_NAME:-}" # normal user name
|
||||
root_user_name="${TOR_BROWSER_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${TOR_BROWSER_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${TOR_BROWSER_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/tor-browser.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/tor-browser.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-tor.sh
Executable file
404
init/update/00-tor.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing tor - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="tor"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/tor" # set etc directory
|
||||
CONF_DIR="/config/tor" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/tor" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_TOR:-/data/db/tor}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="tor" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${TOR_USER_NAME:-}" # normal user name
|
||||
root_user_name="${TOR_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${TOR_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${TOR_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/tor.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/tor.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-traefik.sh
Executable file
404
init/update/00-traefik.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing traefik - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="traefik"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/traefik" # set etc directory
|
||||
CONF_DIR="/config/traefik" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/traefik" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_TRAEFIK:-/data/db/traefik}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="traefik" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${TRAEFIK_USER_NAME:-}" # normal user name
|
||||
root_user_name="${TRAEFIK_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${TRAEFIK_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${TRAEFIK_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/traefik.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/traefik.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-transmission.sh
Executable file
404
init/update/00-transmission.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing transmission - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="transmission"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/transmission" # set etc directory
|
||||
CONF_DIR="/config/transmission" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/transmission" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_TRANSMISSION:-/data/db/transmission}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="transmission" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${TRANSMISSION_USER_NAME:-}" # normal user name
|
||||
root_user_name="${TRANSMISSION_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${TRANSMISSION_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${TRANSMISSION_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/transmission.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/transmission.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-vaultwarden.sh
Executable file
404
init/update/00-vaultwarden.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing vaultwarden - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="vaultwarden"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/vaultwarden" # set etc directory
|
||||
CONF_DIR="/config/vaultwarden" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/vaultwarden" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_VAULTWARDEN:-/data/db/vaultwarden}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="vaultwarden" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${VAULTWARDEN_USER_NAME:-}" # normal user name
|
||||
root_user_name="${VAULTWARDEN_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${VAULTWARDEN_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${VAULTWARDEN_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/vaultwarden.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/vaultwarden.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-vim.sh
Executable file
404
init/update/00-vim.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing vim - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="vim"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/vim" # set etc directory
|
||||
CONF_DIR="/config/vim" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/vim" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_VIM:-/data/db/vim}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="vim" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${VIM_USER_NAME:-}" # normal user name
|
||||
root_user_name="${VIM_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${VIM_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${VIM_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/vim.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/vim.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-wordpress.sh
Executable file
404
init/update/00-wordpress.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing wordpress - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="wordpress"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/wordpress" # set etc directory
|
||||
CONF_DIR="/config/wordpress" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/wordpress" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_WORDPRESS:-/data/db/wordpress}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="wordpress" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${WORDPRESS_USER_NAME:-}" # normal user name
|
||||
root_user_name="${WORDPRESS_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${WORDPRESS_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${WORDPRESS_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/wordpress.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/wordpress.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-wttr.sh
Executable file
404
init/update/00-wttr.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing wttr - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="wttr"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/wttr" # set etc directory
|
||||
CONF_DIR="/config/wttr" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/wttr" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_WTTR:-/data/db/wttr}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="wttr" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${WTTR_USER_NAME:-}" # normal user name
|
||||
root_user_name="${WTTR_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${WTTR_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${WTTR_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/wttr.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/wttr.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-xfce4.sh
Executable file
404
init/update/00-xfce4.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing xfce4 - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="xfce4"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/xfce4" # set etc directory
|
||||
CONF_DIR="/config/xfce4" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/xfce4" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_XFCE4:-/data/db/xfce4}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="xfce4" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${XFCE4_USER_NAME:-}" # normal user name
|
||||
root_user_name="${XFCE4_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${XFCE4_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${XFCE4_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/xfce4.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/xfce4.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-ympd.sh
Executable file
404
init/update/00-ympd.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing ympd - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="ympd"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/ympd" # set etc directory
|
||||
CONF_DIR="/config/ympd" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/ympd" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_YMPD:-/data/db/ympd}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="ympd" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${YMPD_USER_NAME:-}" # normal user name
|
||||
root_user_name="${YMPD_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${YMPD_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${YMPD_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/ympd.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/ympd.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
404
init/update/00-youtube-dl.sh
Executable file
404
init/update/00-youtube-dl.sh
Executable file
@@ -0,0 +1,404 @@
|
||||
#!/usr/bin/env bash
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
[ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
printf '%s\n' "# - - - Initializing youtube-dl - - - #"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_NAME="youtube-dl"
|
||||
SCRIPT_NAME="$(basename "$0" 2>/dev/null)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
export PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run trap command on exit
|
||||
trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "true" ] && [ -f "$SERVICE_PID_FILE" ] && rm -Rf "$SERVICE_PID_FILE";exit $retVal' SIGINT SIGTERM EXIT
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import the functions file
|
||||
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then
|
||||
. "/usr/local/etc/docker/functions/entrypoint.sh"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# import variables
|
||||
for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do
|
||||
[ -f "$set_env" ] && . "$set_env"
|
||||
done
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Custom functions
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Show message before execute
|
||||
PRE_EXEC_MESSAGE=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default predefined variables
|
||||
WORKDIR="" # set working directory
|
||||
DATA_DIR="/data" # set data directory
|
||||
WWW_DIR="/data/htdocs/www" # set the web root
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ETC_DIR="/etc/youtube-dl" # set etc directory
|
||||
CONF_DIR="/config/youtube-dl" # set config directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RUN_DIR="/run/init.d" # set scripts pid dir
|
||||
LOG_DIR="/data/logs/youtube-dl" # set log directory
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ROOT_FILE_PREFIX="/config/secure/auth/root" # directory to save username/password for root user
|
||||
USER_FILE_PREFIX="/config/secure/auth/user" # directory to save username/password for normal user
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set the database directory
|
||||
DATABASE_DIR="${DATABASE_DIR_YOUTUBE_DL:-/data/db/youtube-dl}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional predefined variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# port which service is listening on
|
||||
SERVICE_PORT=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# execute command variables
|
||||
SERVICE_UID="0" # set the user id
|
||||
SERVICE_USER="root" # execute command as another user
|
||||
EXEC_CMD_BIN="youtube-dl" # command to execute
|
||||
EXEC_CMD_ARGS="" # command arguments
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a web server
|
||||
IS_WEB_SERVER="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Is this service a database server
|
||||
IS_DATABASE_SERVICE="no"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional variables
|
||||
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# usernames
|
||||
user_name="${YOUTUBE_DL_USER_NAME:-}" # normal user name
|
||||
root_user_name="${YOUTUBE_DL_ROOT_USER_NAME:-}" # root user name
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# passwords [password/random]
|
||||
user_pass="${YOUTUBE_DL_USER_PASS_WORD:-}" # normal user password
|
||||
root_user_pass="${YOUTUBE_DL_ROOT_PASS_WORD:-}" # root user password
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Overwrite variables from files
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_name" ] && user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" ] && root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")"
|
||||
[ -f "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" ] && root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Specifiy custom directories to be created
|
||||
ADD_APPLICATION_FILES=""
|
||||
ADD_APPLICATION_DIRS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
APPLICATION_FILES="$LOG_DIR/youtube-dl.log"
|
||||
APPLICATION_DIRS="$RUN_DIR $ETC_DIR $CONF_DIR $LOG_DIR"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__update_conf_files() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
|
||||
# delete files
|
||||
#__rm ""
|
||||
|
||||
# define actions
|
||||
|
||||
# create default directories
|
||||
for filedirs in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then
|
||||
(
|
||||
echo "Creating directory $filedirs with permissions 777"
|
||||
mkdir -p "$filedirs" && chmod -Rf 777 "$filedirs"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create default files
|
||||
for application_files in $ADD_APPLICATION_FILES $APPLICATION_FILES; do
|
||||
if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then
|
||||
(
|
||||
echo "Creating file $application_files with permissions 777"
|
||||
touch "$application_files" && chmod -Rf 777 "$application_files"
|
||||
) |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
# create directories if variable is yes"
|
||||
[ "$IS_WEB_SERVER" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $WWW_DIR" && { [ -d "$WWW_DIR" ] || { (echo "Creating directory $WWW_DIR with permissions 777" && mkdir -p "$WWW_DIR" && chmod -f 777 "$WWW_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
[ "$IS_DATABASE_SERVICE" = "yes" ] && APPLICATION_DIRS="$APPLICATION_DIRS $DATABASE_DIR" && { [ -d "$DATABASE_DIR" ] || { (echo "Creating directory $DATABASE_DIR with permissions 777" && mkdir -p "$DATABASE_DIR" && chmod -f 777 "$DATABASE_DIR") |& tee -a "$LOG_DIR/init.txt" &>/dev/null; }; }
|
||||
# copy config files to system
|
||||
__file_copy "$CONF_DIR/." "$ETC_DIR/" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
# replace variables
|
||||
# __replace "" "" "$CONF_DIR/youtube-dl.conf"
|
||||
# replace variables recursively
|
||||
# __find_replace "" "" "$CONF_DIR/"
|
||||
# custom commands
|
||||
|
||||
# other
|
||||
|
||||
# unset unneeded variables
|
||||
unset application_files filedirs
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run before executing
|
||||
__pre_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
# define commands
|
||||
|
||||
# execute if directories is empty
|
||||
#__is_dir_empty "" &&
|
||||
|
||||
# create user if needed
|
||||
# __create_service_user "$user" "/home/$user" "${USER_GID:-${USER_UID:-1000}"
|
||||
# set user on files/folders
|
||||
if [ -n "$user" ] && [ "$user" != "root" ]; then
|
||||
if grep -s -q "$user:" "/etc/passwd"; then
|
||||
for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do
|
||||
if [ -n "$permissions" ] && [ -e "$permissions" ]; then
|
||||
(chown -Rf $user:$user "$permissions" && echo "changed ownership on $permissions to $user") |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# unset unneeded variables
|
||||
unset filesperms filename
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# function to run after executing
|
||||
__post_execute() {
|
||||
local exitCode=0 # default exit code
|
||||
local user="${SERVICE_USER:-root}" # specifiy different user
|
||||
sleep 60 # how long to wait before executing
|
||||
echo "Running post commands" # message
|
||||
# execute commands
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to update config files - IE: change port
|
||||
__pre_message() {
|
||||
local exitCode=0
|
||||
[ -n "$user_name" ] && echo "username: $user_name" && echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$user_pass" ] && echo "password: saved to ${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
[ -n "$root_user_name" ] && echo "root username: $root_user_name" && echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"
|
||||
[ -n "$root_user_pass" ] && echo "root password: saved to ${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" && echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# use this function to setup ssl support
|
||||
__update_ssl_conf() {
|
||||
local exitCode=0
|
||||
|
||||
return $exitCode
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__create_env() {
|
||||
cat <<EOF | tee "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
|
||||
# ENV_WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
# ENV_WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
# ENV_ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
# ENV_DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
# ENV_CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
# ENV_DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
# ENV_SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
# ENV_SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
# ENV_SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
# EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
# EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
# EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
# ENV_USER_NAME="${user_name:-$ENV_USER_NAME}" #
|
||||
# ENV_USER_PASS="${user_pass:-$ENV_USER_PASS}" #
|
||||
# ENV_ROOT_USER_NAME="${root_user_name:-$ENV_ROOT_USER_NAME}" #
|
||||
# ENV_ROOT_USER_PASS="${root_user_pass:-$ENV_ROOT_USER_PASS}" #
|
||||
|
||||
EOF
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] || return 1
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# script to start server
|
||||
__run_start_script() {
|
||||
local user="${SERVICE_USER:-root}"
|
||||
local workdir="${WORKDIR:-$WORK_DIR}"
|
||||
local cmd="$EXEC_CMD_BIN $EXEC_CMD_ARGS"
|
||||
local lc_type="${LC_ALL:-${LC_CTYPE:-$LANG}}"
|
||||
local home="${workdir//\/root/\/tmp\/docker}"
|
||||
local path="/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
if [ -z "$EXEC_CMD_BIN" ]; then
|
||||
__post_execute 2>"/dev/stderr" |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
echo "Initializing $SCRIPT_NAME has completed"
|
||||
else
|
||||
# ensure the command exists
|
||||
if [ ! -x "$EXEC_CMD_BIN" ]; then
|
||||
echo "$EXEC_CMD_NAME is not a valid executable"
|
||||
exit 2
|
||||
fi
|
||||
# set working directories
|
||||
[ -z "$home" ] && home="${workdir:-/tmp/docker}"
|
||||
[ "$home" = "/root" ] && home="/tmp/docker"
|
||||
[ "$home" = "$workdir" ] && workdir=""
|
||||
# create needed directories
|
||||
[ -n "$home" ] && { [ -d "$home" ] || mkdir -p "$home"; }
|
||||
[ -n "$workdir" ] && { [ -d "$workdir" ] || mkdir -p "$workdir" || workdir="/tmp"; }
|
||||
[ -n "$workdir" ] && __cd "$workdir" || { [ -n "$home" ] && __cd "$home"; } || __cd "/tmp"
|
||||
[ "$user" != "root " ] && [ -d "$home" ] && chmod -f 777 "$home"
|
||||
[ "$user" != "root " ] && [ -d "$workdir" ] && chmod -f 777 "$workdir"
|
||||
# check and exit if already running
|
||||
if __proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"; then
|
||||
echo "$EXEC_CMD_NAME is already running" >&2
|
||||
exit 0
|
||||
else
|
||||
echo "Starting service: $EXEC_CMD_NAME $EXEC_CMD_ARGS"
|
||||
su_cmd touch "$SERVICE_PID_FILE"
|
||||
__post_execute 2>"/dev/stderr" 2>&1 |& tee -a "$LOG_DIR/init.txt" &>/dev/null &
|
||||
su_cmd env -i HOME="$home" LC_CTYPE="$lc_type" PATH="$path" USER="$user" sh -c "$cmd" || return 10
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# username and password actions
|
||||
__run_secure_function() {
|
||||
if [ -n "$user_name" ] || [ -n "$user_pass" ]; then
|
||||
for filesperms in "${USER_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then
|
||||
for filesperms in "${ROOT_FILE_PREFIX}"/*; do
|
||||
if [ -e "$filesperms" ]; then
|
||||
chmod -Rf 600 "$filesperms"
|
||||
chown -Rf root:root "$filesperms"
|
||||
fi
|
||||
done |& tee -a "$LOG_DIR/init.txt" &>/dev/null
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# simple cd function
|
||||
__cd() { mkdir -p "$1" && builtin cd "$1" || exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# process check functions
|
||||
__pcheck() { [ -n "$(type -P pgrep 2>/dev/null)" ] && pgrep -x "$1" &>/dev/null && return 0 || return 10; }
|
||||
__pgrep() { __pcheck "${1:-$EXEC_CMD_BIN}" || __ps aux 2>/dev/null | grep -Fw " ${1:-$EXEC_CMD_BIN}" | grep -qv ' grep' | grep '^' && return 0 || return 10; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# check if process is already running
|
||||
__proc_check() {
|
||||
cmd_bin="$(type -P "${1:-$EXEC_CMD_BIN}")"
|
||||
cmd_name="$(basename "${cmd_bin:-$EXEC_CMD_NAME}")"
|
||||
if __pgrep "$cmd_bin" || __pgrep "$cmd_name"; then
|
||||
SERVICE_IS_RUNNING="true"
|
||||
touch "$SERVICE_PID_FILE"
|
||||
echo "$cmd_name is already running"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow ENV_ variable - Import env file
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SERVICE_EXIT_CODE=0 # default exit code
|
||||
WORKDIR="${ENV_WORKDIR:-$WORKDIR}" # change to directory
|
||||
WWW_DIR="${ENV_WWW_DIR:-$WWW_DIR}" # set default web dir
|
||||
ETC_DIR="${ENV_ETC_DIR:-$ETC_DIR}" # set default etc dir
|
||||
DATA_DIR="${ENV_DATA_DIR:-$DATA_DIR}" # set default data dir
|
||||
CONF_DIR="${ENV_CONF_DIR:-$CONF_DIR}" # set default config dir
|
||||
DATABASE_DIR="${ENV_DATABASE_DIR:-$DATABASE_DIR}" # set database dir
|
||||
SERVICE_USER="${ENV_SERVICE_USER:-$SERVICE_USER}" # execute command as another user
|
||||
SERVICE_UID="${ENV_SERVICE_UID:-$SERVICE_UID}" # set the user id
|
||||
SERVICE_PORT="${ENV_SERVICE_PORT:-$SERVICE_PORT}" # port which service is listening on
|
||||
PRE_EXEC_MESSAGE="${ENV_PRE_EXEC_MESSAGE:-$PRE_EXEC_MESSAGE}" # Show message before execute
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# application specific
|
||||
EXEC_CMD_BIN="${ENV_EXEC_CMD_BIN:-$EXEC_CMD_BIN}" # command to execute
|
||||
EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN" || echo "$EXEC_CMD_BIN")" # set full path
|
||||
EXEC_CMD_NAME="$(basename "$EXEC_CMD_BIN")" # set the binary name
|
||||
SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" # set the pid file location
|
||||
EXEC_CMD_ARGS="${ENV_EXEC_CMD_ARGS:-$EXEC_CMD_ARGS}" # command arguments
|
||||
SERVICE_PID_NUMBER="$(__pgrep)" # check if running
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# create auth directories
|
||||
[ -n "$USER_FILE_PREFIX" ] && { [ -d "$USER_FILE_PREFIX" ] || mkdir -p "$USER_FILE_PREFIX"; }
|
||||
[ -n "$ROOT_FILE_PREFIX" ] && { [ -d "$ROOT_FILE_PREFIX" ] || mkdir -p "$ROOT_FILE_PREFIX"; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow per init script usernames and passwords
|
||||
[ -f "$ETC_DIR/auth/user/name" ] && user_name="$(<"$ETC_DIR/auth/user/name")"
|
||||
[ -f "$ETC_DIR/auth/user/pass" ] && user_pass="$(<"$ETC_DIR/auth/user/pass")"
|
||||
[ -f "$ETC_DIR/auth/root/name" ] && root_user_name="$(<"$ETC_DIR/auth/root/name")"
|
||||
[ -f "$ETC_DIR/auth/root/pass" ] && root_user_pass="$(<"$ETC_DIR/auth/root/pass")"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow setting initial users and passwords via environment
|
||||
user_name="${user_name:-$ENV_USER_NAME}"
|
||||
user_pass="${user_pass:-$ENV_USER_PASS}"
|
||||
root_user_name="${root_user_name:-$ENV_ROOT_USER_NAME}"
|
||||
root_user_pass="${root_user_pass:-$ENV_ROOT_USER_PASS}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set password to random if variable is random
|
||||
if [ "$user_pass" = "random" ]; then
|
||||
user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ "$root_user_pass" = "random" ]; then
|
||||
root_user_pass="$(__random_password)"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Allow variables via imports - Overwrite existing
|
||||
[ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ] && . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Only run check
|
||||
if [ "$1" = "check" ]; then
|
||||
__proc_check "$EXEC_CMD_NAME" || __proc_check "$EXEC_CMD_BIN"
|
||||
exit $?
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show message if env exists
|
||||
if [ -n "$EXEC_CMD_BIN" ]; then
|
||||
[ -n "$SERVICE_USER" ] && echo "Setting up service to run as $SERVICE_USER" || SERVICE_USER="root"
|
||||
[ -n "$SERVICE_PORT" ] && echo "${EXEC_CMD_NAME:-$EXEC_CMD_BIN} will be running on $SERVICE_PORT" || SERVICE_PORT=""
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# set switch user command
|
||||
if [ "$SERVICE_USER" = "root" ] || [ -z "$SERVICE_USER" ]; then
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
elif [ "$(builtin type -P gosu)" ]; then
|
||||
su_cmd() { gosu $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P runuser)" ]; then
|
||||
su_cmd() { runuser -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P sudo)" ]; then
|
||||
su_cmd() { sudo -u $SERVICE_USER "$@" || return 1; }
|
||||
elif [ "$(builtin type -P su)" ]; then
|
||||
su_cmd() { su -s /bin/sh - $SERVICE_USER -c "$@" || return 1; }
|
||||
else
|
||||
echo "Can not switch to $SERVICE_USER: attempting to run as root"
|
||||
su_cmd() { eval "$*" || return 1; }
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Change to working directory
|
||||
[ -n "$WORKDIR" ] && [ -n "$EXEC_CMD_BIN" ] && __cd "$WORKDIR" && echo "Changed to $PWD"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# show init message
|
||||
__pre_message
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Initialize ssl
|
||||
__update_ssl_conf
|
||||
__update_ssl_certs
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Updating config files
|
||||
__create_env
|
||||
__update_conf_files
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# run the pre execute commands
|
||||
[ -n "$PRE_EXEC_MESSAGE" ] && echo "$PRE_EXEC_MESSAGE"
|
||||
__pre_execute
|
||||
__run_secure_function
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
__run_start_script "$@" |& tee -a "/data/logs/entrypoint.log" &>/dev/null
|
||||
if [ "$?" -ne 0 ] && [ -n "$EXEC_CMD_BIN" ]; then
|
||||
echo "Failed to execute: $EXEC_CMD_BIN $EXEC_CMD_ARGS" |& tee -a "/data/logs/entrypoint.log" "$LOG_DIR/init.txt"
|
||||
SERVICE_EXIT_CODE=10
|
||||
SERVICE_IS_RUNNING="false"
|
||||
rm -Rf "$SERVICE_PID_FILE"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
exit $SERVICE_EXIT_CODE
|
||||
Reference in New Issue
Block a user