From 8ff2573fbc594d9fa39b7dd953941d3dfb8e5c16 Mon Sep 17 00:00:00 2001 From: casjay Date: Fri, 5 Sep 2025 22:14:48 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=97=83=EF=B8=8F=20Committing=20everything?= =?UTF-8?q?=20that=20changed=20=F0=9F=97=83=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dockerfile rootfs/usr/local/etc/docker/functions/entrypoint.sh --- Dockerfile | 2 +- .../local/etc/docker/functions/entrypoint.sh | 558 ++++++++++++------ 2 files changed, 388 insertions(+), 172 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6b839fb..454ad8e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -118,7 +118,7 @@ RUN echo "Updating system files "; \ pip_bin="$(command -v python3 2>/dev/null || command -v python2 2>/dev/null || command -v python 2>/dev/null || true)"; \ py_version="$(command $pip_bin --version | sed 's|[pP]ython ||g' | awk -F '.' '{print $1$2}' | grep '[0-9]' || true)"; \ [ "$py_version" -gt "310" ] && pip_opts="--break-system-packages " || pip_opts=""; \ - if [ -n "$pip_bin" ];then $pip_bin -m pip install certbot-dns-rfc2136 certbot-dns-duckdns certbot-dns-cloudflare certbot-nginx $pip_opts || true;fi; \ + if [ -n "$pip_bin" ];then $pip_bin -m pip install --break-system-packages certbot-dns-rfc2136 certbot-dns-duckdns certbot-dns-cloudflare certbot-nginx $pip_opts || true;fi; \ [ -f "/usr/share/zoneinfo/${TZ}" ] && ln -sf "/usr/share/zoneinfo/${TZ}" "/etc/localtime" || true; \ [ -n "$PHP_BIN" ] && [ -z "$(command -v php 2>/dev/null)" ] && ln -sf "$PHP_BIN" "/usr/bin/php" 2>/dev/null || true; \ [ -n "$PHP_FPM" ] && [ -z "$(command -v php-fpm 2>/dev/null)" ] && ln -sf "$PHP_FPM" "/usr/bin/php-fpm" 2>/dev/null || true; \ diff --git a/rootfs/usr/local/etc/docker/functions/entrypoint.sh b/rootfs/usr/local/etc/docker/functions/entrypoint.sh index 42869b8..59e6999 100644 --- a/rootfs/usr/local/etc/docker/functions/entrypoint.sh +++ b/rootfs/usr/local/etc/docker/functions/entrypoint.sh @@ -22,9 +22,9 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # setup debugging - https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html [ -f "/config/.debug" ] && [ -z "$DEBUGGER_OPTIONS" ] && export DEBUGGER_OPTIONS="$(<"/config/.debug")" || DEBUGGER_OPTIONS="${DEBUGGER_OPTIONS:-}" -{ [ "$DEBUGGER" = "on" ] || [ -f "/config/.debug" ]; } && echo "Enabling debugging" && set -xo pipefail -x$DEBUGGER_OPTIONS && export -o pipefail +{ [ "$DEBUGGER" = "on" ] || [ -f "/config/.debug" ]; } && echo "Enabling debugging" && set -xo pipefail -x$DEBUGGER_OPTIONS && export DEBUGGER="on" || set -o pipefail # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -__remove_extra_spaces() { sed 's/\( \)*/␁/g;s|^ ||g'; } +__remove_extra_spaces() { sed 's/\( \)*/\1/g;s|^ ||g'; } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __printf_space() { local pad=$(printf '%0.1s' " "{1..60}) @@ -66,10 +66,10 @@ __clean_variables() { local var="$*" var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters - var="$(printf '%s\n' "$var" | sed 's/\( \)*/␁/g;s|^ ||g')" + var="$(printf '%s\n' "$var" | sed 's/\( \)*/\1/g;s|^ ||g')" printf '%s' "$var" | grep -v '^$' } - +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Auto-detect services from init.d scripts __auto_detect_services() { local discovered_services="tini" # Always include tini as init @@ -172,7 +172,6 @@ __no_exit() { # Wait for background processes wait } - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __trim() { local var="${*//;/ }" @@ -267,7 +266,7 @@ __certbot() { [ "$CERT_BOT_ENABLED" = "true" ] || { export CERT_BOT_ENABLED="" && return 10; } [ -n "$CERT_BOT_MAIL" ] || { echo "The variable CERT_BOT_MAIL is not set" >&2 && return 1; } [ -n "$CERTBOT_DOMAINS" ] || { echo "The variable CERTBOT_DOMAINS is not set" >&2 && return 1; } - for domain in $CERTBOT_DOMAINS; do + for domain in $$CERTBOT_DOMAINS; do [ -n "$domain" ] && ADD_CERTBOT_DOMAINS+="-d $domain " done [ -n "$is_renewal" ] && options="renew" ADD_CERTBOT_DOMAINS="" || options="certonly" @@ -351,7 +350,7 @@ __create_ssl_cert() { -days $VALID_FOR \ -nodes \ -x509 \ - -subj "/C=${COUNTRY// /\ }/ST=${STATE// /\ }/L=${CITY// /\ }/O=${ORG// /\ }/OU=${UNIT// /\ }/CN=${CN// /\ }" \ + -subj "/C=${COUNTRY// /\\ }/ST=${STATE// /\\ }/L=${CITY// /\\ }/O=${ORG// /\\ }/OU=${UNIT// /\\ }/CN=${CN// /\\ }" \ -keyout "$SSL_KEY" \ -out "$SSL_CERT" fi @@ -363,137 +362,83 @@ __create_ssl_cert() { return 2 fi } - -# Enhanced __start_init_scripts function with better error handling and monitoring -__start_init_scripts() { - set -e - trap 'echo "āŒ Fatal error in service startup - killing container"; rm -f /run/__start_init_scripts.pid; kill -TERM 1' ERR - - [ "$1" = " " ] && shift 1 - [ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail - - local basename="" - local init_pids="" - local retstatus="0" - local initStatus="0" - local failed_services="" - local successful_services="" - local init_dir="${1:-/usr/local/etc/docker/init.d}" - local init_count="$(find "$init_dir" -name "*.sh" 2>/dev/null | wc -l)" - - if [ -n "$SERVICE_DISABLED" ]; then - echo "$SERVICE_DISABLED is disabled" - unset SERVICE_DISABLED - return 0 - fi - - echo "šŸš€ Starting container services initialization" - echo "šŸ“‚ Init directory: $init_dir" - echo "šŸ“Š Services to start: $init_count" - - # Create a fresh PID file to track this startup session - echo $$ > /run/__start_init_scripts.pid - - mkdir -p "/tmp" "/run" "/run/init.d" "/usr/local/etc/docker/exec" "/data/logs/init" - chmod -R 777 "/tmp" "/run" "/run/init.d" "/usr/local/etc/docker/exec" "/data/logs/init" - - if [ "$init_count" -eq 0 ] || [ ! -d "$init_dir" ]; then - echo "āš ļø No init scripts found in $init_dir" - # Still create a minimal keep-alive for containers without services - while true; do - echo "$(date): No services - container keep-alive" >> "/data/logs/start.log" - sleep 3600 - done & - else - echo "šŸ“‹ Found $init_count service scripts to execute" - - if [ -d "$init_dir" ]; then - # Remove sample files - find "$init_dir" -name "*.sample" -delete 2>/dev/null - - # Make scripts executable - find "$init_dir" -name "*.sh" -exec chmod 755 {} \; 2>/dev/null - - # Execute scripts in numerical/alphabetical order - for init in "$init_dir"/*.sh; do - if [ -x "$init" ]; then - basename="$(basename "$init")" - service="$(printf '%s' "$basename" | sed 's/^[0-9]*-//;s|\.sh$||g')" - - printf '\nšŸ”§ Executing service script: %s (service: %s)\n' "$init" "$service" - - # Execute the init script and capture its exit code - if eval "$init"; then - sleep 5 # Give service more time to start properly - - # Verify the service actually started by checking for PID - retPID=$(__get_pid "$service") - if [ -n "$retPID" ]; then - initStatus="0" - successful_services="$successful_services $service" - printf 'āœ… Service %s started successfully - PID: %s\n' "$service" "$retPID" - else - # Service script succeeded but no PID found - this is suspicious - initStatus="1" - failed_services="$failed_services $service" - printf 'āš ļø Service %s script completed but no PID found\n' "$service" - fi - else - # Service script failed - script_exit_code="$?" - initStatus="1" - failed_services="$failed_services $service" - printf 'āŒ Init script %s failed with exit code %s\n' "$init" "$script_exit_code" - fi - else - printf 'āš ļø Script %s is not executable, skipping\n' "$init" - fi - - retstatus=$(($retstatus + $initStatus)) - printf '\n' - done - - printf 'šŸ“Š Service startup summary:\n' - printf ' āœ… Successful: %s\n' "${successful_services:-none}" - printf ' āŒ Failed: %s\n' "${failed_services:-none}" - printf ' šŸ“ˆ Total status code: %s\n' "$retstatus" - - # If any services failed to start, terminate the container immediately - if [ $retstatus -gt 0 ]; then - echo "" - echo "šŸ’„ Service startup failures detected!" - echo "šŸ”„ Container will terminate to allow orchestrator restart" - echo "šŸ“ Check container logs for detailed failure information" - - # Write failure information to log - { - echo "$(date): SERVICE STARTUP FAILURE" - echo "Successful services: $successful_services" - echo "Failed services: $failed_services" - echo "Total errors: $retstatus" - } >> "/data/logs/start.log" - - # Clean up and exit - rm -f /run/__start_init_scripts.pid - exit $retstatus - fi - fi - fi - - # Write successful startup status to log - { - echo "$(date): Container startup completed successfully" - echo "Active services: $successful_services" - [ -n "$failed_services" ] && echo "Failed services: $failed_services" - echo "Status code: $retstatus" - } >> "/data/logs/start.log" - - printf '\nšŸŽ‰ All services initialized successfully!\n' - printf 'šŸ” Service monitoring will now begin...\n\n' - return $retstatus +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +__init_apache() { + local etc_dir="" conf_dir="" conf_dir="" www_dir="" apache_bin="" + etc_dir="/etc/${1:-apache2}" + conf_dir="/config/${1:-apache2}" + www_dir="${WWW_ROOT_DIR:-/data/htdocs}" + apache_bin="$(type -P 'httpd' || type -P 'apache2')" + # + return 0 +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +__init_nginx() { + local etc_dir="/etc/${1:-nginx}" + local conf_dir="/config/${1:-nginx}" + local www_dir="${WWW_ROOT_DIR:-/data/htdocs}" + local nginx_bin="$(type -P 'nginx')" + return 0 +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +__init_php() { + local etc_dir="/etc/${1:-php}" + local conf_dir="/config/${1:-php}" + local php_bin="${PHP_BIN_DIR:-$(__find_php_bin)}" + return 0 +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +__init_mysql() { + local db_dir="/data/db/mysql" + local etc_dir="${home:-/etc/${1:-mysql}}" + local db_user="${SERVICE_USER:-mysql}" + local conf_dir="/config/${1:-mysql}" + local user_name="${MARIADB_USER:-root}" + local user_pass="${MARIADB_PASSWORD:-$MARIADB_ROOT_PASSWORD}" + local user_db="${MARIADB_DATABASE}" + local root_pass="$MARIADB_ROOT_PASSWORD" + local mysqld_bin="$(type -P 'mysqld')" + return 0 +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +__init_mongodb() { + local home="${MONGODB_CONFIG_FILE:-$(__find_mongodb_conf)}" + local user_name="${INITDB_ROOT_USERNAME:-root}" + local user_pass="${MONGO_INITDB_ROOT_PASSWORD:-$_ROOT_PASSWORD}" + return +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +__init_postgres() { + local home="${PGSQL_CONFIG_FILE:-$(__find_pgsql_conf)}" + local user_name="${POSTGRES_USER:-root}" + local user_pass="${POSTGRES_PASSWORD:-$POSTGRES_ROOT_PASSWORD}" + return +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +__init_couchdb() { + local home="${COUCHDB_CONFIG_FILE:-$(__find_couchdb_conf)}" + local user_name="${COUCHDB_USER:-root}" + local user_pass="${COUCHDB_PASSWORD:-$SET_RANDOM_PASS}" + return +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# Show available init functions +__init_help() { + echo ' +__certbot +__update_ssl_certs +__create_ssl_cert +' + return +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +__run_once() { + if [ "$CONFIG_DIR_INITIALIZED" = "false" ] || [ "$DATA_DIR_INITIALIZED" = "false" ] || [ ! -f "/config/.docker_has_run" ]; then + return 0 + else + return 1 + fi } - -# Additional functions continue here (keeping the rest of the original functions)... # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # run program ever n minutes __cron() { @@ -574,10 +519,6 @@ __file_copy() { fi fi } - -# The rest of the original functions continue unchanged... -# [I'm including key functions but truncating for length - the full file would include all original functions] - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __generate_random_uids() { local set_random_uid="$(seq 3000 5000 | sort -R | head -n 1)" @@ -669,6 +610,7 @@ __proc_check() { return 1 fi } + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __set_user_group_id() { local exitStatus=0 @@ -798,7 +740,134 @@ __exec_command() { fi return $exitCode } - +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# Setup the server init scripts +__start_init_scripts() { + # Let individual scripts handle their own errors - don't use global error traps + + [ "$1" = " " ] && shift 1 + [ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -o pipefail -x$DEBUGGER_OPTIONS || set -o pipefail + + local basename="" + local init_pids="" + local retstatus="0" + local initStatus="0" + local failed_services="" + local successful_services="" + local init_dir="${1:-/usr/local/etc/docker/init.d}" + local init_count="$(find "$init_dir" -name "*.sh" 2>/dev/null | wc -l)" + + if [ -n "$SERVICE_DISABLED" ]; then + echo "$SERVICE_DISABLED is disabled" + unset SERVICE_DISABLED + return 0 + fi + + echo "šŸš€ Starting container services initialization" + echo "šŸ“‚ Init directory: $init_dir" + echo "šŸ“Š Services to start: $init_count" + + # Create a fresh PID file to track this startup session + echo $$ > /run/__start_init_scripts.pid + + mkdir -p "/tmp" "/run" "/run/init.d" "/usr/local/etc/docker/exec" "/data/logs/init" + chmod -R 777 "/tmp" "/run" "/run/init.d" "/usr/local/etc/docker/exec" "/data/logs/init" + + if [ "$init_count" -eq 0 ] || [ ! -d "$init_dir" ]; then + echo "āš ļø No init scripts found in $init_dir" + # Still create a minimal keep-alive for containers without services + while true; do + echo "$(date): No services - container keep-alive" >> "/data/logs/start.log" + sleep 3600 + done & + else + echo "šŸ“‹ Found $init_count service scripts to execute" + + if [ -d "$init_dir" ]; then + # Remove sample files + find "$init_dir" -name "*.sample" -delete 2>/dev/null + + # Make scripts executable + find "$init_dir" -name "*.sh" -exec chmod 755 {} \; 2>/dev/null + + # Execute scripts in numerical/alphabetical order + for init in "$init_dir"/*.sh; do + if [ -x "$init" ]; then + basename="$(basename "$init")" + service="$(printf '%s' "$basename" | sed 's/^[0-9]*-//;s|\.sh$||g')" + + printf '\nšŸ”§ Executing service script: %s (service: %s)\n' "$init" "$service" + + # Execute the init script and capture its exit code + if eval "$init"; then + sleep 5 # Give service more time to start properly + + # Verify the service actually started by checking for PID + retPID=$(__get_pid "$service") + if [ -n "$retPID" ]; then + initStatus="0" + successful_services="$successful_services $service" + printf 'āœ… Service %s started successfully - PID: %s\n' "$service" "$retPID" + else + # Service script succeeded but no PID found - this is suspicious + initStatus="1" + failed_services="$failed_services $service" + printf 'āš ļø Service %s script completed but no PID found\n' "$service" + fi + else + # Service script failed + script_exit_code="$?" + initStatus="1" + failed_services="$failed_services $service" + printf 'āŒ Init script %s failed with exit code %s\n' "$init" "$script_exit_code" + fi + else + printf 'āš ļø Script %s is not executable, skipping\n' "$init" + fi + + retstatus=$(($retstatus + $initStatus)) + printf '\n' + done + + printf 'šŸ“Š Service startup summary:\n' + printf ' āœ… Successful: %s\n' "${successful_services:-none}" + printf ' āŒ Failed: %s\n' "${failed_services:-none}" + printf ' šŸ“ˆ Total status code: %s\n' "$retstatus" + + # If any services failed to start, terminate the container immediately + if [ $retstatus -gt 0 ]; then + echo "" + echo "šŸ’„ Service startup failures detected!" + echo "šŸ”„ Container will terminate to allow orchestrator restart" + echo "šŸ“ Check container logs for detailed failure information" + + # Write failure information to log + { + echo "$(date): SERVICE STARTUP FAILURE" + echo "Successful services: $successful_services" + echo "Failed services: $failed_services" + echo "Total errors: $retstatus" + } >> "/data/logs/start.log" + + # Clean up and exit + rm -f /run/__start_init_scripts.pid + exit $retstatus + fi + fi + fi + + # Write successful startup status to log + { + echo "$(date): Container startup completed successfully" + echo "Active services: $successful_services" + [ -n "$failed_services" ] && echo "Failed services: $failed_services" + echo "Status code: $retstatus" + } >> "/data/logs/start.log" + + printf '\nšŸŽ‰ All services initialized successfully!\n' + printf 'šŸ” Service monitoring will now begin...\n\n' + return $retstatus +} # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __setup_mta() { [ -d "/etc/ssmtp" ] || [ -d "/etc/postfix" ] || return @@ -812,12 +881,111 @@ __setup_mta() { local account_user="${SERVER_ADMIN//@*/}" local account_domain="${EMAIL_DOMAIN//*@/}" echo "$EMAIL_RELAY" | grep '[0-9][0-9]' || relay_port="465" - # sSMTP relay setup and postfix setup would continue here... - # Simplified for length + ################# sSMTP relay setup + if [ -n "$(type -P 'ssmtp')" ]; then + [ -d "/config/ssmtp" ] || mkdir -p "/config/ssmtp" + [ -f "/etc/ssmtp/ssmtp.conf" ] && __rm "/etc/ssmtp/ssmtp.conf" + symlink_files="$(__find_file_relative "/config/ssmtp")" + if [ ! -f "/config/ssmtp/ssmtp.conf" ]; then + cat </dev/null +# ssmtp configuration. +root=${account_user:-root}@${account_domain:-$HOSTNAME} +mailhub=${relay_server:-172.17.0.1}:$relay_port +rewriteDomain=$local_hostname +hostname=$local_hostname +TLS_CA_FILE=/etc/ssl/certs/ca-certificates.crt +UseTLS=Yes +UseSTARTTLS=No +AuthMethod=LOGIN +FromLineOverride=yes +#AuthUser=username +#AuthPass=password + +EOF + fi + if [ -f "/config/ssmtp/ssmtp.conf" ]; then + for file in $symlink_files; do + __symlink "/config/ssmtp/$file" "/etc/ssmtp/$file" + __initialize_replace_variables "/etc/ssmtp/$file" + done + if [ -f "/etc/ssmtp/revaliases" ] && [ ! -f "/config/ssmtp/revaliases" ]; then + mv -f "/etc/ssmtp/revaliases" "/config/ssmtp/revaliases" + __symlink "/config/ssmtp/revaliases" "/etc/ssmtp/revaliases" + __initialize_replace_variables "/etc/ssmtp/revaliases" + else + touch "/config/ssmtp/revaliases" + __symlink "/config/ssmtp/revaliases" "/etc/ssmtp/revaliases" + __initialize_replace_variables "/etc/ssmtp/revaliases" + fi + echo "Done setting up ssmtp" + fi + + ################# postfix relay setup + elif [ -n "$(type -P 'postfix')" ]; then + [ -d "/etc/postfix" ] || mkdir -p "/etc/postfix" + [ -d "/config/postfix" ] || mkdir -p "/config/postfix" + [ -f "/etc/postfix/main.cf" ] && __rm "/etc/postfix/main.cf" + symlink_files="$(__find_file_relative "/config/postfix")" + if [ ! -f "/config/postfix/main.cf" ]; then + cat </dev/null +# postfix configuration. +smtpd_banner = \$myhostname ESMTP email server +compatibility_level = 2 +inet_protocols = ipv4 +inet_interfaces = all +mydestination = +local_transport=error: local delivery disabled +mynetworks = /etc/postfix/mynetworks +alias_maps = hash:/etc/postfix/aliases +alias_database = hash:/etc/postfix/aliases +transport_maps = hash:/etc/postfix/transport +virtual_alias_maps = hash:/etc/postfix/virtual +relay_domains = hash:/etc/postfix/mydomains, regexp:/etc/postfix/mydomains.pcre +tls_random_source = dev:/dev/urandom +smtp_use_tls = yes +smtpd_use_tls = yes +smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache +smtpd_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CBC3-SHA, KRB5-DES, CBC3-SHA +smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination +append_dot_mydomain = yes +myorigin = $local_hostname +myhostname = $local_hostname +relayhost = [$relay_server]:$relay_port + +EOF + fi + if [ -d "/config/postfix" ]; then + for f in $symlink_files; do + __symlink "/config/postfix/$f" "/etc/postfix/$f" + done + __initialize_replace_variables "/etc/postfix" + touch "/config/postfix/aliases" "/config/postfix/mynetworks" "/config/postfix/transport" + touch "/config/postfix/mydomains.pcre" "/config/postfix/mydomains" "/config/postfix/virtual" + postmap "/config/aliases" "/config/mynetworks" "/config/transport" &>/dev/null + postmap "/config/mydomains.pcre" "/config/mydomains" "/config/virtual" &>/dev/null + fi + if [ -f "/etc/postfix/main.cf" ] && [ ! -f "/run/init.d/postfix.pid" ]; then + SERVICES_LIST+="postfix " + if [ ! -f "/run/init.d/postfix.pid" ]; then + __exec_service postfix start + fi + echo "Done setting up postfix" + fi + fi + [ -f "/root/dead.letter" ] && __rm "/root/dead.letter" return $exitCode } - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +__initialize_web_health() { + local www_dir="${1:-${WWW_ROOT_DIR:-/usr/local/share/httpd/default}}" + if [ -d "$www_dir" ]; then + __find_replace "REPLACE_CONTAINER_IP4" "${REPLACE_CONTAINER_IP4:-127.0.0.1}" "/usr/local/share/httpd" + __find_replace "REPLACE_COPYRIGHT_FOOTER" "${COPYRIGHT_FOOTER:-Copyright 1999 - $(date +'%Y')}" "/usr/local/share/httpd" + __find_replace "REPLACE_LAST_UPDATED_ON_MESSAGE" "${LAST_UPDATED_ON_MESSAGE:-$(date +'Last updated on: %Y-%m-%d at %H:%M:%S')}" "/usr/local/share/httpd" + fi +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# file_dir __initialize_replace_variables() { local set_dir="" get_dir="$*" [ $# -ne 0 ] || return 1 @@ -851,10 +1019,14 @@ __initialize_replace_variables() { [ -n "$CONTAINER_NAME" ] && __find_replace "REPLACE_SERVER_SOFTWARE" "${CONTAINER_NAME:-docker}" "$set_dir" [ -n "$WWW_ROOT_DIR" ] && __find_replace "REPLACE_SERVER_WWW_DIR" "${WWW_ROOT_DIR:-/usr/local/share/httpd/default}" "$set_dir" done + if [ -n "$WWW_ROOT_DIR" ] && [ "$set_dir" != "$WWW_ROOT_DIR" ] && [ -d "$WWW_ROOT_DIR" ]; then + __find_replace "REPLACE_CONTAINER_IP4" "${REPLACE_CONTAINER_IP4:-127.0.0.1}" "$WWW_ROOT_DIR" + __find_replace "REPLACE_COPYRIGHT_FOOTER" "${COPYRIGHT_FOOTER:-Copyright 1999 - $(date +'%Y')}" "$WWW_ROOT_DIR" + __find_replace "REPLACE_LAST_UPDATED_ON_MESSAGE" "${LAST_UPDATED_ON_MESSAGE:-$(date +'Last updated on: %Y-%m-%d at %H:%M:%S')}" "$WWW_ROOT_DIR" + fi mkdir -p "${TMP_DIR:-/tmp/$SERVICE_NAME}" "${RUN_DIR:-/run/$SERVICE_NAME}" "${LOG_DIR:-/data/logs/$SERVICE_NAME}" chmod -f 777 "${TMP_DIR:-/tmp/$SERVICE_NAME}" "${RUN_DIR:-/run/$SERVICE_NAME}" "${LOG_DIR:-/data/logs/$SERVICE_NAME}" } - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __initialize_database() { [ "$IS_DATABASE_SERVICE" = "yes" ] || [ "$USES_DATABASE_SERVICE" = "yes" ] || return 0 @@ -873,8 +1045,19 @@ __initialize_database() { __find_replace "REPLACE_DATABASE_ROOT_PASS" "$db_admin_pass" "$dir" __find_replace "REPLACE_DATABASE_NAME" "$DATABASE_NAME" "$dir" __find_replace "REPLACE_DATABASE_DIR" "$DATABASE_DIR" "$dir" + if echo "$dir" | grep -q '^/etc'; then + __find_replace "REPLACE_USER_NAME" "$db_normal_user" "/etc" + __find_replace "REPLACE_USER_PASS" "$db_normal_pass" "/etc" + __find_replace "REPLACE_DATABASE_USER" "$db_normal_user" "/etc" + __find_replace "REPLACE_DATABASE_PASS" "$db_normal_pass" "/etc" + __find_replace "REPLACE_ROOT_ADMIN" "$db_admin_user" "/etc" + __find_replace "REPLACE_ROOT_PASS" "$db_admin_pass" "/etc" + __find_replace "REPLACE_DATABASE_ROOT_USER" "$db_admin_user" "/etc" + __find_replace "REPLACE_DATABASE_ROOT_PASS" "$db_admin_pass" "/etc" + __find_replace "REPLACE_DATABASE_NAME" "$DATABASE_NAME" "/etc" + __find_replace "REPLACE_DATABASE_DIR" "$DATABASE_DIR" "/etc" + fi } - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __initialize_db_users() { [ "$IS_DATABASE_SERVICE" = "yes" ] || [ "$USES_DATABASE_SERVICE" = "yes" ] || return 0 @@ -888,7 +1071,6 @@ __initialize_db_users() { export DATABASE_PASS_ROOT="$db_admin_pass" export db_normal_user db_normal_pass db_admin_user db_admin_pass } - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __initialize_system_etc() { local conf_dir="$1" @@ -916,7 +1098,6 @@ __initialize_system_etc() { done fi } - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __initialize_custom_bin_dir() { local SET_USR_BIN="" @@ -935,7 +1116,6 @@ __initialize_custom_bin_dir() { unset create_bin_template create_bin_name SET_USR_BIN fi } - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __initialize_default_templates() { if [ -n "$DEFAULT_TEMPLATE_DIR" ]; then @@ -956,7 +1136,6 @@ __initialize_default_templates() { fi fi } - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __initialize_config_dir() { if [ -n "$DEFAULT_CONF_DIR" ]; then @@ -977,7 +1156,6 @@ __initialize_config_dir() { fi fi } - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __initialize_data_dir() { if [ -d "/data" ]; then @@ -998,7 +1176,6 @@ __initialize_data_dir() { fi fi } - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __initialize_www_root() { local WWW_INIT="" @@ -1012,7 +1189,6 @@ __initialize_www_root() { fi __initialize_web_health "$WWW_ROOT_DIR" } - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __is_htdocs_mounted() { WWW_ROOT_DIR="${WWW_ROOT_DIR:-/data/htdocs}" @@ -1040,7 +1216,6 @@ __is_htdocs_mounted() { [ -d "$WWW_ROOT_DIR" ] || mkdir -p "$WWW_ROOT_DIR" export WWW_ROOT_DIR="${WWW_ROOT_DIR:-/usr/local/share/httpd/default}" } - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __initialize_ssl_certs() { [ "$SSL_ENABLED" = "yes" ] && __certbot @@ -1068,7 +1243,19 @@ __initialize_ssl_certs() { fi type update-ca-certificates &>/dev/null && update-ca-certificates &>/dev/null } - +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +__start_php_dev_server() { + if [ "$2" = "yes" ]; then + if [ -d "/usr/local/share/httpd" ]; then + find "/usr/local/share/httpd" -type f -not -path '.git*' -iname '*.php' -exec sed -i 's|[<].*SERVER_ADDR.*[>]|'${CONTAINER_IP4_ADDRESS:-127.0.0.1}'|g' {} \; 2>/dev/null + php -S 0.0.0.0:$PHP_DEV_SERVER_PORT -t "/usr/local/share/httpd" + fi + if ! echo "$1" | grep -q "^/usr/local/share/httpd"; then + find "$1" -type f -not -path '.git*' -iname '*.php' -exec sed -i 's|[<].*SERVER_ADDR.*[>]|'${CONTAINER_IP4_ADDRESS:-127.0.0.1}'|g' {} \; 2>/dev/null + php -S 0.0.0.0:$PHP_DEV_SERVER_PORT -t "$1" + fi + fi +} # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __check_service() { if [ "$1" = "check" ]; then @@ -1077,7 +1264,6 @@ __check_service() { exit $? fi } - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __switch_to_user() { if [ "$RUNAS_USER" = "root" ]; then @@ -1101,17 +1287,45 @@ __switch_to_user() { fi export su_exec } - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -__initialize_web_health() { - local www_dir="${1:-${WWW_ROOT_DIR:-/usr/local/share/httpd/default}}" - if [ -d "$www_dir" ]; then - __find_replace "REPLACE_CONTAINER_IP4" "${REPLACE_CONTAINER_IP4:-127.0.0.1}" "/usr/local/share/httpd" - __find_replace "REPLACE_COPYRIGHT_FOOTER" "${COPYRIGHT_FOOTER:-Copyright 1999 - $(date +'%Y')}" "/usr/local/share/httpd" - __find_replace "REPLACE_LAST_UPDATED_ON_MESSAGE" "${LAST_UPDATED_ON_MESSAGE:-$(date +'Last updated on: %Y-%m-%d at %H:%M:%S')}" "/usr/local/share/httpd" +# usage backup "days" "hours" +__backup() { + local dirs="" backup_dir backup_name backup_exclude runTime cronTime maxDays + test -n "$1" && test -z "${1//[0-9]/}" && maxDays="$1" && shift 1 || maxDays="7" + test -n "$1" && test -z "${1//[0-9]/}" && cronTime="$1" && shift 1 || cronTime="" + local exitCodeP=0 + local exitStatus=0 + local pidFile="/run/backup.pid" + local logDir="/data/log/backups" + maxDays="${BACKUP_MAX_DAYS:-$maxDays}" + cronTime="${BACKUP_RUN_CRON:-$cronTime}" + backup_dir="$BACKUP_DIR/$(date +'%y/%m')" + backup_name="$(date +'%d_%H-%M').tar.gz" + backup_exclude="/data/logs $BACKUP_DIR $BACK_EXCLUDE_DIR" + [ -d "/data" ] && dirs+="/data " + [ -d "/config" ] && dirs+="/config " + [ -d "$logDir" ] || mkdir -p "$logDir" + [ -d "$backup_dir" ] || mkdir -p "$backup_dir" + [ -z "$dirs" ] && echo "BACKUP_DIR is unset" >&2 && return 1 + [ -f "$pidFile" ] && echo "A backup job is already running" >&2 && return 1 + echo "$$" >"$pidFile" + echo "Starting backup in $(date)" >>"$logDir/$CONTAINER_NAME" + tar --exclude $backup_exclude cfvz "$backup_dir/$backup_name" $dirs 2>/dev/stderr >>"$logDir/$CONTAINER_NAME" || exitCodeP=1 + if [ $exitCodeP -eq 0 ]; then + echo "Backup has completed and saved to: $backup_dir/$backup_name" + printf '%s\n\n' "Backup has completed on $(date)" >>"$logDir/$CONTAINER_NAME" + else + __rm "${backup_dir:?}/$backup_name" + echo "Backup has failed - log file saved to: $logDir/$CONTAINER_NAME" >&2 + printf '%s\n\n' "Backup has completed on $(date)" >>"$logDir/$CONTAINER_NAME" + exitStatus=1 fi + [ -f "$pidFile" ] && __rm "$pidFile" + [ -n "$maxDays" ] && find "$BACKUP_DIR"* -mtime +$maxDays -exec rm -Rf {} \; >/dev/null 2>&1 + [ -n "$cronTime" ] && runTime=$((cronTime * 3600)) || return $exitStatus + sleep $runTime && __backup "$maxDays" "$cronTime" } - +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # set variables from function calls export INIT_DATE="${INIT_DATE:-$(date)}" export START_SERVICES="${START_SERVICES:-yes}" @@ -1136,6 +1350,11 @@ export DEFAULT_DATA_DIR="${DEFAULT_DATA_DIR:-/usr/local/share/template-files/dat export DEFAULT_CONF_DIR="${DEFAULT_CONF_DIR:-/usr/local/share/template-files/config}" export DEFAULT_TEMPLATE_DIR="${DEFAULT_TEMPLATE_DIR:-/usr/local/share/template-files/defaults}" # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# Backup settings +export BACKUP_MAX_DAYS="${BACKUP_MAX_DAYS:-}" +export BACKUP_RUN_CRON="${BACKUP_RUN_CRON:-}" +export BACKUP_DIR="${BACKUP_DIR:-/data/backups}" +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CONTAINER_IP4_ADDRESS="${CONTAINER_IP4_ADDRESS:-$(__get_ip4)}" CONTAINER_IP6_ADDRESS="${CONTAINER_IP6_ADDRESS:-$(__get_ip6)}" # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1164,10 +1383,7 @@ export ENTRYPOINT_CONFIG_INIT_FILE="${ENTRYPOINT_CONFIG_INIT_FILE:-/config/.dock export ENTRYPOINT_DATA_INIT_FILE DATA_DIR_INITIALIZED ENTRYPOINT_CONFIG_INIT_FILE CONFIG_DIR_INITIALIZED export ENTRYPOINT_PID_FILE ENTRYPOINT_INIT_FILE ENTRYPOINT_FIRST_RUN # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# export the enhanced functions -export -f __get_pid __start_init_scripts __is_running __certbot __update_ssl_certs __create_ssl_cert __no_exit -export -f __setup_directories __fix_permissions __create_service_user __set_user_group_id __switch_to_user -export -f __initialize_replace_variables __initialize_system_etc __initialize_config_dir __initialize_data_dir -export -f __initialize_default_templates __initialize_custom_bin_dir __is_htdocs_mounted __initialize_ssl_certs +# export the functions +export -f __get_pid __start_init_scripts __is_running __certbot __update_ssl_certs __create_ssl_cert __no_exit __auto_detect_services # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# end of enhanced functions \ No newline at end of file +# end of functions