diff --git a/bin/mc-send-to-console b/bin/mc-send-to-console index 80a310c4..19b6deeb 100755 --- a/bin/mc-send-to-console +++ b/bin/mc-send-to-console @@ -3,26 +3,22 @@ : "${CONSOLE_IN_NAMED_PIPE:=/tmp/minecraft-console-in}" if isFalse "${CREATE_CONSOLE_IN_PIPE:-false}"; then - echo "ERROR: console pipe needs to be enabled by setting CREATE_CONSOLE_IN_PIPE to true" + error "Console pipe needs to be enabled by setting CREATE_CONSOLE_IN_PIPE to true" fi if [ $# = 0 ]; then - echo "ERROR: pass console commands as arguments" + error "Pass console commands as arguments" exit 1 fi if [ ! -p "${CONSOLE_IN_NAMED_PIPE}" ]; then - echo "ERROR: named pipe ${CONSOLE_IN_NAMED_PIPE} is missing" + error "Named pipe ${CONSOLE_IN_NAMED_PIPE} is missing" exit 1 fi if [ "$(id -u)" = 0 -a $UID != 0 ]; then - if [[ $(getDistro) == alpine ]]; then - exec su-exec minecraft bash -c "echo '$*' > '${CONSOLE_IN_NAMED_PIPE:-/tmp/minecraft-console-in}'" - else - exec gosu minecraft bash -c "echo '$*' > '${CONSOLE_IN_NAMED_PIPE:-/tmp/minecraft-console-in}'" - fi + exec $(getSudoFromDistro) minecraft bash -c "echo '$*' > '${CONSOLE_IN_NAMED_PIPE}'" else - echo "$@" >"${CONSOLE_IN_NAMED_PIPE:-/tmp/minecraft-console-in}" + echo "$@" >"${CONSOLE_IN_NAMED_PIPE}" fi diff --git a/bin/mcstatus b/bin/mcstatus index e7e314b8..83db3287 100755 --- a/bin/mcstatus +++ b/bin/mcstatus @@ -1,6 +1,6 @@ #!/bin/bash -echo "WARNING: mcstatus is deprecated; calling mc-monitor instead" +warning "mcstatus is deprecated; calling mc-monitor instead" ##### mcstatus shim for mc-monitor # handles translating calls to @@ -11,8 +11,8 @@ addr="$1" IFS=':' read -a parts <<< "${addr}" +args=(--host ${parts[0]}) if [[ ${#parts[*]} -gt 1 ]]; then - exec mc-monitor status --host ${parts[0]} --port ${parts[1]} -else - exec mc-monitor status --host ${parts[0]} + args+=(--port ${parts[1]}) fi +exec mc-monitor ${args[@]} \ No newline at end of file diff --git a/scripts/start b/scripts/start index 9d45a9a7..cb7062a5 100755 --- a/scripts/start +++ b/scripts/start @@ -48,12 +48,7 @@ if ! isTrue "${SKIP_SUDO:-false}" && [ "$(id -u)" = 0 ]; then echo 'hosts: files dns' > /etc/nsswitch.conf fi - distro=$(getDistro) - if [[ $distro == alpine ]]; then - exec su-exec ${runAsUser}:${runAsGroup} "${SCRIPTS:-/}start-configuration" "$@" - else - exec gosu ${runAsUser}:${runAsGroup} "${SCRIPTS:-/}start-configuration" "$@" - fi + exec $(getSudoFromDistro) ${runAsUser}:${runAsGroup} "${SCRIPTS:-/}start-configuration" "$@" else exec "${SCRIPTS:-/}start-configuration" "$@" fi diff --git a/scripts/start-autopause b/scripts/start-autopause index 59d5c76b..3bccc52f 100755 --- a/scripts/start-autopause +++ b/scripts/start-autopause @@ -26,60 +26,40 @@ isDebugging && set -x cp /auto/knockd-config.cfg /tmp/knockd-config.cfg -# update server port to listen to -regseq="^\s*sequence\s*=\s*$SERVER_PORT\s*$" -linenum=$(grep -nm1 sequence /tmp/knockd-config.cfg | cut -d : -f 1 | tail -n1) -if ! [[ $(awk "NR==$linenum" /tmp/knockd-config.cfg) =~ $regseq ]]; then - sed -i "${linenum}s/sequence.*/sequence = $SERVER_PORT/" /tmp/knockd-config.cfg - log "Updated server port in knockd config" -fi -# update rcon port to listen to -regseq="^\s*sequence\s*=\s*$RCON_PORT\s*$" -linenum=$(grep -nm2 sequence /tmp/knockd-config.cfg | cut -d : -f 1 | tail -n1) -if ! [[ $(awk "NR==$linenum" /tmp/knockd-config.cfg) =~ $regseq ]]; then - sed -i "${linenum}s/sequence.*/sequence = $RCON_PORT/" /tmp/knockd-config.cfg - log "Updated rcon port in knockd config" -fi +function updatePort() { + regseq="^\s*sequence\s*=\s*$1\s*$" + linenum=$(grep -nm${2} sequence /tmp/knockd-config.cfg | cut -d : -f 1 | tail -n1) + if ! [[ $(awk "NR==$linenum" /tmp/knockd-config.cfg) =~ $regseq ]]; then + sed -i "${linenum}s/sequence.*/sequence = $1/" /tmp/knockd-config.cfg + log "Updated $3 port in knockd config" + fi +} + +# update server port to listen to +updatePort $SERVER_PORT 1 "server" + +# update rcon port to listen to +updatePort $RCON_PORT 2 "rcon" + +isNumericElseSetToDefault "AUTOPAUSE_PERIOD" 10 +checkIfNotZeroElseSetToDefault "AUTOPAUSE_PERIOD" 10 +isNumericElseSetToDefault "AUTOPAUSE_TIMEOUT_KN" 120 +isNumericElseSetToDefault "AUTOPAUSE_TIMEOUT_EST" 3600 +isNumericElseSetToDefault "AUTOPAUSE_TIMEOUT_INIT" 600 -if ! [[ $AUTOPAUSE_PERIOD =~ ^[0-9]+$ ]]; then - AUTOPAUSE_PERIOD=10 - export AUTOPAUSE_PERIOD - log "Warning: AUTOPAUSE_PERIOD is not numeric, set to 10 (seconds)" -fi -if [ "$AUTOPAUSE_PERIOD" -eq "0" ] ; then - AUTOPAUSE_PERIOD=10 - export AUTOPAUSE_PERIOD - log "Warning: AUTOPAUSE_PERIOD must not be 0, set to 10 (seconds)" -fi -if ! [[ $AUTOPAUSE_TIMEOUT_KN =~ ^[0-9]+$ ]] ; then - AUTOPAUSE_TIMEOUT_KN=120 - export AUTOPAUSE_TIMEOUT_KN - log "Warning: AUTOPAUSE_TIMEOUT_KN is not numeric, set to 120 (seconds)" -fi -if ! [[ $AUTOPAUSE_TIMEOUT_EST =~ ^[0-9]+$ ]] ; then - AUTOPAUSE_TIMEOUT_EST=3600 - export AUTOPAUSE_TIMEOUT_EST - log "Warning: AUTOPAUSE_TIMEOUT_EST is not numeric, set to 3600 (seconds)" -fi -if ! [[ $AUTOPAUSE_TIMEOUT_INIT =~ ^[0-9]+$ ]] ; then - AUTOPAUSE_TIMEOUT_INIT=600 - export AUTOPAUSE_TIMEOUT_INIT - log "Warning: AUTOPAUSE_TIMEOUT_INIT is not numeric, set to 600 (seconds)" -fi if [[ "$AUTOPAUSE_KNOCK_INTERFACE" == "lo" ]] ; then - log "Warning: AUTOPAUSE_KNOCK_INTERFACE is set to the local loopback interface." - log " This is not advisable, as incoming connections are likely not picked up there." - log " Continuing with this setting." + logWarning "AUTOPAUSE_KNOCK_INTERFACE is set to the local loopback interface." + logWarning " This is not advisable, as incoming connections are likely not picked up there." + logWarning " Continuing with this setting." fi if [[ -n "$MAX_TICK_TIME" && "$MAX_TICK_TIME" != "-1" ]] ; then - log "Warning: MAX_TICK_TIME is non-default, for autopause to work properly, this check should be disabled (-1 for versions >= 1.8.1)" + logWarning "MAX_TICK_TIME is non-default, for autopause to work properly, this check should be disabled (-1 for versions >= 1.8.1)" elif [[ -z "$MAX_TICK_TIME" ]] ; then + MAX_TICK_TIME=-1 if versionLessThan 1.8.1; then # 10 years MAX_TICK_TIME=315360000000 - else - MAX_TICK_TIME=-1 fi export MAX_TICK_TIME fi diff --git a/scripts/start-autostop b/scripts/start-autostop index e21de3d7..dd7dca7c 100755 --- a/scripts/start-autostop +++ b/scripts/start-autostop @@ -20,25 +20,9 @@ log "Autostop functionality enabled" isDebugging && set -x -if ! [[ $AUTOSTOP_PERIOD =~ ^[0-9]+$ ]]; then - AUTOSTOP_PERIOD=10 - export AUTOSTOP_PERIOD - log "Warning: AUTOSTOP_PERIOD is not numeric, set to 10 (seconds)" -fi -if [ "$AUTOSTOP_PERIOD" -eq "0" ] ; then - AUTOSTOP_PERIOD=10 - export AUTOSTOP_PERIOD - log "Warning: AUTOSTOP_PERIOD must not be 0, set to 10 (seconds)" -fi -if ! [[ $AUTOSTOP_TIMEOUT_EST =~ ^[0-9]+$ ]] ; then - AUTOSTOP_TIMEOUT_EST=3600 - export AUTOSTOP_TIMEOUT_EST - log "Warning: AUTOSTOP_TIMEOUT_EST is not numeric, set to 3600 (seconds)" -fi -if ! [[ $AUTOSTOP_TIMEOUT_INIT =~ ^[0-9]+$ ]] ; then - AUTOSTOP_TIMEOUT_INIT=1800 - export AUTOSTOP_TIMEOUT_INIT - log "Warning: AUTOSTOP_TIMEOUT_INIT is not numeric, set to 1800 (seconds)" -fi +isNumericElseSetToDefault "AUTOSTOP_PERIOD" 10 +checkIfNotZeroElseSetToDefault "AUTOSTOP_PERIOD" 10 +isNumericElseSetToDefault "AUTOSTOP_TIMEOUT_EST" 3600 +isNumericElseSetToDefault "AUTOSTOP_TIMEOUT_INIT" 1800 /auto/autostop-daemon.sh & diff --git a/scripts/start-configuration b/scripts/start-configuration index 05d4d830..ed398a04 100755 --- a/scripts/start-configuration +++ b/scripts/start-configuration @@ -36,10 +36,10 @@ log "Running as uid=$(id -u) gid=$(id -g) with /data as '$(ls -lnd /data)'" if [ ! -e /data/eula.txt ]; then if ! isTrue "$EULA"; then log "" - log "Please accept the Minecraft EULA at" - log " https://account.mojang.com/documents/minecraft_eula" - log "by adding the following immediately after 'docker run':" - log " -e EULA=TRUE" + logError "Please accept the Minecraft EULA at" + logError " https://account.mojang.com/documents/minecraft_eula" + logError "by adding the following immediately after 'docker run':" + logError " -e EULA=TRUE" log "" exit 1 fi @@ -63,10 +63,10 @@ if isTrue "${ENABLE_RCON:-true}"; then if [[ -v RCON_PASSWORD_FILE ]]; then if [ ! -e "${RCON_PASSWORD_FILE}" ]; then log "" - log "Initial RCON password file ${RCON_PASSWORD_FILE} does not seems to exist." - log "Please ensure your configuration." - log "If you are using Docker Secrets feature, please check this for further information: " - log " https://docs.docker.com/engine/swarm/secrets" + logError "Initial RCON password file ${RCON_PASSWORD_FILE} does not seems to exist." + logError "Please ensure your configuration." + logError "If you are using Docker Secrets feature, please check this for further information: " + logError " https://docs.docker.com/engine/swarm/secrets" log "" exit 1 else @@ -91,12 +91,12 @@ fi # Auto-pause/stop if isTrue "${ENABLE_AUTOPAUSE}" && isTrue "${EXEC_DIRECTLY:-false}"; then - log "EXEC_DIRECTLY=true is incompatible with ENABLE_AUTOPAUSE=true" + logError "EXEC_DIRECTLY=true is incompatible with ENABLE_AUTOPAUSE=true" exit 1 fi if isTrue "${ENABLE_AUTOPAUSE}" && isTrue "${ENABLE_AUTOSTOP}"; then - log "ENABLE_AUTOPAUSE=true is incompatible with ENABLE_AUTOSTOP=true" + logError "ENABLE_AUTOPAUSE=true is incompatible with ENABLE_AUTOSTOP=true" exit 1 fi @@ -112,9 +112,9 @@ function fixJavaPath() { # Some Docker management UIs grab all the image declared variables and present them for configuration. # When upgrading images across Java versions, that creates a mismatch in PATH's expected by base image. if ! which java > /dev/null; then - log "ERROR: your Docker provider has an annoying flaw where it" - log " tries to set PATH even though the container establishes" - log " a very specific value." + logError " Your Docker provider has an annoying flaw where it" + logError " tries to set PATH even though the container establishes" + logError " a very specific value." sleep 2 # now find where java might be for d in /opt/java/openjdk/bin /usr/bin; do @@ -129,7 +129,7 @@ function fixJavaPath() { if ! fixJavaPath; then - log "ERROR: could not locate path that contains java" + logError "could not locate path that contains java" exit 1 fi @@ -184,7 +184,7 @@ if [[ $MOD_PLATFORM ]]; then ;; *) - log "ERROR; Invalid MOD_PLATFORM: '$MOD_PLATFORM'" + logError "Invalid MOD_PLATFORM: '$MOD_PLATFORM'" exit 1 ;; esac @@ -219,7 +219,7 @@ case "${TYPE^^}" in QUILT) exec "${SCRIPTS:-/}start-deployQuilt" "$@" ;; - + VANILLA) exec "${SCRIPTS:-/}start-deployVanilla" "$@" ;; @@ -273,11 +273,11 @@ case "${TYPE^^}" in ;; *) - log "ERROR: Invalid TYPE: '$TYPE'" - log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FOLIA, PURPUR, FABRIC, QUILT," - log " SPONGEVANILLA, CUSTOM, MAGMA, MOHIST, CATSERVER, AIRPLANE, PUFFERFISH," - log " CANYON, LIMBO, CRUCIBLE" + logError "Invalid TYPE: '$TYPE'" + logError "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FOLIA, PURPUR, FABRIC, QUILT," + logError " SPONGEVANILLA, CUSTOM, MAGMA, MOHIST, CATSERVER, AIRPLANE, PUFFERFISH," + logError " CANYON, LIMBO, CRUCIBLE" exit 1 ;; -esac +esac \ No newline at end of file diff --git a/scripts/start-deployAutoCF b/scripts/start-deployAutoCF index 15a8c846..5df58a78 100644 --- a/scripts/start-deployAutoCF +++ b/scripts/start-deployAutoCF @@ -57,15 +57,11 @@ setArg --exclude-include-file CF_EXCLUDE_INCLUDE_FILE setArg --downloads-repo CF_DOWNLOADS_REPO if ! mc-image-helper install-curseforge "${args[@]}"; then - log "ERROR failed to auto-install CurseForge modpack" + logError "Failed to auto-install CurseForge modpack" exit 1 fi -# grab SERVER, TYPE, VERSION and export it -set -a -# shellcheck disable=SC1090 -source "${resultsFile}" -set +a +applyResultsFile ${resultsFile} resolveFamily exec "${SCRIPTS:-/}start-setupWorld" "$@" diff --git a/scripts/start-deployBukkitSpigot b/scripts/start-deployBukkitSpigot index 72c8a8a0..ce48d211 100755 --- a/scripts/start-deployBukkitSpigot +++ b/scripts/start-deployBukkitSpigot @@ -6,47 +6,56 @@ isDebugging && set -x set -eo pipefail +spigotBuildLog="/data/spigot_build.log" + +function handleFailedSpigotBuild { + logError "Failed to build Spigot" + cat ${spigotBuildLog} + exit 1 +} + + function buildSpigotFromSource { + local tempDir="/data/temp" + if [[ ${TYPE^^} = *BUKKIT ]] && ! versionLessThan "1.14"; then - log "ERR craftbukkit build is only supported for versions less than 1.14" + logError "Craftbukkit build is only supported for versions less than 1.14" exit 1 fi log "Building Spigot $VANILLA_VERSION from source, might take a while, get some coffee" - rm -rf /data/temp - mkdir /data/temp - cd /data/temp + rm -rf ${tempDir} + mkdir ${tempDir} + cd ${tempDir} jvmOpts="-Xms${INIT_MEMORY:-$MEMORY} -Xmx${MAX_MEMORY:-$MEMORY}" logn '' - curl -sSL -o /data/temp/BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar && \ - java $jvmOpts -jar /data/temp/BuildTools.jar --rev "$VERSION" 2>&1 |tee /data/spigot_build.log| while read l; do echo -n .; done; log "done" + curl -sSL -o ${tempDir}/BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar && \ + java $jvmOpts -jar ${tempDir}/BuildTools.jar --rev "$VERSION" 2>&1 |tee ${spigotBuildLog}| while read l; do echo -n .; done; log "done" case ${TYPE^^} in SPIGOT) if ! mv spigot-*.jar "/data/${SERVER}"; then - log "ERR failed to build Spigot" - cat /data/spigot_build.log - exit 1 + handleFailedSpigotBuild fi ;; *BUKKIT) if ! mv craftbukkit-*.jar "/data/${SERVER}"; then - log "ERR failed to build Spigot" - cat /data/spigot_build.log - exit 1 + handleFailedSpigotBuild fi ;; esac log "Cleaning up" - rm -rf /data/temp + rm -rf ${tempDir} cd /data } function downloadSpigot { local match + local getBukkitBaseUrl="https://getbukkit.org/download/" + local getBukkitSpigotUrl="${getBukkitBaseUrl}spigot" case "$TYPE" in *BUKKIT|*bukkit) match="CraftBukkit" @@ -61,18 +70,21 @@ function downloadSpigot { esac if [[ ${VERSION^^} = LATEST ]]; then - if ! VERSION=$(restify https://getbukkit.org/download/spigot --attribute='property=og:title' | jq -r '.[0] | .attributes | select(.property == "og:title") | .content | split(" ") | .[-1]'); then - log "ERROR: failed to retrieve latest version from https://getbukkit.org/download/spigot -- site might be down" + if ! VERSION=$(restify ${getBukkitSpigotUrl} --attribute='property=og:title' | jq -r '.[0] | .attributes | select(.property == "og:title") | .content | split(" ") | .[-1]'); then + logError "Failed to retrieve latest version from ${getBukkitSpigotUrl} -- site might be down" exit 1 fi fi if [[ -z $downloadUrl ]]; then + downloadBaseUrl="https://" + downloadSuffixUrl=".getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VERSION}.jar" if versionLessThan 1.16.5 || { [[ ${getbukkitFlavor} = "craftbukkit" ]] && [[ ${VERSION} = "1.16.5" ]] ; }; then - downloadUrl="https://cdn.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VERSION}.jar" + downloadBaseUrl+="cdn" else - downloadUrl="https://download.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VERSION}.jar" + downloadBaseUrl+="download" fi + downloadUrl="${downloadBaseUrl}${downloadSuffixUrl}" fi setServerVar @@ -94,7 +106,7 @@ function downloadSpigot { cat < 1.18.1, 50 => 1.18.2 etc" + logError "Pufferfish server type only supports versions 1.17, 1.18 or 1.19, use PUFFERFISH_BUILD to select the the correct build 47 => 1.18.1, 50 => 1.18.2 etc" exit 1 fi @@ -35,7 +35,7 @@ done if [[ ! -f "$SERVER" ]] || isTrue "${FORCE_REDOWNLOAD:-false}"; then log "Downloading Pufferfish from $PUFFERFISH_BUILD_DOWNLOAD_URL ..." if ! get -o "$SERVER" "$PUFFERFISH_BUILD_DOWNLOAD_URL"; then - log "ERROR: failed to download from $PUFFERFISH_BUILD_DOWNLOAD_URL (status=$?)" + logError "Failed to download from $PUFFERFISH_BUILD_DOWNLOAD_URL (status=$?)" exit 3 fi fi diff --git a/scripts/start-deployPurpur b/scripts/start-deployPurpur index 626a9a8f..3a76927e 100755 --- a/scripts/start-deployPurpur +++ b/scripts/start-deployPurpur @@ -16,15 +16,9 @@ if [[ $PURPUR_DOWNLOAD_URL ]]; then --output-directory=/data \ --results-file="$resultsFile" \ --url="$PURPUR_DOWNLOAD_URL}"; then - log "ERROR: failed to download from custom Purpur URL" + logError "Failed to download from custom Purpur URL" exit 1 fi - # grab SERVER and export it - set -a - # shellcheck disable=SC1090 - source "${resultsFile}" - set +a - else args=( --output-directory=/data @@ -35,16 +29,13 @@ else args+=(--build="$PURPUR_BUILD") fi if ! mc-image-helper install-purpur "${args[@]}"; then - log "ERROR: failed to download Purpur" + logError "Failed to download Purpur" exit 1 fi - # grab SERVER and export it - set -a - # shellcheck disable=SC1090 - source "${resultsFile}" - set +a fi +applyResultsFile ${resultsFile} + # Normalize on Spigot for later operations export FAMILY=SPIGOT diff --git a/scripts/start-deployQuilt b/scripts/start-deployQuilt index 2a442ecb..f0516c8d 100755 --- a/scripts/start-deployQuilt +++ b/scripts/start-deployQuilt @@ -12,10 +12,18 @@ set -eu isDebugging && set -x +function mc-image-helper-quilt(){ + mc-image-helper install-quilt \ + --loader-version="$QUILT_LOADER_VERSION" \ + --minecraft-version="$VERSION" \ + --output-directory=/data \ + --results-file="$resultsFile" "$@" +} + resultsFile=/data/.quilt.env if [[ $QUILT_LAUNCHER ]]; then - log "WARNING: use of QUILT_LAUNCHER is a deprecated feature." + logWarning "Use of QUILT_LAUNCHER is a deprecated feature." SERVER="$QUILT_LAUNCHER" export SERVER resolveVersion @@ -24,38 +32,24 @@ if [[ $QUILT_LAUNCHER ]]; then exec "${SCRIPTS:-/}start-setupWorld" "$@" elif [[ $QUILT_LAUNCHER_URL ]]; then - log "ERROR: QUILT_LAUNCHER_URL is not longer supported. Pre-download and use QUILT_LAUNCHER." + logError "QUILT_LAUNCHER_URL is not longer supported. Pre-download and use QUILT_LAUNCHER." exit 2 elif [[ $QUILT_INSTALLER_URL ]]; then - if ! mc-image-helper install-quilt \ - --loader-version="$QUILT_LOADER_VERSION" \ - --minecraft-version="$VERSION" \ - --output-directory=/data \ - --results-file="$resultsFile" \ - --installer-url="$QUILT_INSTALLER_URL"; then - log "ERROR: failed to install Quilt given custom installer URL $QUILT_INSTALLER_URL" + if ! mc-image-helper-quilt --installer-url="$QUILT_INSTALLER_URL"; then + logError "Failed to installQuilt given custom installer URL $QUILT_INSTALLER_URL" exit 2 fi else - if ! mc-image-helper install-quilt \ - --loader-version="$QUILT_LOADER_VERSION" \ - --minecraft-version="$VERSION" \ - --output-directory=/data \ - --results-file="$resultsFile" \ - --installer-version="$QUILT_INSTALLER_VERSION"; then - log "ERROR: failed to install Quilt given installer version $QUILT_INSTALLER_VERSION" + if ! mc-image-helper-quilt --installer-version="$QUILT_INSTALLER_VERSION"; then + logError "Failed to installQuilt given installer version $QUILT_INSTALLER_VERSION" exit 2 fi fi -# grab SERVER, VERSION and export it -set -a -# shellcheck disable=SC1090 -source "${resultsFile}" -set +a +applyResultsFile ${resultsFile} export FAMILY=FABRIC exec "${SCRIPTS:-/}start-setupWorld" "$@" diff --git a/scripts/start-deploySpongeVanilla b/scripts/start-deploySpongeVanilla index 9aeafcdf..7b4db1be 100755 --- a/scripts/start-deploySpongeVanilla +++ b/scripts/start-deploySpongeVanilla @@ -24,11 +24,7 @@ esac # If not SPONGEVERSION selected, detect last version on selected branch if [ -z $SPONGEVERSION ]; then log "Choosing Version for Sponge" - if [ "$SPONGEBRANCH" == "stable" ]; then - SPONGEVERSION=$(curl -fsSL https://dl-api.spongepowered.org/v1/org.spongepowered/$TYPE | jq -r '.buildTypes.stable.latest.version') - else - SPONGEVERSION=$(curl -fsSL https://dl-api.spongepowered.org/v1/org.spongepowered/$TYPE | jq -r '.buildTypes.bleeding.latest.version') - fi + SPONGEVERSION=$(curl -fsSL https://dl-api.spongepowered.org/v1/org.spongepowered/$TYPE | jq -r --arg SPONGEBRANCH "$SPONGEBRANCH" '.buildTypes.$SPONGEBRANCH.latest.version') fi VERSION="$SPONGEVERSION" diff --git a/scripts/start-deployVanilla b/scripts/start-deployVanilla index c4c51f00..4a71f158 100755 --- a/scripts/start-deployVanilla +++ b/scripts/start-deployVanilla @@ -13,20 +13,20 @@ if [ ! -e "$SERVER" ] || [ -n "$FORCE_REDOWNLOAD" ]; then versionManifestUrl=$(get 'https://launchermeta.mojang.com/mc/game/version_manifest.json' | jq --arg VERSION "$VERSION" --raw-output '[.versions[]|select(.id == $VERSION)][0].url') result=$? if [ $result != 0 ]; then - log "ERROR: failed to obtain version manifest URL ($result)" + logError "Failed to obtain version manifest URL ($result)" exit 1 fi if [ "$versionManifestUrl" = "null" ]; then - log "ERROR: couldn't find a matching manifest entry for $VERSION" + logError "Couldn't find a matching manifest entry for $VERSION" exit 1 fi debug "Found version manifest at $versionManifestUrl" if ! serverDownloadUrl=$(get --json-path '$.downloads.server.url' "${versionManifestUrl}"); then - log "ERROR: failed to obtain version manifest from $versionManifestUrl ($result)" + logError "Failed to obtain version manifest from $versionManifestUrl ($result)" exit 1 elif [ "$serverDownloadUrl" = "null" ]; then - log "ERROR: there is not a server download for version $VERSION" + logError "There is not a server download for version $VERSION" exit 1 fi @@ -35,19 +35,20 @@ if [ ! -e "$SERVER" ] || [ -n "$FORCE_REDOWNLOAD" ]; then get -o "$SERVER" "$serverDownloadUrl" result=$? if [ $result != 0 ]; then - log "ERROR: failed to download server from $serverDownloadUrl ($result)" + logError "Failed to download server from $serverDownloadUrl ($result)" exit 1 fi fi +minecraftServerJarPath=/data/minecraft_server.jar if versionLessThan 1.6; then - if ! [[ -L /data/minecraft_server.jar && /data/minecraft_server.jar -ef "/data/$SERVER" ]]; then - rm -f /data/minecraft_server.jar - ln -s "/data/$SERVER" /data/minecraft_server.jar + if ! [[ -L $minecraftServerJarPath && $minecraftServerJarPath -ef "/data/$SERVER" ]]; then + rm -f $minecraftServerJarPath + ln -s "/data/$SERVER" $minecraftServerJarPath fi SERVER=minecraft_server.jar -elif [[ -L /data/minecraft_server.jar ]]; then - rm -f /data/minecraft_server.jar +elif [[ -L $minecraftServerJarPath ]]; then + rm -f $minecraftServerJarPath fi isDebugging && ls -l diff --git a/scripts/start-finalExec b/scripts/start-finalExec index f180d5f0..b44b0fd7 100755 --- a/scripts/start-finalExec +++ b/scripts/start-finalExec @@ -7,37 +7,42 @@ # shellcheck source=start-utils . "${SCRIPTS:-/}start-utils" isDebugging && set -x +baseDataDir=/data +tmpServerIconPath=/tmp/icon.img +serverIconPath=${baseDataDir}/server-icon.png +mcHealthEnvPath=${baseDataDir}/mc-health.env +bootstrapPath=${baseDataDir}/bootstrap.txt if [ -n "$ICON" ]; then if [ ! -e server-icon.png ] || isTrue "${OVERRIDE_ICON}"; then log "Using server icon from $ICON..." if isURL "$ICON"; then # Not sure what it is yet...call it "img" - if ! get -o /tmp/icon.img "$ICON"; then - log "ERROR: failed to download icon from $ICON" + if ! get -o "$tmpServerIconPath" "$ICON"; then + logError "Failed to download icon from $ICON" exit 1 fi - ICON=/tmp/icon.img + ICON="$tmpServerIconPath" iconSrc="url" elif [ -f "$ICON" ]; then iconSrc="file" else - log "ERROR: $ICON does not appear to be a URL or existing file" + logError "$ICON does not appear to be a URL or existing file" exit 1 fi read -r -a specs < <(identify "$ICON" | awk 'NR == 1 { print $2, $3 }') if [ "${specs[0]} ${specs[1]}" = "PNG 64x64" ]; then if [ $iconSrc = url ]; then - mv -f /tmp/icon.img /data/server-icon.png + mv -f "$tmpServerIconPath" "$serverIconPath" else - cp -f "$ICON" /data/server-icon.png + cp -f "$ICON" "$serverIconPath" fi elif [ "${specs[0]}" = GIF ]; then log "Converting GIF image to 64x64 PNG..." - convert "$ICON"[0] -resize 64x64! /data/server-icon.png + convert "$ICON"[0] -resize 64x64! "$serverIconPath" else log "Converting image to 64x64 PNG..." - convert "$ICON" -resize 64x64! /data/server-icon.png + convert "$ICON" -resize 64x64! "$serverIconPath" fi fi fi @@ -45,10 +50,9 @@ fi canUseRollingLogs=true useFallbackJvmFlag=false +SERVER_DIR="$baseDataDir" if [[ ${FTB_DIR:-} ]]; then SERVER_DIR="$FTB_DIR" -else - SERVER_DIR=/data fi @@ -56,7 +60,7 @@ patchLog4jConfig() { file=${1?} url=${2?} if ! get -o "${SERVER_DIR}/${file}" "$url"; then - log "ERROR: failed to download corrected log4j config, fallback to JVM flag" + logError "Failed to download corrected log4j config, fallback to JVM flag" useFallbackJvmFlag=true return 1 fi @@ -101,7 +105,7 @@ fi if isTrue "${ENABLE_ROLLING_LOGS:-false}"; then if ! ${canUseRollingLogs}; then - log "ERROR: Using rolling logs is currently not possible in the selected version due to CVE-2021-44228" + logError "Using rolling logs is currently not possible in the selected version due to CVE-2021-44228" exit 1 fi # Set up log configuration @@ -214,31 +218,31 @@ if [[ ${INIT_MEMORY} || ${MAX_MEMORY} ]]; then fi function copyFilesForCurseForge() { - if [ ! -e "${FTB_DIR}/server-icon.png" ] && [ -e /data/server-icon.png ]; then - cp -f /data/server-icon.png "${FTB_DIR}/" + if [ ! -e "${FTB_DIR}/server-icon.png" ] && [ -e "$serverIconPath" ]; then + cp -f "$serverIconPath" "${FTB_DIR}/" fi - cp -f /data/eula.txt "${FTB_DIR}/" + cp -f ${baseDataDir}/eula.txt "${FTB_DIR}/" } if versionLessThan 'b1.8'; then echo " DISABLE_HEALTHCHECK=true - " > /data/.mc-health.env + " > "$mcHealthEnvPath" elif versionLessThan 1.7; then echo " MC_HEALTH_EXTRA_ARGS=( --use-server-list-ping ) - " > /data/.mc-health.env + " > "$mcHealthEnvPath" elif isTrue "$USES_PROXY_PROTOCOL"; then echo " MC_HEALTH_EXTRA_ARGS=( --use-proxy ) - " > /data/.mc-health.env + " > "$mcHealthEnvPath" else - rm -f /data/.mc-health.env + rm -f "$mcHealthEnvPath" fi mcServerRunnerArgs=( @@ -257,7 +261,7 @@ fi if [[ ${TYPE} == "CURSEFORGE" && "${SERVER}" ]]; then copyFilesForCurseForge - cd "${FTB_DIR}" || (log "ERROR: can't go into ${FTB_DIR}"; exit 1) + cd "${FTB_DIR}" || (logError "Can't go into ${FTB_DIR}"; exit 1) log "Starting CurseForge server in ${FTB_DIR}..." if isTrue "${DEBUG_EXEC}"; then set -x @@ -279,7 +283,7 @@ EOF sed -i "s/MAX_RAM=[^;]*/MAX_RAM=${MAX_MEMORY}/" "${FTB_DIR}/settings.cfg" fi - cd "${FTB_DIR}" || (log "ERROR: can't go into ${FTB_DIR}"; exit 1) + cd "${FTB_DIR}" || (logError "Can't go into ${FTB_DIR}"; exit 1) log "Running FTB ${FTB_SERVER_START} in ${FTB_DIR} ..." finalArgs="${FTB_SERVER_START}" @@ -315,8 +319,8 @@ elif [[ $SERVER =~ run.sh ]]; then exec mc-server-runner "${mcServerRunnerArgs[@]}" --shell bash "${SERVER}" $EXTRA_ARGS else # If we have a bootstrap.txt file... feed that in to the server stdin - if [ -f /data/bootstrap.txt ]; then - bootstrapArgs="--bootstrap /data/bootstrap.txt" + if [ -f $bootstrapPath ]; then + bootstrapArgs="--bootstrap $bootstrapPath" fi log "Starting the Minecraft server..." diff --git a/scripts/start-rconcmds b/scripts/start-rconcmds index 69406cb3..77896ae8 100644 --- a/scripts/start-rconcmds +++ b/scripts/start-rconcmds @@ -22,15 +22,7 @@ log "Rcon cmds functionality enabled" isDebugging && set -x -if ! [[ $RCON_CMDS_PERIOD =~ ^[0-9]+$ ]]; then - RCON_CMDS_PERIOD=10 - export RCON_CMDS_PERIOD - log "Warning: RCON_CMDS_PERIOD is not numeric, set to 10 (seconds)" -fi -if [ "$RCON_CMDS_PERIOD" -eq "0" ] ; then - RCON_CMDS_PERIOD=10 - export RCON_CMDS_PERIOD - log "Warning: RCON_CMDS_PERIOD must not be 0, set to 10 (seconds)" -fi +isNumericElseSetToDefault RCON_CMDS_PERIOD 10 +checkIfNotZeroElseSetToDefault RCON_CMDS_PERIOD 10 /usr/local/bin/rcon-cmds-daemon.sh & diff --git a/scripts/start-setupDatapack b/scripts/start-setupDatapack index 0df7920a..2dc682e8 100755 --- a/scripts/start-setupDatapack +++ b/scripts/start-setupDatapack @@ -30,28 +30,28 @@ if [[ "$DATAPACKS" ]]; then if isURL "$i"; then log "Downloading datapack $i ..." if ! get -o "${out_dir}" "$i"; then - log "ERROR: failed to download from $i into $out_dir" + logError "Failed to download from $i into $out_dir" exit 2 fi elif [[ -f "$i" && "$i" =~ .*\.zip ]]; then log "Copying datapack located at $i ..." out_file=$(basename "$i") if ! cp "$i" "${out_dir}/$out_file"; then - log "ERROR: failed to copy from $i into $out_dir" + logError "Failed to copy from $i into $out_dir" exit 2 fi elif [[ -d "$i" ]]; then log "Copying datapacks from $i ..." cp "$i"/*.zip "${out_dir}" else - log "ERROR Invalid URL or path given in DATAPACKS: $i" + logError "Invalid URL or path given in DATAPACKS: $i" exit 2 fi done elif [[ "$DATAPACKS_FILE" ]]; then if [ ! -f "$DATAPACKS_FILE" ]; then - log "ERROR: given DATAPACKS_FILE file does not exist" + logError "Given DATAPACKS_FILE file does not exist" exit 2 fi @@ -71,7 +71,7 @@ elif [[ "$DATAPACKS_FILE" ]]; then fi if ! get "${args[@]}" ; then - log "ERROR: failed to retrieve one or more datapacks" + logError "Failed to retrieve one or more datapacks" exit 1 fi fi diff --git a/scripts/start-setupEnvVariables b/scripts/start-setupEnvVariables index fe343a43..be6d6343 100755 --- a/scripts/start-setupEnvVariables +++ b/scripts/start-setupEnvVariables @@ -33,7 +33,7 @@ if [[ $DOWNLOAD_DEFAULT_CONFIGS ]]; then --to /data/config \ --skip-existing --skip-up-to-date=false \ "$DOWNLOAD_DEFAULT_CONFIGS" 2> /dev/null; then - log "WARN: one or more default config files were not available from $DOWNLOAD_DEFAULT_CONFIGS" + logWarning "One or more default config files were not available from $DOWNLOAD_DEFAULT_CONFIGS" fi fi diff --git a/scripts/start-setupModpack b/scripts/start-setupModpack index 4bd80234..6ef6caeb 100755 --- a/scripts/start-setupModpack +++ b/scripts/start-setupModpack @@ -34,13 +34,13 @@ function handlePackwiz() { --maven-repo=https://maven.packwiz.infra.link/repository/release/ \ --group=link.infra.packwiz --artifact=packwiz-installer --classifier=dist \ --skip-existing); then - log "ERROR: failed to get packwiz installer" + logError "Failed to get packwiz installer" exit 1 fi log "Running packwiz installer against URL: ${PACKWIZ_URL}" if ! java -cp "${packwizInstaller}" link.infra.packwiz.installer.Main -s server "${PACKWIZ_URL}"; then - log "ERROR failed to run packwiz installer" + logError "Failed to run packwiz installer" exit 1 fi fi @@ -52,28 +52,28 @@ if [[ "$MODPACK" ]]; then if isURL "${MODPACK}"; then log "Downloading mod/plugin pack" if ! get -o /tmp/modpack.zip "${MODPACK}"; then - log "ERROR: failed to download from ${MODPACK}" + logError "Failed to download from ${MODPACK}" exit 2 fi elif [[ "$MODPACK" =~ .*\.zip ]]; then if ! cp "$MODPACK" /tmp/modpack.zip; then - log "ERROR: failed to copy from $MODPACK" + logError "Failed to copy from $MODPACK" exit 2 fi else - log "ERROR Invalid URL or Path given for MODPACK: $MODPACK" + logError "Invalid URL or Path given for MODPACK: $MODPACK" exit 1 fi if [ "$FAMILY" = "SPIGOT" ]; then mkdir -p "$PLUGINS_OUT_DIR" if ! unzip -o -d "$PLUGINS_OUT_DIR" /tmp/modpack.zip; then - log "ERROR: failed to unzip the modpack from ${MODPACK}" + logError "Failed to unzip the modpack from ${MODPACK}" fi else mkdir -p "$MODS_OUT_DIR" if ! unzip -o -d "$MODS_OUT_DIR" /tmp/modpack.zip; then - log "ERROR: failed to unzip the modpack from ${MODPACK}" + logError "Failed to unzip the modpack from ${MODPACK}" fi fi rm -f /tmp/modpack.zip @@ -166,7 +166,7 @@ function handleGenericPacks() { mkdir -p /data/packs log "Downloading generic pack from $pack" if ! outfile=$(get -o /data/packs --output-filename --skip-up-to-date "$pack"); then - log "ERROR: failed to download $pack" + logError "Failed to download $pack" exit 2 fi packFiles+=("$outfile") @@ -200,7 +200,7 @@ function handleGenericPacks() { --max-depth=3 --type=directory --name=mods,plugins,config \ --only-shallowest --fail-no-matches --format '%h' \ "$base_dir"); then - log "ERROR: Unable to find content base of generic packs ${GENERIC_PACKS}. Directories:" + logError "Unable to find content base of generic packs ${GENERIC_PACKS}. Directories:" mc-image-helper find --name=* --max-depth=3 --type=directory --format '- %P' "$original_base_dir" exit 1 fi @@ -240,8 +240,8 @@ function handleModrinthProjects() { : "${MODRINTH_ALLOWED_VERSION_TYPE:=release}" : "${MODRINTH_DOWNLOAD_DEPENDENCIES:=none}" if [[ -v MODRINTH_DOWNLOAD_OPTIONAL_DEPENDENCIES ]]; then - log "WARNING The variable MODRINTH_DOWNLOAD_OPTIONAL_DEPENDENCIES is removed." - log " Use MODRINTH_DOWNLOAD_DEPENDENCIES=optional instead" + logWarning "The variable MODRINTH_DOWNLOAD_OPTIONAL_DEPENDENCIES is removed." + logWarning " Use MODRINTH_DOWNLOAD_DEPENDENCIES=optional instead" fi if [[ $MODRINTH_PROJECTS ]]; then @@ -298,14 +298,14 @@ handleModpackZip handleListings if [[ $MANIFEST ]]; then - log "ERROR: MANIFEST is no longer supported." - log " Use MOD_PLATFORM=AUTO_CURSEFORGE and CF_MODPACK_MANIFEST instead" + logError "MANIFEST is no longer supported." + logError " Use MOD_PLATFORM=AUTO_CURSEFORGE and CF_MODPACK_MANIFEST instead" exit 1 fi if [[ $MODS_FORGEAPI_KEY || $MODS_FORGEAPI_FILE || $MODS_FORGEAPI_PROJECTIDS ]]; then - log "ERROR the MODS_FORGEAPI_FILE / MODS_FORGEAPI_PROJECTIDS feature is no longer supported" - log " Use CURSEFORGE_FILES instead." + logError "The MODS_FORGEAPI_FILE / MODS_FORGEAPI_PROJECTIDS feature is no longer supported" + logError " Use CURSEFORGE_FILES instead." exit 1 fi diff --git a/scripts/start-setupMounts b/scripts/start-setupMounts index ae3ee1a5..84e83146 100755 --- a/scripts/start-setupMounts +++ b/scripts/start-setupMounts @@ -26,19 +26,22 @@ else subcommand=sync fi +function mc-image-helper-mounts(){ + mc-image-helper \ + ${subcommand} $updateArg \ + --replace-env-file-suffixes="${REPLACE_ENV_SUFFIXES}" \ + --replace-env-excludes="${REPLACE_ENV_VARIABLES_EXCLUDES}" \ + --replace-env-exclude-paths="${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS}" \ + --replace-env-prefix="${REPLACE_ENV_VARIABLE_PREFIX}" "$@" +} + : "${COPY_PLUGINS_SRC:="/plugins"}" : "${COPY_PLUGINS_DEST:=${PLUGINS_OUT_DIR}}" if usesPlugins && [ -d "${COPY_PLUGINS_SRC}" ]; then mkdir -p "${COPY_PLUGINS_DEST}" log "Copying any plugins from ${COPY_PLUGINS_SRC} to ${COPY_PLUGINS_DEST}" - mc-image-helper \ - ${subcommand} $updateArg \ - --replace-env-file-suffixes="${REPLACE_ENV_SUFFIXES}" \ - --replace-env-excludes="${REPLACE_ENV_VARIABLES_EXCLUDES}" \ - --replace-env-exclude-paths="${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS}" \ - --replace-env-prefix="${REPLACE_ENV_VARIABLE_PREFIX}" \ - "${COPY_PLUGINS_SRC}" "${COPY_PLUGINS_DEST}" + mc-image-helper-mounts "${COPY_PLUGINS_SRC}" "${COPY_PLUGINS_DEST}" fi : "${COPY_MODS_SRC:="/mods"}" @@ -46,13 +49,7 @@ fi if usesMods && [ -d "${COPY_MODS_SRC}" ]; then log "Copying any mods from ${COPY_MODS_SRC} to ${COPY_MODS_DEST}" - mc-image-helper \ - ${subcommand} $updateArg \ - --replace-env-file-suffixes="${REPLACE_ENV_SUFFIXES}" \ - --replace-env-excludes="${REPLACE_ENV_VARIABLES_EXCLUDES}" \ - --replace-env-exclude-paths="${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS}" \ - --replace-env-prefix="${REPLACE_ENV_VARIABLE_PREFIX}" \ - "${COPY_MODS_SRC}" "${COPY_MODS_DEST}" + mc-image-helper-mounts "${COPY_MODS_SRC}" "${COPY_MODS_DEST}" fi : "${COPY_CONFIG_SRC:="/config"}" @@ -60,13 +57,7 @@ fi if [ -d "${COPY_CONFIG_SRC}" ]; then log "Copying any configs from ${COPY_CONFIG_SRC} to ${COPY_CONFIG_DEST}" - mc-image-helper \ - ${subcommand} $updateArg \ - --replace-env-file-suffixes="${REPLACE_ENV_SUFFIXES}" \ - --replace-env-excludes="${REPLACE_ENV_VARIABLES_EXCLUDES}" \ - --replace-env-exclude-paths="${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS}" \ - --replace-env-prefix="${REPLACE_ENV_VARIABLE_PREFIX}" \ - "${COPY_CONFIG_SRC}" "${COPY_CONFIG_DEST}" + mc-image-helper-mounts "${COPY_CONFIG_SRC}" "${COPY_CONFIG_DEST}" fi exec "${SCRIPTS:-/}start-setupServerProperties" "$@" diff --git a/scripts/start-setupServerProperties b/scripts/start-setupServerProperties index 64509840..94619908 100755 --- a/scripts/start-setupServerProperties +++ b/scripts/start-setupServerProperties @@ -62,7 +62,7 @@ function customizeServerProps { fi ;; *) - log "ERROR: Invalid game mode: $MODE" + logError "Invalid game mode: $MODE" exit 1 ;; esac @@ -99,7 +99,7 @@ function customizeServerProps { fi ;; *) - log "DIFFICULTY must be peaceful, easy, normal, or hard." + log "DIFFICULTY must be peaceful(0), easy(1), normal(2), or hard(3)." exit 1 ;; esac @@ -121,7 +121,7 @@ function customizeServerProps { handleDebugMode if ! mc-image-helper set-properties "${setPropertiesArgs[@]}" "$SERVER_PROPERTIES"; then - log "ERROR: failed to update server.properties" + logError "Failed to update server.properties" exit 1 fi @@ -167,9 +167,9 @@ if isTrue "${ENABLE_AUTOPAUSE}"; then if [ -f "$SERVER_PROPERTIES" ]; then current_max_tick=$( grep 'max-tick-time' "$SERVER_PROPERTIES" | sed -r 's/( )+//g' | awk -F= '{print $2}' ) if (( current_max_tick > 0 && current_max_tick < 86400000 )); then - log "Warning: The server.properties for the server doesn't have the Server Watchdog (effectively) disabled." - log " Autopause functionality resuming the process might trigger the Watchdog and restart the server completely." - log " Set the MAX_TICK_TIME env variable (or max-tick-time property) to a high value (or disable the Watchdog with value -1 for versions 1.8.1+)." + logWarning "The server.properties for the server doesn't have the Server Watchdog (effectively) disabled." + logWarning " Autopause functionality resuming the process might trigger the Watchdog and restart the server completely." + logWarning " Set the MAX_TICK_TIME env variable (or max-tick-time property) to a high value (or disable the Watchdog with value -1 for versions 1.8.1+)." fi fi fi diff --git a/scripts/start-setupWorld b/scripts/start-setupWorld index 57e26a07..3caa7040 100755 --- a/scripts/start-setupWorld +++ b/scripts/start-setupWorld @@ -27,7 +27,7 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] ); if isURL "$WORLD"; then log "Downloading world from $WORLD" if ! get -o /tmp/world.bin "$WORLD"; then - log "ERROR: failed to download world from $WORLD" + logError "Failed to download world from $WORLD" exit 1 fi WORLD=/tmp/world.bin @@ -39,14 +39,14 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] ); # Stage contents so that the correct subdirectory can be picked off mkdir -p /tmp/world-data if ! extract "$WORLD" /tmp/world-data; then - log "ERROR extracting world from $WORLD" + logError "Extracting world from $WORLD" exit 1 fi baseDirs=$(find /tmp/world-data -name "level.dat" -exec dirname "{}" \;) if ! [[ $baseDirs ]]; then - log "ERROR world content is not valid since level.dat could not be found" + logError "World content is not valid since level.dat could not be found" exit 2 fi @@ -60,24 +60,24 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] ); else baseDir="$(echo "$baseDirs" | sed -n ${WORLD_INDEX:-1}p)" baseName=$(basename "$baseDir") - log "WARN multiple levels found, picking: $baseName" + logWarning "Multiple levels found, picking: $baseName" fi elif [[ $count -gt 0 ]]; then baseDir="$baseDirs" else - log "ERROR invalid world content" + logError "Invalid world content" exit 1 fi if [ -d "${baseDir}_nether/DIM-1" ]; then if [ -d "$baseDir/DIM-1" ]; then - log "WARN found Nether dimension in both $baseDir and ${baseDir}_nether, picking ${baseDir}_nether" + logWarning "Found Nether dimension in both $baseDir and ${baseDir}_nether, picking ${baseDir}_nether" rm -r "$baseDir/DIM-1" fi fi if [ -d "${baseDir}_the_end/DIM1" ]; then if [ -d "$baseDir/DIM1" ]; then - log "WARN found End dimension in both $baseDir and ${baseDir}_the_end, picking ${baseDir}_the_end" + logWarning "Found End dimension in both $baseDir and ${baseDir}_the_end, picking ${baseDir}_the_end" rm -r "$baseDir/DIM1" fi fi @@ -116,7 +116,7 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] ); log "Cloning world directory from $WORLD ..." rsync --recursive --delete "${WORLD%/}"/ "$worldDest" else - log "ERROR: world file/directory $WORLD is missing" + logError "World file/directory $WORLD is missing" exit 1 fi diff --git a/scripts/start-spiget b/scripts/start-spiget index b64e7773..3f2b475a 100755 --- a/scripts/start-spiget +++ b/scripts/start-spiget @@ -57,7 +57,7 @@ getResourceFromSpiget() { if [[ -n $(find "$versionfile" -mmin +${SPIGET_DOWNLOAD_TOLERANCE}) ]]; then urlVersion="https://api.spiget.org/v2/resources/${resource}/versions/latest" if ! get -o "${versionfileNew}" "${urlVersion}"; then - log "ERROR failed to download resource version meta data '${resource}' from ${urlVersion}" + logError "Failed to download resource version meta data '${resource}' from ${urlVersion}" exit 2 fi @@ -83,7 +83,7 @@ getResourceFromSpiget() { if downloadResourceFromSpiget "${resource}"; then urlVersion="https://api.spiget.org/v2/resources/${resource}/versions/latest" if ! get -o "${versionfileNew}" "${urlVersion}"; then - log "ERROR failed to download resource version meta data '${resource}' from ${urlVersion}" + logError "Failed to download resource version meta data '${resource}' from ${urlVersion}" exit 2 fi mv "${versionfileNew}" "${versionfile}" @@ -99,16 +99,16 @@ downloadResourceFromSpiget() { mkdir -p $tempDir resourceUrl="https://api.spiget.org/v2/resources/${resource}" if ! outfile=$(get_silent --output-filename -o $tempDir "${acceptArgs[@]}" "${resourceUrl}/download"); then - log "ERROR: failed to download resource '${resource}' from ${resourceUrl}/download" + logError "Failed to download resource '${resource}' from ${resourceUrl}/download" if externalUrl=$(get --json-path '$.file.externalUrl' "${resourceUrl}"); then - log " Visit $externalUrl to pre-download the resource" - log " instead of using SPIGET_RESOURCES" + logError " Visit $externalUrl to pre-download the resource" + logError " instead of using SPIGET_RESOURCES" fi exit 1 fi if ! fileType=$(get --json-path '.file.type' "${resourceUrl}"); then - log "ERROR: failed to retrieve file type of resource $resource" + logError "Failed to retrieve file type of resource $resource" exit 1 fi if [[ $fileType = .sk ]]; then @@ -122,7 +122,7 @@ downloadResourceFromSpiget() { log "Extracting contents of resource ${resource} into plugins" extract "$outfile" /data/plugins else - log "ERROR: file for resource ${resource} has an unexpected file type: ${fileType}" + logError "File for resource ${resource} has an unexpected file type: ${fileType}" exit 2 fi fi diff --git a/scripts/start-utils b/scripts/start-utils index 92619bd1..003355ff 100755 --- a/scripts/start-utils +++ b/scripts/start-utils @@ -8,7 +8,7 @@ function get_from_gh() { fi if [[ ! "$oAuthScopes" =~ ^x-oauth-scopes:[[:space:]]*$ ]]; then # Don't use what you don't have to... - log "ERROR: GH_TOKEN has permissions it doesn't need. Recreate or update this personal access token and disable ALL scopes." + logError "GH_TOKEN has permissions it doesn't need. Recreate or update this personal access token and disable ALL scopes." exit 1 else curl -fsSL -H "Authorization: token $GH_TOKEN" "${@:2}" "$1" @@ -18,6 +18,14 @@ function get_from_gh() { fi } +function applyResultsFile() { + # grab SERVER and export it + set -a + # shellcheck disable=SC1090 + source "$1" + set +a +} + function join_by() { local d=$1 shift @@ -47,7 +55,7 @@ function isValidFileURL() { function resolveEffectiveUrl() { url="${1:?Missing required url argument}" if ! curl -Ls -o /dev/null -w "%{url_effective}" "$url"; then - log "ERROR failed to resolve effective URL from $url" + logError "Failed to resolve effective URL from $url" exit 2 fi } @@ -109,10 +117,107 @@ function log() { if isDebugging || isTrue "${LOG_TIMESTAMP:-false}"; then ts=" $(date --rfc-3339=seconds)" fi - echo "[init]${ts} $*" + echo -e "[init]${ts} $*" eval "$oldState" } +function getSudoFromDistro(){ + distro=$(getDistro) + command= + if [[ $distro == alpine ]]; then + command="su-exec" + else + command="gosu" + fi + echo $command +} + +# Refer to https://unix.stackexchange.com/a/10065/102376 +function isTerminal() { + if test -t 1; then + # see if it supports colors... + ncolors=$(tput colors) + test -n "$ncolors" && test "$ncolors" -ge 8 + else + return 1 + fi +} + +errorLogTag="[ERROR]" +warningLogTag="[WARN]" + +if isTerminal; then + normal="$(tput sgr0)" + red="$(tput setaf 1)" + yellow="$(tput setaf 3)" + function getErrorColoredLogString() { + echo "${red}$errorLogTag $* ${normal}" + } + function getWarningColoredLogString() { + echo "${yellow}$warningLogTag $* ${normal}" + } +else + function getErrorColoredLogString() { + echo "$errorLogTag $*" + } + function getWarningColoredLogString() { + echo "$warningLogTag $*" + } +fi + +function error() { + echo -e "$(getErrorColoredLogString "$*")" +} + +function logError() { + if isDebugging; then + set +x + fi + log "$(getErrorColoredLogString "$*")" + if isDebugging; then + set -x + fi +} + +function warning() { + if isDebugging; then + set +x + fi + echo -e "$(getWarningColoredLogString "$*")" + if isDebugging; then + set -x + fi +} + +function logWarning() { + log "$(getWarningColoredLogString "$*")" +} + +function isNumeric() { + [[ $1 =~ ^[0-9]+$ ]] +} + +function isNumericElseSetToDefault() { + local var_name="$1" + local default_value="$2" + + if ! isNumeric ${!var_name} ; then + eval "$var_name=$default_value" + export "$var_name" + logWarning "$var_name is not numeric, set to $default_value (seconds)" + fi +} + +function checkIfNotZeroElseSetToDefault() { + local var_name="$1" + local default_value="$2" + if [ "${!var_name}" -eq "0" ] ; then + eval "$var_name=$default_value" + export "$var_name" + logWarning "$var_name must not be 0, set to $default_value (seconds)" + fi +} + function logAutopause() { echo "[Autopause loop] $*" } @@ -255,37 +360,12 @@ function versionLessThan() { compare_version "${VERSION}" "lt" "${1?}" } -requireVar() { - if [ ! -v "$1" ]; then - log "ERROR: $1 is required to be set" - exit 1 - fi - if [ -z "${!1}" ]; then - log "ERROR: $1 is required to be set" - exit 1 - fi -} - -requireEnum() { - var=${1?} - shift - - for allowed in "$@"; do - if [[ ${!var} = "$allowed" ]]; then - return 0 - fi - done - - log "ERROR: $var must be set to one of $*" - # exit 1 -} - function writeEula() { if ! echo "# Generated via Docker # $(date) eula=${EULA,,} " >/data/eula.txt; then - log "ERROR: unable to write eula to /data. Please make sure attached directory is writable by uid=${UID}" + logError "Unable to write eula to /data. Please make sure attached directory is writable by uid=${UID}" exit 2 fi } @@ -354,7 +434,7 @@ function extract() { tar -C "${destDir}" --use-compress-program=unzstd -xf "${src}" ;; *) - log "ERROR: unsupported archive type: $type" + logError "Unsupported archive type: $type" return 1 ;; esac @@ -429,7 +509,7 @@ function ensureRemoveAllModsOff() { reason=${1?} if isTrue "${REMOVE_OLD_MODS:-false}"; then - log "WARNING using REMOVE_OLD_MODS interferes with $reason -- it is now disabled" + logWarning "Using REMOVE_OLD_MODS interferes with $reason -- it is now disabled" REMOVE_OLD_MODS=false fi }