#!/bin/bash set -euo pipefail IFS=$'\n\t' # shellcheck source=start-utils . "${SCRIPTS:-/}start-utils" : "${EULA:=}" : "${PROXY:=}" : "${ENABLE_AUTOPAUSE:=false}" : "${ENABLE_AUTOSTOP:=false}" : "${RCON_CMDS_STARTUP:=}" : "${RCON_CMDS_ON_CONNECT:=}" : "${RCON_CMDS_ON_DISCONNECT:=}" : "${RCON_CMDS_FIRST_CONNECT:=}" : "${RCON_CMDS_LAST_DISCONNECT:=}" : "${RCON_CMDS_PERIOD:=10}" : "${RCON_PASSWORD_FILE:=}" : "${RCON_PASSWORD:=minecraft}" : "${RCON_PORT:=25575}" export RCON_PASSWORD RCON_PORT shopt -s nullglob isDebugging && set -x #umask 002 export HOME=/data 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" log "" exit 1 fi writeEula fi if isTrue "${ENABLE_AUTOPAUSE}" && isTrue "${EXEC_DIRECTLY:-false}"; then log "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" exit 1 fi if [[ $PROXY ]]; then export http_proxy="$PROXY" export https_proxy="$PROXY" export JAVA_TOOL_OPTIONS+="-Djava.net.useSystemProxies=true" log "INFO: Giving proxy time to startup..." sleep 5 fi if [[ $RCON_PASSWORD_FILE ]]; then log "" if [ ! -e ${RCON_PASSWORD_FILE} ]; then 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" log "" exit 1 else RCON_PASSWORD=$(cat ${RCON_PASSWORD_FILE}) export RCON_PASSWORD fi log "" fi 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." sleep 2 # now find where java might be for d in /opt/java/openjdk/bin /usr/bin; do if [ -x "${d}/java" ]; then PATH="${PATH}:${d}" return 0 fi done return 1 fi } if ! fixJavaPath; then log "ERROR: could not locate path that contains java" exit 1 fi export VERSIONS_JSON=https://launchermeta.mojang.com/mc/game/version_manifest.json case "X$VERSION" in X|XLATEST|Xlatest) if ! VANILLA_VERSION=$(get --json-path '$.latest.release' "$VERSIONS_JSON"); then log "ERROR: version lookup failed: $VANILLA_VERSION" exit 1 fi ;; XSNAPSHOT|Xsnapshot) if ! VANILLA_VERSION=$(get --json-path '$.latest.snapshot' "$VERSIONS_JSON"); then log "ERROR: version lookup failed: $VANILLA_VERSION" exit 1 fi ;; *) VANILLA_VERSION=$VERSION ;; esac export VANILLA_VERSION MAJOR_VANILLA_VERSION=$(get_major_version "$VANILLA_VERSION") export MAJOR_VANILLA_VERSION log "Resolved version given ${VERSION} into ${VANILLA_VERSION} and major version ${MAJOR_VANILLA_VERSION}" cd /data || exit 1 export ORIGINAL_TYPE=${TYPE^^} if isTrue "${ENABLE_AUTOPAUSE}"; then ${SCRIPTS:-/}start-autopause fi if isTrue "${ENABLE_AUTOSTOP}"; then ${SCRIPTS:-/}start-autostop fi if [[ "$RCON_CMDS_STARTUP" ]] || [[ "$RCON_CMDS_ON_CONNECT" ]] || [[ "$RCON_CMDS_ON_DISCONNECT" ]] || [[ "$RCON_CMDS_FIRST_CONNECT" ]] || [[ "$RCON_CMDS_LAST_DISCONNECT" ]] then log "Starting RCON commands" # shellcheck source=start-rconcmds ${SCRIPTS:-/}start-rconcmds fi if versionLessThan 1.7; then echo " MC_HEALTH_EXTRA_ARGS=( --use-server-list-ping ) " > /data/.mc-health.env fi log "Resolving type given ${TYPE}" case "${TYPE^^}" in *BUKKIT|SPIGOT) exec "${SCRIPTS:-/}start-deployBukkitSpigot" "$@" ;; PAPER) exec "${SCRIPTS:-/}start-deployPaper" "$@" ;; FORGE) evaluateJavaCompatibilityForForge exec "${SCRIPTS:-/}start-deployForge" "$@" ;; FABRIC) exec "${SCRIPTS:-/}start-deployFabric" "$@" ;; QUILT) exec "${SCRIPTS:-/}start-deployQuilt" "$@" ;; FTBA) evaluateJavaCompatibilityForForge exec "${SCRIPTS:-/}start-deployFTBA" "$@" ;; FTB|CURSEFORGE) evaluateJavaCompatibilityForForge exec "${SCRIPTS:-/}start-deployCF" "$@" ;; VANILLA) exec "${SCRIPTS:-/}start-deployVanilla" "$@" ;; SPONGEVANILLA) exec "${SCRIPTS:-/}start-deploySpongeVanilla" "$@" ;; CUSTOM) evaluateJavaCompatibilityForForge exec "${SCRIPTS:-/}start-deployCustom" "$@" ;; MAGMA) evaluateJavaCompatibilityForForge exec "${SCRIPTS:-/}start-deployMagma" "$@" ;; MOHIST) evaluateJavaCompatibilityForForge exec "${SCRIPTS:-/}start-deployMohist" "$@" ;; CATSERVER) evaluateJavaCompatibilityForForge exec "${SCRIPTS:-/}start-deployCatserver" "$@" ;; LOLISERVER) evaluateJavaCompatibilityForForge exec "${SCRIPTS:-/}start-deployLoliserver" "$@" ;; PURPUR) exec "${SCRIPTS:-/}start-deployPurpur" "$@" ;; PUFFERFISH) exec "${SCRIPTS:-/}start-deployPufferfish" "$@" ;; CANYON) exec "${SCRIPTS:-/}start-deployCanyon" "$@" ;; LIMBO) exec "${SCRIPTS:-/}start-deployLimbo" "$@" ;; CRUCIBLE) log "**********************************************************************" log "WARNING: The image tag itzg/minecraft-server:java8 is recommended" log " since some mods require Java 8" log " Exception traces reporting ClassCastException: class jdk.internal.loader.ClassLoaders\$AppClassLoader" log " can be fixed with java8" log "**********************************************************************" exec "${SCRIPTS:-/}start-deployCrucible" "$@" ;; *) log "Invalid type: '$TYPE'" log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTBA (multiarch-only)," log " CURSEFORGE, SPONGEVANILLA, PURPUR, CUSTOM," log " MAGMA, MOHIST, CATSERVER, LOLISERVER, AIRPLANE, PUFFERFISH, CANYON, LIMBO, CRUCIBLE" exit 1 ;; esac