From d8b9bd2a4f500de340cda3a5aa16501cd199bca2 Mon Sep 17 00:00:00 2001 From: casjay Date: Mon, 3 Aug 2026 11:05:14 -0400 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Update=20to=20latest=20docker=20tem?= =?UTF-8?q?plate=20revision=20=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - .env.scripts: synced version stamp to current template; preserved ENV_PULL_URL=casjaysdev/alpine (gen-dockerfile's --update path had a bug computing "alpine" instead, corrected manually per the casjaysdevdocker->casjaysdev/* base-image convention) - rootfs/usr/local/bin/entrypoint.sh: regenerated from current template; fixes stale CONTAINER_NAME="alpine" -> "opengist" and normalizes whitespace - rootfs/usr/local/etc/docker/functions/entrypoint.sh: replaced from template; picks up upstream fix for __symlink/__initialize_ssl_certs returning nonzero on success under set -e - rootfs/root/docker/setup/00-init.sh, 01-system.sh, 02-packages.sh, 03-files.sh, 04-users.sh, 06-post.sh, 07-cleanup.sh: version stamp bump only, no logic change - rootfs/root/docker/setup/05-custom.sh: version stamp bump only; restored the opengist binary download/install logic that the template regeneration would have wiped (this file is app-specific, not boilerplate) --- .env.scripts | 4 +- rootfs/root/docker/setup/00-init.sh | 4 +- rootfs/root/docker/setup/01-system.sh | 4 +- rootfs/root/docker/setup/02-packages.sh | 4 +- rootfs/root/docker/setup/03-files.sh | 4 +- rootfs/root/docker/setup/04-users.sh | 4 +- rootfs/root/docker/setup/05-custom.sh | 6 +- rootfs/root/docker/setup/06-post.sh | 4 +- rootfs/root/docker/setup/07-cleanup.sh | 4 +- rootfs/usr/local/bin/entrypoint.sh | 698 +++++++++--------- .../local/etc/docker/functions/entrypoint.sh | 80 +- 11 files changed, 419 insertions(+), 397 deletions(-) diff --git a/.env.scripts b/.env.scripts index 698605c..52d83d5 100644 --- a/.env.scripts +++ b/.env.scripts @@ -1,10 +1,10 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202608022140-git +##@Version : 202608031101-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : WTFPL # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Sun Aug 2 09:40:08 PM EDT 2026 +# @@Created : Mon Aug 3 11:01:03 AM EDT 2026 # @@File : .env.scripts # @@Description : Variables for gen-dockerfile and buildx scripts # @@Changelog : newScript diff --git a/rootfs/root/docker/setup/00-init.sh b/rootfs/root/docker/setup/00-init.sh index 8493168..6be0e4d 100755 --- a/rootfs/root/docker/setup/00-init.sh +++ b/rootfs/root/docker/setup/00-init.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202606120507-git +##@Version : 202608031101-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : WTFPL # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Fri Jun 12 05:07:20 AM EDT 2026 +# @@Created : Mon Aug 3 11:01:46 AM EDT 2026 # @@File : 00-init.sh # @@Description : script to run init # @@Changelog : newScript diff --git a/rootfs/root/docker/setup/01-system.sh b/rootfs/root/docker/setup/01-system.sh index 47dd02b..ea573af 100755 --- a/rootfs/root/docker/setup/01-system.sh +++ b/rootfs/root/docker/setup/01-system.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202606120507-git +##@Version : 202608031101-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : WTFPL # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Fri Jun 12 05:07:20 AM EDT 2026 +# @@Created : Mon Aug 3 11:01:46 AM EDT 2026 # @@File : 01-system.sh # @@Description : script to run system # @@Changelog : newScript diff --git a/rootfs/root/docker/setup/02-packages.sh b/rootfs/root/docker/setup/02-packages.sh index 041c1d7..c6a0a85 100755 --- a/rootfs/root/docker/setup/02-packages.sh +++ b/rootfs/root/docker/setup/02-packages.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202606120507-git +##@Version : 202608031101-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : WTFPL # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Fri Jun 12 05:07:20 AM EDT 2026 +# @@Created : Mon Aug 3 11:01:46 AM EDT 2026 # @@File : 02-packages.sh # @@Description : script to run packages # @@Changelog : newScript diff --git a/rootfs/root/docker/setup/03-files.sh b/rootfs/root/docker/setup/03-files.sh index 14b4e1d..b3da743 100755 --- a/rootfs/root/docker/setup/03-files.sh +++ b/rootfs/root/docker/setup/03-files.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202606120507-git +##@Version : 202608031101-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : WTFPL # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Fri Jun 12 05:07:20 AM EDT 2026 +# @@Created : Mon Aug 3 11:01:46 AM EDT 2026 # @@File : 03-files.sh # @@Description : script to run files # @@Changelog : newScript diff --git a/rootfs/root/docker/setup/04-users.sh b/rootfs/root/docker/setup/04-users.sh index 028856c..3aad032 100755 --- a/rootfs/root/docker/setup/04-users.sh +++ b/rootfs/root/docker/setup/04-users.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202606120507-git +##@Version : 202608031101-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : WTFPL # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Fri Jun 12 05:07:20 AM EDT 2026 +# @@Created : Mon Aug 3 11:01:46 AM EDT 2026 # @@File : 04-users.sh # @@Description : script to run users # @@Changelog : newScript diff --git a/rootfs/root/docker/setup/05-custom.sh b/rootfs/root/docker/setup/05-custom.sh index 4f8be51..b7b27c5 100755 --- a/rootfs/root/docker/setup/05-custom.sh +++ b/rootfs/root/docker/setup/05-custom.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202608022207-git +##@Version : 202608031101-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : WTFPL # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Fri Jun 12 05:07:20 AM EDT 2026 +# @@Created : Mon Aug 3 11:01:46 AM EDT 2026 # @@File : 05-custom.sh # @@Description : script to run custom # @@Changelog : newScript @@ -23,7 +23,7 @@ set -eo pipefail [ "$DEBUGGER" = "on" ] && echo "Enabling debugging" && set -x$DEBUGGER_OPTIONS # - - - - - - - - - - - - - - - - - - - - - - - - - -VERSION="202608022207-git" +VERSION="202608031101-git" # - - - - - - - - - - - - - - - - - - - - - - - - - # Set env variables OPENGIST_EXITCODE=0 diff --git a/rootfs/root/docker/setup/06-post.sh b/rootfs/root/docker/setup/06-post.sh index 443a30e..3c82803 100755 --- a/rootfs/root/docker/setup/06-post.sh +++ b/rootfs/root/docker/setup/06-post.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202606120507-git +##@Version : 202608031101-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : WTFPL # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Fri Jun 12 05:07:20 AM EDT 2026 +# @@Created : Mon Aug 3 11:01:46 AM EDT 2026 # @@File : 06-post.sh # @@Description : script to run post # @@Changelog : newScript diff --git a/rootfs/root/docker/setup/07-cleanup.sh b/rootfs/root/docker/setup/07-cleanup.sh index 94f8394..3a09ad3 100755 --- a/rootfs/root/docker/setup/07-cleanup.sh +++ b/rootfs/root/docker/setup/07-cleanup.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202606120507-git +##@Version : 202608031101-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : WTFPL # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Fri Jun 12 05:07:20 AM EDT 2026 +# @@Created : Mon Aug 3 11:01:46 AM EDT 2026 # @@File : 07-cleanup.sh # @@Description : script to run cleanup # @@Changelog : newScript diff --git a/rootfs/usr/local/bin/entrypoint.sh b/rootfs/usr/local/bin/entrypoint.sh index fc14b00..65b2649 100755 --- a/rootfs/usr/local/bin/entrypoint.sh +++ b/rootfs/usr/local/bin/entrypoint.sh @@ -1,19 +1,19 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202606041210-git +##@Version : 202607082023-git # @@Author : Jason Hempstead # @@Contact : jason@casjaysdev.pro # @@License : WTFPL # @@ReadME : entrypoint.sh --help # @@Copyright : Copyright: (c) 2026 Jason Hempstead, Casjays Developments -# @@Created : Friday, Jun 12, 2026 05:07 EDT +# @@Created : Monday, Aug 03, 2026 11:01 EDT # @@File : entrypoint.sh -# @@Description : Entrypoint file for alpine +# @@Description : Entrypoint file for opengist # @@Changelog : New script # @@TODO : Better documentation -# @@Other : -# @@Resource : +# @@Other : +# @@Resource : # @@Terminal App : no # @@sudo/root : no # @@Template : other/docker-entrypoint @@ -27,19 +27,19 @@ trap 'retVal=$?;[ "$SERVICE_IS_RUNNING" != "yes" ] && [ -f "$SERVICE_PID_FILE" ] # 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:-}" if [ "$DEBUGGER" = "on" ] || [ -f "/config/.debug" ]; then - echo "Enabling debugging" - set -eo pipefail - [ -n "$DEBUGGER_OPTIONS" ] && set -"$DEBUGGER_OPTIONS" - export DEBUGGER="on" + echo "Enabling debugging" + set -eo pipefail + [ -n "$DEBUGGER_OPTIONS" ] && set -"$DEBUGGER_OPTIONS" + export DEBUGGER="on" else - set -eo pipefail + set -eo pipefail fi # - - - - - - - - - - - - - - - - - - - - - - - - - PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin" # - - - - - - - - - - - - - - - - - - - - - - - - - # Set bash options SCRIPT_FILE="$0" -CONTAINER_NAME="alpine" +CONTAINER_NAME="opengist" SCRIPT_NAME="${SCRIPT_FILE##*/}" CONTAINER_NAME="${ENV_CONTAINER_NAME:-$CONTAINER_NAME}" # - - - - - - - - - - - - - - - - - - - - - - - - - @@ -51,24 +51,24 @@ while :; do [ "$1" = " " ] && shift 1 || break; done # - - - - - - - - - - - - - - - - - - - - - - - - - # import the functions file if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then - . "/usr/local/etc/docker/functions/entrypoint.sh" + . "/usr/local/etc/docker/functions/entrypoint.sh" else - echo "Can not load functions from /usr/local/etc/docker/functions/entrypoint.sh" - exit 1 + echo "Can not load functions from /usr/local/etc/docker/functions/entrypoint.sh" + exit 1 fi # - - - - - - - - - - - - - - - - - - - - - - - - - case "$1" in # Help message -h | --help) - shift 1 - echo "Docker container for $CONTAINER_NAME" - echo "Usage: $CONTAINER_NAME [help tail cron exec start init shell procs ports healthcheck backup command]" - echo "" - exit 0 - ;; + shift 1 + echo "Docker container for $CONTAINER_NAME" + echo "Usage: $CONTAINER_NAME [help tail cron exec start init shell procs ports healthcheck backup command]" + echo "" + exit 0 + ;; -*) - shift - ;; + shift + ;; esac # - - - - - - - - - - - - - - - - - - - - - - - - - # Create the default env files @@ -76,7 +76,7 @@ __create_env_file "/config/env/default.sh" "/root/env.sh" &>/dev/null # - - - - - - - - - - - - - - - - - - - - - - - - - # import variables from files for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do - [ -f "$set_env" ] && . "$set_env" + [ -f "$set_env" ] && . "$set_env" done unset set_env # - - - - - - - - - - - - - - - - - - - - - - - - - @@ -95,8 +95,8 @@ SERVICE_UID="${SERVICE_UID:-0}" SERVICE_GID="${SERVICE_GID:-0}" # - - - - - - - - - - - - - - - - - - - - - - - - - # User and group in which the service switches to - IE: nginx,apache,mysql,postgres -#SERVICE_USER="${SERVICE_USER:-alpine}" # execute command as another user -#SERVICE_GROUP="${SERVICE_GROUP:-alpine}" # Set the service group +#SERVICE_USER="${SERVICE_USER:-opengist}" # execute command as another user +#SERVICE_GROUP="${SERVICE_GROUP:-opengist}" # Set the service group # - - - - - - - - - - - - - - - - - - - - - - - - - # Secondary ports # specifiy other ports @@ -123,7 +123,7 @@ export PATH RUNAS_USER SERVICE_USER SERVICE_GROUP SERVICE_UID SERVICE_GID WWW_RO # show message __run_message() { - return + return 0 } # - - - - - - - - - - - - - - - - - - - - - - - - - ################## END OF CONFIGURATION ##################### @@ -175,13 +175,13 @@ export ENTRYPOINT_DATA_INIT_FILE="${ENTRYPOINT_DATA_INIT_FILE:-/data/.docker_has export ENTRYPOINT_CONFIG_INIT_FILE="${ENTRYPOINT_CONFIG_INIT_FILE:-/config/.docker_has_run}" # - - - - - - - - - - - - - - - - - - - - - - - - - if [ -n "$CONTAINER_WEB_SERVER_WWW_REPO" ]; then - www_temp_dir="/tmp/git/${CONTAINER_WEB_SERVER_WWW_REPO##*/}" - rm -Rf "${WWW_ROOT_DIR:?}"/* "${www_temp_dir:?}"/* 2>/dev/null || true - mkdir -p "$WWW_ROOT_DIR" "$www_temp_dir" 2>/dev/null || true - git clone -q "$CONTAINER_WEB_SERVER_WWW_REPO" "$www_temp_dir" 2>/dev/null || true - rm -Rf "$www_temp_dir/.git" "$www_temp_dir"/.git* 2>/dev/null || true - rsync -ra "$www_temp_dir/" "$WWW_ROOT_DIR" --delete 2>/dev/null || true - rm -Rf "$www_temp_dir" 2>/dev/null || true + www_temp_dir="/tmp/git/${CONTAINER_WEB_SERVER_WWW_REPO##*/}" + rm -Rf "${WWW_ROOT_DIR:?}"/* "${www_temp_dir:?}"/* 2>/dev/null || true + mkdir -p "$WWW_ROOT_DIR" "$www_temp_dir" 2>/dev/null || true + git clone -q "$CONTAINER_WEB_SERVER_WWW_REPO" "$www_temp_dir" 2>/dev/null || true + rm -Rf "$www_temp_dir/.git" "$www_temp_dir"/.git* 2>/dev/null || true + rsync -ra "$www_temp_dir/" "$WWW_ROOT_DIR" --delete 2>/dev/null || true + rm -Rf "$www_temp_dir" 2>/dev/null || true fi # - - - - - - - - - - - - - - - - - - - - - - - - - # variables based on env/files @@ -195,19 +195,19 @@ if [ "$CONTAINER_WEB_SERVER_PROTOCOL" = "https" ]; then SSL_ENABLED="yes"; fi # - - - - - - - - - - - - - - - - - - - - - - - - - # is already Initialized if [ -f "$ENTRYPOINT_DATA_INIT_FILE" ]; then - DATA_DIR_INITIALIZED="yes" + DATA_DIR_INITIALIZED="yes" else - DATA_DIR_INITIALIZED="no" + DATA_DIR_INITIALIZED="no" fi if [ -f "$ENTRYPOINT_CONFIG_INIT_FILE" ]; then - CONFIG_DIR_INITIALIZED="yes" + CONFIG_DIR_INITIALIZED="yes" else - CONFIG_DIR_INITIALIZED="no" + CONFIG_DIR_INITIALIZED="no" fi if [ -f "$ENTRYPOINT_PID_FILE" ] || [ -f "$ENTRYPOINT_INIT_FILE" ]; then - ENTRYPOINT_FIRST_RUN="no" + ENTRYPOINT_FIRST_RUN="no" else - ENTRYPOINT_FIRST_RUN="yes" + ENTRYPOINT_FIRST_RUN="yes" fi # - - - - - - - - - - - - - - - - - - - - - - - - - # clean ENV_PORTS variables @@ -262,13 +262,13 @@ chmod -f 777 "/usr/local/etc/docker/exec" 2>/dev/null || true # - - - - - - - - - - - - - - - - - - - - - - - - - # lets ensure everyone can write to std* if [ -f "/dev/stdin" ]; then - chmod -f 777 "/dev/stdin" 2>/dev/null || true + chmod -f 777 "/dev/stdin" 2>/dev/null || true fi if [ -f "/dev/stderr" ]; then - chmod -f 777 "/dev/stderr" 2>/dev/null || true + chmod -f 777 "/dev/stderr" 2>/dev/null || true fi if [ -f "/dev/stdout" ]; then - chmod -f 777 "/dev/stdout" 2>/dev/null || true + chmod -f 777 "/dev/stdout" 2>/dev/null || true fi # - - - - - - - - - - - - - - - - - - - - - - - - - cat </dev/null | tee /etc/profile.d/locales.shadow /etc/profile.d/locales.sh >/dev/null 2>&1 || true @@ -279,183 +279,183 @@ EOF # - - - - - - - - - - - - - - - - - - - - - - - - - # Create the backup dir if [ -n "$BACKUP_DIR" ]; then - if [ ! -d "$BACKUP_DIR" ]; then - mkdir -p "$BACKUP_DIR" 2>/dev/null || true - fi + if [ ! -d "$BACKUP_DIR" ]; then + mkdir -p "$BACKUP_DIR" 2>/dev/null || true + fi fi # - - - - - - - - - - - - - - - - - - - - - - - - - if [ -f "$ENTRYPOINT_INIT_FILE" ]; then - ENTRYPOINT_MESSAGE="no" ENTRYPOINT_FIRST_RUN="no" + ENTRYPOINT_MESSAGE="no" ENTRYPOINT_FIRST_RUN="no" fi # - - - - - - - - - - - - - - - - - - - - - - - - - if [ "$ENTRYPOINT_FIRST_RUN" != "no" ]; then - if [ "$CONFIG_DIR_INITIALIZED" = "no" ] || [ "$DATA_DIR_INITIALIZED" = "no" ]; then - if [ "$ENTRYPOINT_MESSAGE" = "yes" ]; then - echo "Executing entrypoint script for alpine" - fi - fi - # - - - - - - - - - - - - - - - - - - - - - - - - - - # Set reusable variables - if [ -w "/etc" ] && [ ! -f "/etc/hosts" ]; then - UPDATE_FILE_HOSTS="yes" - touch "/etc/hosts" - elif [ -w "/etc/hosts" ]; then - UPDATE_FILE_HOSTS="yes" - touch "/etc/hosts" - fi - if [ -w "/etc" ] && [ ! -f "/etc/timezone" ]; then - UPDATE_FILE_TZ="yes" - touch "/etc/timezone" - elif [ -w "/etc/timezone" ]; then - UPDATE_FILE_TZ="yes" - touch "/etc/timezone" - fi - if [ -w "/etc" ] && [ ! -f "/etc/resolv.conf" ]; then - UPDATE_FILE_RESOLV="yes" - touch "/etc/resolv.conf" - elif [ -w "/etc/resolv.conf" ]; then - UPDATE_FILE_RESOLV="yes" - touch "/etc/resolv.conf" - fi - # - - - - - - - - - - - - - - - - - - - - - - - - - - # Set timezone - if [ -n "$TZ" ] && [ "$UPDATE_FILE_TZ" = "yes" ]; then - echo "$TZ" >"/etc/timezone" 2>/dev/null || true - fi - if [ -f "/usr/share/zoneinfo/$TZ" ] && [ "$UPDATE_FILE_TZ" = "yes" ]; then - ln -sf "/usr/share/zoneinfo/$TZ" "/etc/localtime" 2>/dev/null || true - fi - # - - - - - - - - - - - - - - - - - - - - - - - - - - # if ipv6 add it to /etc/hosts - if [ "$UPDATE_FILE_HOSTS" = "yes" ]; then - echo "# known hostname mappings" >"/etc/hosts" 2>/dev/null || true - if [ -n "$(ip a 2>/dev/null | grep 'inet6.*::' || ifconfig 2>/dev/null | grep 'inet6.*::')" ]; then - __printf_space "40" "::1" "localhost" >>"/etc/hosts" 2>/dev/null || true - __printf_space "40" "127.0.0.1" "localhost" >>"/etc/hosts" 2>/dev/null || true - else - __printf_space "40" "127.0.0.1" "localhost" >>"/etc/hosts" 2>/dev/null || true - fi - fi - # - - - - - - - - - - - - - - - - - - - - - - - - - - # add .internal domain - if [ "$UPDATE_FILE_HOSTS" = "yes" ] && [ -n "$HOSTNAME" ]; then - if ! __grep_test " $HOSTNAME" "/etc/hosts"; then - __printf_space "40" "${CONTAINER_IP4_ADDRESS:-127.0.0.1}" "$HOSTNAME" >>"/etc/hosts" 2>/dev/null || true - fi - if ! __grep_test " ${HOSTNAME%%.*}.internal" "/etc/hosts"; then - __printf_space "40" "${CONTAINER_IP4_ADDRESS:-127.0.0.1}" "${HOSTNAME%%.*}.internal" >>"/etc/hosts" 2>/dev/null || true - fi - fi - # - - - - - - - - - - - - - - - - - - - - - - - - - - # add domainname - if [ "$UPDATE_FILE_HOSTS" = "yes" ] && [ "$DOMAINNAME" != "internal" ] && [ -n "$DOMAINNAME" ] && [ "$HOSTNAME.$DOMAINNAME" != "$DOMAINNAME" ]; then - if ! __grep_test " ${HOSTNAME%%.*}.$DOMAINNAME" "/etc/hosts"; then - __printf_space "40" "${CONTAINER_IP4_ADDRESS:-127.0.0.1}" "${HOSTNAME%%.*}.$DOMAINNAME" >>"/etc/hosts" 2>/dev/null || true - fi - fi - # - - - - - - - - - - - - - - - - - - - - - - - - - - # Set containers hostname - if [ -n "$HOSTNAME" ] && [ "$UPDATE_FILE_HOSTS" = "yes" ]; then - echo "$HOSTNAME" >"/etc/hostname" 2>/dev/null || true - fi - # - - - - - - - - - - - - - - - - - - - - - - - - - - if [ -f "/etc/hostname" ]; then - if command -v hostname &>/dev/null; then - hostname -F "/etc/hostname" 2>/dev/null || true - else - HOSTNAME="$(<"/etc/hostname")" 2>/dev/null || true - fi - export HOSTNAME - fi - # - - - - - - - - - - - - - - - - - - - - - - - - - - # import hosts file into container - if [ -f "/usr/local/etc/hosts" ] && [ "$UPDATE_FILE_HOSTS" = "yes" ]; then - grep -vF "$HOSTNAME" "/usr/local/etc/hosts" 2>/dev/null >>"/etc/hosts" || true - fi - # - - - - - - - - - - - - - - - - - - - - - - - - - - # import resolv.conf file into container - if [ "$CUSTOM_DNS" != "yes" ] && [ -f "/usr/local/etc/resolv.conf" ] && [ "$UPDATE_FILE_RESOLV" = "yes" ]; then - cp -f "/usr/local/etc/resolv.conf" "/etc/resolv.conf" 2>/dev/null || true - fi - # - - - - - - - - - - - - - - - - - - - - - - - - - - if [ -n "$HOME" ] && [ -d "/usr/local/etc/skel" ]; then - if [ -d "$HOME" ]; then - cp -Rf "/usr/local/etc/skel/." "$HOME/" 2>/dev/null || true - fi - fi + if [ "$CONFIG_DIR_INITIALIZED" = "no" ] || [ "$DATA_DIR_INITIALIZED" = "no" ]; then + if [ "$ENTRYPOINT_MESSAGE" = "yes" ]; then + echo "Executing entrypoint script for opengist" + fi + fi + # - - - - - - - - - - - - - - - - - - - - - - - - - + # Set reusable variables + if [ -w "/etc" ] && [ ! -f "/etc/hosts" ]; then + UPDATE_FILE_HOSTS="yes" + touch "/etc/hosts" + elif [ -w "/etc/hosts" ]; then + UPDATE_FILE_HOSTS="yes" + touch "/etc/hosts" + fi + if [ -w "/etc" ] && [ ! -f "/etc/timezone" ]; then + UPDATE_FILE_TZ="yes" + touch "/etc/timezone" + elif [ -w "/etc/timezone" ]; then + UPDATE_FILE_TZ="yes" + touch "/etc/timezone" + fi + if [ -w "/etc" ] && [ ! -f "/etc/resolv.conf" ]; then + UPDATE_FILE_RESOLV="yes" + touch "/etc/resolv.conf" + elif [ -w "/etc/resolv.conf" ]; then + UPDATE_FILE_RESOLV="yes" + touch "/etc/resolv.conf" + fi + # - - - - - - - - - - - - - - - - - - - - - - - - - + # Set timezone + if [ -n "$TZ" ] && [ "$UPDATE_FILE_TZ" = "yes" ]; then + echo "$TZ" >"/etc/timezone" 2>/dev/null || true + fi + if [ -f "/usr/share/zoneinfo/$TZ" ] && [ "$UPDATE_FILE_TZ" = "yes" ]; then + ln -sf "/usr/share/zoneinfo/$TZ" "/etc/localtime" 2>/dev/null || true + fi + # - - - - - - - - - - - - - - - - - - - - - - - - - + # if ipv6 add it to /etc/hosts + if [ "$UPDATE_FILE_HOSTS" = "yes" ]; then + echo "# known hostname mappings" >"/etc/hosts" 2>/dev/null || true + if [ -n "$(ip a 2>/dev/null | grep 'inet6.*::' || ifconfig 2>/dev/null | grep 'inet6.*::')" ]; then + __printf_space "40" "::1" "localhost" >>"/etc/hosts" 2>/dev/null || true + __printf_space "40" "127.0.0.1" "localhost" >>"/etc/hosts" 2>/dev/null || true + else + __printf_space "40" "127.0.0.1" "localhost" >>"/etc/hosts" 2>/dev/null || true + fi + fi + # - - - - - - - - - - - - - - - - - - - - - - - - - + # add .internal domain + if [ "$UPDATE_FILE_HOSTS" = "yes" ] && [ -n "$HOSTNAME" ]; then + if ! __grep_test " $HOSTNAME" "/etc/hosts"; then + __printf_space "40" "${CONTAINER_IP4_ADDRESS:-127.0.0.1}" "$HOSTNAME" >>"/etc/hosts" 2>/dev/null || true + fi + if ! __grep_test " ${HOSTNAME%%.*}.internal" "/etc/hosts"; then + __printf_space "40" "${CONTAINER_IP4_ADDRESS:-127.0.0.1}" "${HOSTNAME%%.*}.internal" >>"/etc/hosts" 2>/dev/null || true + fi + fi + # - - - - - - - - - - - - - - - - - - - - - - - - - + # add domainname + if [ "$UPDATE_FILE_HOSTS" = "yes" ] && [ "$DOMAINNAME" != "internal" ] && [ -n "$DOMAINNAME" ] && [ "$HOSTNAME.$DOMAINNAME" != "$DOMAINNAME" ]; then + if ! __grep_test " ${HOSTNAME%%.*}.$DOMAINNAME" "/etc/hosts"; then + __printf_space "40" "${CONTAINER_IP4_ADDRESS:-127.0.0.1}" "${HOSTNAME%%.*}.$DOMAINNAME" >>"/etc/hosts" 2>/dev/null || true + fi + fi + # - - - - - - - - - - - - - - - - - - - - - - - - - + # Set containers hostname + if [ -n "$HOSTNAME" ] && [ "$UPDATE_FILE_HOSTS" = "yes" ]; then + echo "$HOSTNAME" >"/etc/hostname" 2>/dev/null || true + fi + # - - - - - - - - - - - - - - - - - - - - - - - - - + if [ -f "/etc/hostname" ]; then + if command -v hostname &>/dev/null; then + hostname -F "/etc/hostname" 2>/dev/null || true + else + HOSTNAME="$(<"/etc/hostname")" 2>/dev/null || true + fi + export HOSTNAME + fi + # - - - - - - - - - - - - - - - - - - - - - - - - - + # import hosts file into container + if [ -f "/usr/local/etc/hosts" ] && [ "$UPDATE_FILE_HOSTS" = "yes" ]; then + grep -vF -- "$HOSTNAME" "/usr/local/etc/hosts" 2>/dev/null >>"/etc/hosts" || true + fi + # - - - - - - - - - - - - - - - - - - - - - - - - - + # import resolv.conf file into container + if [ "$CUSTOM_DNS" != "yes" ] && [ -f "/usr/local/etc/resolv.conf" ] && [ "$UPDATE_FILE_RESOLV" = "yes" ]; then + cp -f "/usr/local/etc/resolv.conf" "/etc/resolv.conf" 2>/dev/null || true + fi + # - - - - - - - - - - - - - - - - - - - - - - - - - + if [ -n "$HOME" ] && [ -d "/usr/local/etc/skel" ]; then + if [ -d "$HOME" ]; then + cp -Rf "/usr/local/etc/skel/." "$HOME/" 2>/dev/null || true + fi + fi # - - - - - - - - - - - - - - - - - - - - - - - - - fi # - - - - - - - - - - - - - - - - - - - - - - - - - # Delete any .gitkeep files (bash * does not match dotfiles by default, # so the explicit /.gitkeep path is required at each depth) if [ -d "/data" ]; then - rm -Rf "/data/.gitkeep" "/data"/*/.gitkeep 2>/dev/null || true + rm -Rf "/data/.gitkeep" "/data"/*/.gitkeep 2>/dev/null || true fi if [ -d "/config" ]; then - rm -Rf "/config/.gitkeep" "/config"/*/.gitkeep 2>/dev/null || true + rm -Rf "/config/.gitkeep" "/config"/*/.gitkeep 2>/dev/null || true fi if [ -f "/usr/local/bin/.gitkeep" ]; then - rm -Rf "/usr/local/bin/.gitkeep" 2>/dev/null || true + rm -Rf "/usr/local/bin/.gitkeep" 2>/dev/null || true fi # - - - - - - - - - - - - - - - - - - - - - - - - - # Only run initialization on first run or when directories are not initialized if [ "$ENTRYPOINT_FIRST_RUN" != "no" ] || [ "$CONFIG_DIR_INITIALIZED" = "no" ] || [ "$DATA_DIR_INITIALIZED" = "no" ]; then - # - - - - - - - - - - - - - - - - - - - - - - - - - - # Setup bin directory - /config/bin > /usr/local/bin - __initialize_custom_bin_dir - # - - - - - - - - - - - - - - - - - - - - - - - - - - # Initialize SSL certificates - __initialize_ssl_certs - # - - - - - - - - - - - - - - - - - - - - - - - - - - # Mark directories as initialized (only write if not already initialized) - if [ -d "/config" ] && [ "$CONFIG_DIR_INITIALIZED" = "no" ]; then - echo "Initialized on: $INIT_DATE" >"$ENTRYPOINT_CONFIG_INIT_FILE" 2>/dev/null || true - CONFIG_DIR_INITIALIZED="yes" - fi - # - - - - - - - - - - - - - - - - - - - - - - - - - - if [ -d "/data" ] && [ "$DATA_DIR_INITIALIZED" = "no" ]; then - echo "Initialized on: $INIT_DATE" >"$ENTRYPOINT_DATA_INIT_FILE" 2>/dev/null || true - DATA_DIR_INITIALIZED="yes" - fi - # - - - - - - - - - - - - - - - - - - - - - - - - - - if [ -d "/config" ] && [ ! -f "$ENTRYPOINT_INIT_FILE" ]; then - echo "Initialized on: $INIT_DATE" >"$ENTRYPOINT_INIT_FILE" 2>/dev/null || true - fi - # - - - - - - - - - - - - - - - - - - - - - - - - - - # setup the smtp server - __setup_mta - # - - - - - - - - - - - - - - - - - - - - - - - - - - ENTRYPOINT_FIRST_RUN="no" + # - - - - - - - - - - - - - - - - - - - - - - - - - + # Setup bin directory - /config/bin > /usr/local/bin + __initialize_custom_bin_dir + # - - - - - - - - - - - - - - - - - - - - - - - - - + # Initialize SSL certificates + __initialize_ssl_certs + # - - - - - - - - - - - - - - - - - - - - - - - - - + # Mark directories as initialized (only write if not already initialized) + if [ -d "/config" ] && [ "$CONFIG_DIR_INITIALIZED" = "no" ]; then + echo "Initialized on: $INIT_DATE" >"$ENTRYPOINT_CONFIG_INIT_FILE" 2>/dev/null || true + CONFIG_DIR_INITIALIZED="yes" + fi + # - - - - - - - - - - - - - - - - - - - - - - - - - + if [ -d "/data" ] && [ "$DATA_DIR_INITIALIZED" = "no" ]; then + echo "Initialized on: $INIT_DATE" >"$ENTRYPOINT_DATA_INIT_FILE" 2>/dev/null || true + DATA_DIR_INITIALIZED="yes" + fi + # - - - - - - - - - - - - - - - - - - - - - - - - - + if [ -d "/config" ] && [ ! -f "$ENTRYPOINT_INIT_FILE" ]; then + echo "Initialized on: $INIT_DATE" >"$ENTRYPOINT_INIT_FILE" 2>/dev/null || true + fi + # - - - - - - - - - - - - - - - - - - - - - - - - - + # setup the smtp server + __setup_mta || true + # - - - - - - - - - - - - - - - - - - - - - - - - - + ENTRYPOINT_FIRST_RUN="no" fi # - - - - - - - - - - - - - - - - - - - - - - - - - # if no pid assume container restart - clean stale files on restart if [ -f "$ENTRYPOINT_PID_FILE" ]; then - # Check if the PID in the file is still running - entrypoint_pid=$(<"$ENTRYPOINT_PID_FILE") 2>/dev/null - if [ -n "$entrypoint_pid" ] && kill -0 "$entrypoint_pid" 2>/dev/null; then - # Process is still running, don't restart services - START_SERVICES="no" - touch "$ENTRYPOINT_PID_FILE" - else - # PID file exists but process is dead - this is a restart - START_SERVICES="yes" - # Clean any stale PID files on restart - rm -f /run/.start_init_scripts.pid /run/init.d/*.pid /run/*.pid 2>/dev/null || true - fi + # Check if the PID in the file is still running + entrypoint_pid=$(<"$ENTRYPOINT_PID_FILE") 2>/dev/null + if [ -n "$entrypoint_pid" ] && kill -0 "$entrypoint_pid" 2>/dev/null; then + # Process is still running, don't restart services + START_SERVICES="no" + touch "$ENTRYPOINT_PID_FILE" + else + # PID file exists but process is dead - this is a restart + START_SERVICES="yes" + # Clean any stale PID files on restart + rm -f /run/.start_init_scripts.pid /run/init.d/*.pid /run/*.pid 2>/dev/null || true + fi else - START_SERVICES=yes - # Clean any stale PID files on first run - rm -f /run/.start_init_scripts.pid /run/init.d/*.pid /run/*.pid 2>/dev/null || true + START_SERVICES=yes + # Clean any stale PID files on first run + rm -f /run/.start_init_scripts.pid /run/init.d/*.pid /run/*.pid 2>/dev/null || true fi # - - - - - - - - - - - - - - - - - - - - - - - - - [ "$ENTRYPOINT_MESSAGE" = "yes" ] && __printf_space "40" "The containers ip address is:" "$CONTAINER_IP4_ADDRESS" # - - - - - - - - - - - - - - - - - - - - - - - - - # Show configured listing processes if [ "$ENTRYPOINT_MESSAGE" = "yes" ] && [ -n "$ENV_PORTS" ]; then - show_port="" - for port in $ENV_PORTS; do [ -n "$port" ] && show_port+="$(printf '%s ' "${port// /}") "; done - __printf_space "40" "The following ports are open:" "$show_port" - unset port show_port + show_port="" + for port in $ENV_PORTS; do [ -n "$port" ] && show_port+="$(printf '%s ' "${port// /}") "; done + __printf_space "40" "The following ports are open:" "$show_port" + unset port show_port fi # - - - - - - - - - - - - - - - - - - - - - - - - - # execute init script @@ -485,152 +485,152 @@ SKIP_SERVICE_START="no" # statement below instead of being swallowed into daemon/monitor mode, even # on a first run where START_SERVICES is force-set to "yes" if [ -z "$1" ]; then - if [ "$SKIP_SERVICE_START" = "no" ]; then - [ "$1" = "start" ] && shift 1 - [ "$1" = "all" ] && shift 1 - rm -Rf "/run"/*/*pid 2>/dev/null || true - echo "$$" >"$ENTRYPOINT_PID_FILE" - __start_init_scripts "/usr/local/etc/docker/init.d" - CONTAINER_INIT="${CONTAINER_INIT:-no}" - # Services started successfully - enter monitoring mode - __no_exit - exit $? - fi - START_SERVICES="no" + if [ "$SKIP_SERVICE_START" = "no" ]; then + [ "$1" = "start" ] && shift 1 + [ "$1" = "all" ] && shift 1 + rm -Rf "/run"/*/*pid 2>/dev/null || true + echo "$$" >"$ENTRYPOINT_PID_FILE" + __start_init_scripts "/usr/local/etc/docker/init.d" + CONTAINER_INIT="${CONTAINER_INIT:-no}" + # Services started successfully - enter monitoring mode + __no_exit + exit $? + fi + START_SERVICES="no" fi export START_SERVICES CONTAINER_INIT ENTRYPOINT_PID_FILE # - - - - - - - - - - - - - - - - - - - - - - - - - # Begin options case "$1" in init) - shift 1 - __log_info "Container has been initialized" - exit 0 - ;; + shift 1 + __log_info "Container has been initialized" + exit 0 + ;; tail) - shift 1 - case "$1" in - null) - shift $# - tail -F "/dev/null" - ;; - app) - shift $# - tail -F /data/logs/*/*.log - ;; - -*) - tail "$@" - ;; - *) - tail -F "${@:-/dev/null}" - ;; - esac - ;; + shift 1 + case "$1" in + null) + shift $# + tail -F "/dev/null" + ;; + app) + shift $# + tail -F /data/logs/*/*.log + ;; + -*) + tail "$@" + ;; + *) + tail -F "${@:-/dev/null}" + ;; + esac + ;; logs) - shift 1 - case "$1" in - follow) - tail -Fq /data/logs/*/* - ;; - clean) - mapfile -t log_files < <(find "/data/logs" -type f 2>/dev/null) - for log in "${log_files[@]}"; do - __log_info "Clearing log file: $log" - printf '' >"$log" - done - ;; - *) - echo "Usage: logs [follow,clean]" - exit 0 - ;; - esac - ;; + shift 1 + case "$1" in + follow) + tail -Fq /data/logs/*/* + ;; + clean) + mapfile -t log_files < <(find "/data/logs" -type f 2>/dev/null) + for log in "${log_files[@]}"; do + __log_info "Clearing log file: $log" + printf '' >"$log" + done + ;; + *) + echo "Usage: logs [follow,clean]" + exit 0 + ;; + esac + ;; cron) - shift 1 - __cron "$@" & - __log_info "Cron script is running with PID: $!" - exit - ;; + shift 1 + __cron "$@" & + __log_info "Cron script is running with PID: $!" + exit + ;; # backup data and config dirs backup) - shift 1 - __backup $BACKUP_MAX_DAYS $1 - exit $? - ;; + shift 1 + __backup $BACKUP_MAX_DAYS $1 + exit $? + ;; # Docker healthcheck healthcheck) - shift 1 - case "$1" in - init | test) - exit 0 - ;; - *) - arguments="$*" - healthStatus=0 - healthEnabled="${HEALTH_ENABLED:-}" - healthPorts="${WEB_SERVER_PORTS:-}" - healthEndPoints="${HEALTH_ENDPOINTS:-}" - SERVICES_LIST="${arguments:-$SERVICES_LIST}" - services="${SERVICES_LIST//,/ }" - healthMessage="Everything seems to be running" - [ "$healthEnabled" = "yes" ] || exit 0 - if [ -d "/run/healthcheck" ] && ! __is_dir_empty "/run/healthcheck"; then - for service in /run/healthcheck/*; do - name="${service##*/}" - services+="$name " - done - fi - services="$(printf '%s\n' $services | sort -u | grep -v '^$')" - for proc in $services; do - if [ -n "$proc" ]; then - if ! __pgrep "$proc"; then - echo "$proc is not running" >&2 - healthStatus=$((healthStatus + 1)) - fi - fi - done - for port in $healthPorts; do - if command -v netstat &>/dev/null && [ -n "$port" ]; then - if ! netstat -taupln | grep -q ":$port "; then - echo "$port isn't open" >&2 - healthStatus=$((healthStatus + 1)) - fi - fi - done - for endpoint in $healthEndPoints; do - if [ -n "$endpoint" ]; then - if ! __curl "$endpoint"; then - echo "Can not connect to $endpoint" >&2 - healthStatus=$((healthStatus + 1)) - fi - fi - done - [ "$healthStatus" -eq 0 ] || healthMessage="Errors reported see: docker logs --follow $CONTAINER_NAME" - [ -n "$healthMessage" ] && echo "$healthMessage" - exit $healthStatus - ;; - esac - ;; - # show open ports + shift 1 + case "$1" in + init | test) + exit 0 + ;; + *) + arguments="$*" + healthStatus=0 + healthEnabled="${HEALTH_ENABLED:-}" + healthPorts="${WEB_SERVER_PORTS:-}" + healthEndPoints="${HEALTH_ENDPOINTS:-}" + SERVICES_LIST="${arguments:-$SERVICES_LIST}" + services="${SERVICES_LIST//,/ }" + healthMessage="Everything seems to be running" + [ "$healthEnabled" = "yes" ] || exit 0 + if [ -d "/run/healthcheck" ] && ! __is_dir_empty "/run/healthcheck"; then + for service in /run/healthcheck/*; do + name="${service##*/}" + services+="$name " + done + fi + services="$(printf '%s\n' $services | sort -u | grep -v -- '^$')" + for proc in $services; do + if [ -n "$proc" ]; then + if ! __pgrep "$proc"; then + echo "$proc is not running" >&2 + healthStatus=$((healthStatus + 1)) + fi + fi + done + for port in $healthPorts; do + if command -v netstat &>/dev/null && [ -n "$port" ]; then + if ! netstat -taupln | grep -q -- ":$port "; then + echo "$port isn't open" >&2 + healthStatus=$((healthStatus + 1)) + fi + fi + done + for endpoint in $healthEndPoints; do + if [ -n "$endpoint" ]; then + if ! __curl "$endpoint"; then + echo "Can not connect to $endpoint" >&2 + healthStatus=$((healthStatus + 1)) + fi + fi + done + [ "$healthStatus" -eq 0 ] || healthMessage="Errors reported see: docker logs --follow $CONTAINER_NAME" + [ -n "$healthMessage" ] && echo "$healthMessage" + exit $healthStatus + ;; + esac + ;; + # show open ports ports) - shift 1 - ports="$(__netstat -taupln 2>/dev/null | awk '{ split($4, a, ":"); if (a[2] != "") print a[2] }' | sort -uV)" - [ -n "$ports" ] && printf '%s\n%s\n' "The following are servers:" "$ports" | tr '\n' ' ' - exit $? - ;; - # show running processes + shift 1 + ports="$(__netstat -taupln 2>/dev/null | awk '{ split($4, a, ":"); if (a[2] != "") print a[2] }' | sort -uV)" + [ -n "$ports" ] && printf '%s\n%s\n' "The following are servers:" "$ports" | tr '\n' ' ' + exit $? + ;; + # show running processes procs) - shift 1 - ps="$(__ps axco command 2>/dev/null | grep -vE '^(COMMAND|grep|ps)$' | sort -u)" - [ -n "$ps" ] && printf '%s\n%s\n' "Found the following processes" "$ps" | tr '\n' ' ' - exit $? - ;; + shift 1 + ps="$(__ps axco command 2>/dev/null | grep -vE -- '^(COMMAND|grep|ps)$' | sort -u)" + [ -n "$ps" ] && printf '%s\n%s\n' "Found the following processes" "$ps" | tr '\n' ' ' + exit $? + ;; # Launch shell # Launch shell — do not shift here: "sh -c 'cmd'" / "bash -c 'cmd'" needs the # interpreter name kept as argv[0] for __exec_command's `exec "$@"` to work; # shifting it away turned "sh -c 'cmd'" into `exec -c cmd` (command not found) */bin/sh | */bin/bash | bash | sh) - __exec_command "${@:-/bin/bash -l}" + __exec_command "$@" exit $? ;; # "shell" is a keyword, not a real interpreter — it must be shifted away, and @@ -647,43 +647,47 @@ shell) ;; # execute commands exec) - shift 1 - __exec_command "${@:-echo "No commands given"}" - exit $? - ;; + shift 1 + if [ $# -eq 0 ]; then + echo "No command given to exec" >&2 + exit 1 + fi + __exec_command "$@" + exit $? + ;; # show/start init scripts start) - shift 1 - export PATH="/usr/local/etc/docker/init.d:$PATH" - if [ $# -eq 0 ]; then - scripts="$(ls -A "/usr/local/etc/docker/init.d")" - [ -n "$scripts" ] && echo "$scripts" || echo "No scripts found in: /usr/local/etc/docker/init.d" - exit - elif [ "$1" = "all" ]; then - shift $# - if [ "$START_SERVICES" = "yes" ]; then - echo "$$" >"$ENTRYPOINT_PID_FILE" - __start_init_scripts "/usr/local/etc/docker/init.d" - __no_exit - elif [ -f "/usr/local/etc/docker/init.d/$1" ]; then - eval "/usr/local/etc/docker/init.d/$1" & - __no_exit - fi - fi - ;; + shift 1 + export PATH="/usr/local/etc/docker/init.d:$PATH" + if [ $# -eq 0 ]; then + scripts="$(ls -A "/usr/local/etc/docker/init.d")" + [ -n "$scripts" ] && echo "$scripts" || echo "No scripts found in: /usr/local/etc/docker/init.d" + exit + elif [ "$1" = "all" ]; then + shift $# + if [ "$START_SERVICES" = "yes" ]; then + echo "$$" >"$ENTRYPOINT_PID_FILE" + __start_init_scripts "/usr/local/etc/docker/init.d" + __no_exit + elif [ -f "/usr/local/etc/docker/init.d/$1" ]; then + eval "/usr/local/etc/docker/init.d/$1" & + __no_exit + fi + fi + ;; # Execute primary command *) - if [ $# -eq 0 ]; then - if [ ! -f "$ENTRYPOINT_PID_FILE" ]; then - echo "$$" >"$ENTRYPOINT_PID_FILE" - [ "$START_SERVICES" = "no" ] && [ "$CONTAINER_INIT" = "yes" ] || __start_init_scripts "/usr/local/etc/docker/init.d" - fi - __no_exit - else - __exec_command "$@" - fi - exit $? - ;; + if [ $# -eq 0 ]; then + if [ ! -f "$ENTRYPOINT_PID_FILE" ]; then + echo "$$" >"$ENTRYPOINT_PID_FILE" + [ "$START_SERVICES" = "no" ] && [ "$CONTAINER_INIT" = "yes" ] || __start_init_scripts "/usr/local/etc/docker/init.d" + fi + __no_exit + else + __exec_command "$@" + fi + exit $? + ;; esac # - - - - - - - - - - - - - - - - - - - - - - - - - # end of entrypoint diff --git a/rootfs/usr/local/etc/docker/functions/entrypoint.sh b/rootfs/usr/local/etc/docker/functions/entrypoint.sh index b5b8627..451e7a2 100644 --- a/rootfs/usr/local/etc/docker/functions/entrypoint.sh +++ b/rootfs/usr/local/etc/docker/functions/entrypoint.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202607271325-git +##@Version : 202608030955-git # @@Author : Jason Hempstead # @@Contact : git-admin@casjaysdev.pro # @@License : LICENSE.md @@ -10,7 +10,7 @@ # @@Created : Sunday, Sep 03, 2023 01:40 EDT # @@File : docker-entrypoint # @@Description : functions for my docker containers -# @@Changelog : fix __setup_mta calling __symlink with from/to swapped, which no-op'd the symlink and broke msmtp/ssmtp/postfix config on container start +# @@Changelog : fix __symlink/__initialize_ssl_certs returning nonzero on success under set -e, aborting the entrypoint on symlink success # @@TODO : Refactor code # @@Other : # @@Resource : @@ -35,7 +35,7 @@ fi __remove_extra_spaces() { sed -E 's/ +/ /g; s|^ ||'; } # - - - - - - - - - - - - - - - - - - - - - - - - - __log_debug() { - [ "$DEBUGGER" = "on" ] && echo "[DEBUG] $*" >&2 || true + [ "$DEBUGGER" = "on" ] && echo "[DEBUG] $*" >&2 } __log_info() { echo "[INFO] $*" @@ -62,7 +62,7 @@ __printf_space() { __mkdir() { if [ -n "$1" ]; then if ! mkdir -p "$@" 2>/dev/null; then - [ "$DEBUGGER" = "on" ] && echo "Warning: Failed to create directory: $*" >&2 || true + [ "$DEBUGGER" = "on" ] && echo "Warning: Failed to create directory: $*" >&2 return 1 fi fi @@ -71,7 +71,7 @@ __mkdir() { __rm() { if [ -n "$1" ] && [ -e "$1" ]; then if ! rm -Rf "${1:?}" 2>/dev/null; then - [ "$DEBUGGER" = "on" ] && echo "Warning: Failed to remove: $1" >&2 || true + [ "$DEBUGGER" = "on" ] && echo "Warning: Failed to remove: $1" >&2 return 1 fi fi @@ -80,7 +80,7 @@ __rm() { __grep_test() { grep -sh "$1" "$2" 2>/dev/null | grep -qwF "${3:-$1}"; } __netstat() { command -v netstat &>/dev/null || { - [ "$DEBUGGER" = "on" ] && echo "Warning: netstat command not found" >&2 || true + [ "$DEBUGGER" = "on" ] && echo "Warning: netstat command not found" >&2 return 10 } netstat "$@" 2>/dev/null @@ -171,7 +171,7 @@ __is_running() { } __get_pid() { if [ -z "$1" ]; then - [ "$DEBUGGER" = "on" ] && echo "Warning: __get_pid called without process name" >&2 || true + [ "$DEBUGGER" = "on" ] && echo "Warning: __get_pid called without process name" >&2 return 1 fi local pid @@ -180,7 +180,7 @@ __get_pid() { echo "$pid" return 0 fi - [ "$DEBUGGER" = "on" ] && echo "Debug: No PID found for process: $1" >&2 || true + [ "$DEBUGGER" = "on" ] && echo "Debug: No PID found for process: $1" >&2 return 1 } # - - - - - - - - - - - - - - - - - - - - - - - - - @@ -368,7 +368,7 @@ __init_working_dir() { # cd to dir __cd "${workdir:-$home}" # - - - - - - - - - - - - - - - - - - - - - - - - - - [ "$DEBUGGER" = "on" ] && echo "Setting the working directory to: $PWD" || true + [ "$DEBUGGER" = "on" ] && echo "Setting the working directory to: $PWD" # - - - - - - - - - - - - - - - - - - - - - - - - - export WORK_DIR="$workdir" HOME="$home" } @@ -376,7 +376,7 @@ __init_working_dir() { __exec_service() { local count=6 local bgpid - [ "$DEBUGGER" = "on" ] && echo "Starting $1" || true + [ "$DEBUGGER" = "on" ] && echo "Starting $1" eval "$@" & bgpid=$! while [ $count -ne 0 ]; do @@ -607,7 +607,7 @@ __cron() { [ -d "/run/cron" ] || mkdir -p "/run/cron" echo "$pid" >"/run/cron/$bin.pid" echo "$command" >"/run/cron/$bin.run" - [ "$DEBUGGER" = "on" ] && echo "Log is saved to /data/logs/cron.log" || true + [ "$DEBUGGER" = "on" ] && echo "Log is saved to /data/logs/cron.log" # eval is intentional: $command is operator-controlled input from this container's init while :; do eval "$command" @@ -645,7 +645,15 @@ __symlink() { [ "$from" = "$to" ] && return 0 __rm "$from" [ -d "${from%/*}" ] || mkdir -p "${from%/*}" 2>/dev/null - ln -sf "$to" "$from" && [ "$DEBUGGER" = "on" ] && echo "Created symlink: $from -> $to" || true + # Debug echo is decoupled from the return value on purpose — under + # set -eo pipefail, a bare "[ "$DEBUGGER" = on ] && echo" tail made this + # function return 1 (aborting the whole entrypoint) whenever the symlink + # succeeded but DEBUGGER was unset, since that's the normal/default case + if ln -sf "$to" "$from"; then + [ "$DEBUGGER" = "on" ] && echo "Created symlink: $from -> $to" + return 0 + fi + return 1 } # - - - - - - - - - - - - - - - - - - - - - - - - - __file_copy() { @@ -657,7 +665,7 @@ __file_copy() { if [ -n "$from" ] && [ -e "$from" ] && [ -n "$dest" ]; then if [ -d "$from" ]; then if cp -Rf "$from/." "$dest/" &>/dev/null; then - [ "$DEBUGGER" = "on" ] && printf '%s\n' "Copied: $from > $dest" || true + [ "$DEBUGGER" = "on" ] && printf '%s\n' "Copied: $from > $dest" return 0 else printf '%s\n' "Copy failed: $from < $dest" >&2 @@ -665,7 +673,7 @@ __file_copy() { fi else if cp -Rf "$from" "$dest" &>/dev/null; then - [ "$DEBUGGER" = "on" ] && printf '%s\n' "Copied: $from > $dest" || true + [ "$DEBUGGER" = "on" ] && printf '%s\n' "Copied: $from > $dest" return 0 else printf '%s\n' "Copy failed: $from < $dest" >&2 @@ -703,7 +711,7 @@ __setup_directories() { __initialize_www_root mkdir -p "$WWW_ROOT_DIR" 2>/dev/null find "$WWW_ROOT_DIR" -type d -exec chmod -f 777 {} \; 2>/dev/null - [ "$DEBUGGER" = "on" ] && echo "Created directory $WWW_ROOT_DIR" || true + [ "$DEBUGGER" = "on" ] && echo "Created directory $WWW_ROOT_DIR" fi # Setup DATABASE_DIR if [ "$IS_DATABASE_SERVICE" = "yes" ] || [ "$USES_DATABASE_SERVICE" = "yes" ]; then @@ -711,7 +719,7 @@ __setup_directories() { if __is_dir_empty "$DATABASE_DIR" || [ ! -d "$DATABASE_DIR" ]; then mkdir -p "$DATABASE_DIR" 2>/dev/null chmod -f 777 "$DATABASE_DIR" 2>/dev/null - [ "$DEBUGGER" = "on" ] && echo "Created directory $DATABASE_DIR" || true + [ "$DEBUGGER" = "on" ] && echo "Created directory $DATABASE_DIR" fi fi # create default directories @@ -719,7 +727,7 @@ __setup_directories() { if [ -n "$filedirs" ] && [ ! -d "$filedirs" ]; then mkdir -p "$filedirs" 2>/dev/null chmod -f 777 "$filedirs" 2>/dev/null - [ "$DEBUGGER" = "on" ] && echo "Created directory $filedirs" || true + [ "$DEBUGGER" = "on" ] && echo "Created directory $filedirs" fi done # create default files @@ -727,7 +735,7 @@ __setup_directories() { if [ -n "$application_files" ] && [ ! -e "$application_files" ]; then touch "$application_files" 2>/dev/null chmod -Rf 777 "$application_files" 2>/dev/null - [ "$DEBUGGER" = "on" ] && echo "Created file $application_files" || true + [ "$DEBUGGER" = "on" ] && echo "Created file $application_files" fi done } @@ -742,7 +750,7 @@ __fix_permissions() { for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do if [ -n "$permissions" ] && [ -e "$permissions" ]; then chown -Rf "$change_user" "$permissions" 2>/dev/null - [ "$DEBUGGER" = "on" ] && echo "Changed ownership of $permissions to $change_user" || true + [ "$DEBUGGER" = "on" ] && echo "Changed ownership of $permissions to $change_user" fi done fi @@ -752,7 +760,7 @@ __fix_permissions() { for permissions in $ADD_APPLICATION_DIRS $APPLICATION_DIRS; do if [ -n "$permissions" ] && [ -e "$permissions" ]; then chgrp -Rf "$change_group" "$permissions" 2>/dev/null - [ "$DEBUGGER" = "on" ] && echo "Changed group of $permissions to $change_group" || true + [ "$DEBUGGER" = "on" ] && echo "Changed group of $permissions to $change_group" fi done fi @@ -1002,7 +1010,7 @@ __start_init_scripts() { # Clean stale PID files from previous runs if [ ! -f "/run/.start_init_scripts.pid" ]; then - [ "$DEBUGGER" = "on" ] && echo "Cleaning stale PID files from previous container run" || true + [ "$DEBUGGER" = "on" ] && echo "Cleaning stale PID files from previous container run" rm -f /run/*.pid /run/init.d/*.pid 2>/dev/null || true fi @@ -1030,7 +1038,7 @@ __start_init_scripts() { touch "$pidFile" name="${init##*/}" service="${name#*-}"; service="${service%.sh}" - [ "$DEBUGGER" = "on" ] && __service_banner "🔧" "Executing service script:" "${init##*/}" || true + [ "$DEBUGGER" = "on" ] && __service_banner "🔧" "Executing service script:" "${init##*/}" # Execute the init script and capture the exit code (subshell isolates exit calls) if ( source "$init" ); then # Check if service was disabled first @@ -1180,14 +1188,13 @@ EOF if [ ! -e "/usr/sbin/sendmail" ] && command -v msmtp &>/dev/null; then __symlink "/usr/sbin/sendmail" "$(command -v msmtp)" fi - [ "$DEBUGGER" = "on" ] && echo "Done setting up msmtp" || true + [ "$DEBUGGER" = "on" ] && echo "Done setting up msmtp" fi ################# sSMTP relay setup elif command -v ssmtp &>/dev/null; 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 >"/config/ssmtp/ssmtp.conf" <"/config/postfix/main.cf" </dev/null | sort -u | sed 's|/config/||') directories=$(find "$conf_dir"/* -not -path '*/env/*' -type d 2>/dev/null | sort -u | sed 's|/config/||') - [ "$DEBUGGER" = "on" ] && echo "Copying config: $conf_dir > /etc/${conf_dir//\/config\//}" || true + [ "$DEBUGGER" = "on" ] && echo "Copying config: $conf_dir > /etc/${conf_dir//\/config\//}" if [ -n "$directories" ]; then for d in $directories; do dir="/etc/$d" mkdir -p "$dir" - [ "$DEBUGGER" = "on" ] && echo "Created directory: $dir" || true + [ "$DEBUGGER" = "on" ] && echo "Created directory: $dir" done fi for f in $files; do @@ -1410,7 +1422,7 @@ __initialize_custom_bin_dir() { [ -d "/data/bin" ] && SET_USR_BIN+="$(__find /data/bin f) " [ -d "/config/bin" ] && SET_USR_BIN+="$(__find /config/bin f) " if [ -n "$SET_USR_BIN" ]; then - [ "$DEBUGGER" = "on" ] && echo "Setting up bin: $SET_USR_BIN > $LOCAL_BIN_DIR" || true + [ "$DEBUGGER" = "on" ] && echo "Setting up bin: $SET_USR_BIN > $LOCAL_BIN_DIR" for create_bin_template in $SET_USR_BIN; do if [ -n "$create_bin_template" ]; then create_bin_name="${create_bin_template##*/}" @@ -1485,7 +1497,13 @@ __initialize_ssl_certs() { __create_ssl_cert fi fi - type update-ca-certificates &>/dev/null && update-ca-certificates &>/dev/null + # Explicit return so a missing update-ca-certificates binary (common on + # minimal images) never becomes this function's return value — under + # set -eo pipefail that would abort the caller when this is called bare + if type update-ca-certificates &>/dev/null; then + update-ca-certificates &>/dev/null + fi + return 0 } # - - - - - - - - - - - - - - - - - - - - - - - - - __start_php_dev_server() {