#!/bin/bash . ${SCRIPTS:-/}start-utils if [ -n "$OPS" ]; then log "Setting/adding ops" rm -rf /data/ops.txt.converted echo $OPS | awk -v RS=, '{print}' > /data/ops.txt fi if [ -n "$WHITELIST" ]; then log "Setting whitelist" rm -rf /data/white-list.txt.converted echo $WHITELIST | awk -v RS=, '{print}' > /data/white-list.txt fi if [ -n "$ICON" -a ! -e server-icon.png ]; then log "Using server icon from $ICON..." # Not sure what it is yet...call it "img" curl -sSL -o /tmp/icon.img $ICON specs=$(identify /tmp/icon.img | awk '{print $2,$3}') if [ "$specs" = "PNG 64x64" ]; then mv /tmp/icon.img /data/server-icon.png else log "Converting image to 64x64 PNG..." convert /tmp/icon.img -resize 64x64! /data/server-icon.png fi fi if ! isTrue ${SKIP_LOG4J_CONFIG}; then # Set up log configuration LOGFILE="/data/log4j2.xml" if [ ! -e "$LOGFILE" ]; then log "Creating log4j2.xml in ${LOGFILE}" cp /tmp/log4j2.xml "$LOGFILE" else log "log4j2.xml already created, skipping" fi JVM_OPTS="-Dlog4j.configurationFile=/data/log4j2.xml ${JVM_OPTS}" fi # Make sure files exist and are valid JSON (for pre-1.12 to 1.12 upgrades) log "Checking for JSON files." JSON_FILES=$(find /data -maxdepth 1 -name '*.json') for j in $JSON_FILES; do if [[ $(cat "$j" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') == "" ]]; then log "Fixing JSON $j" echo '[]' > $j fi done # If any modules have been provided, copy them over if [ -d /mods ]; then log "Copying any mods over..." mkdir -p /data/mods rsync -a --out-format="update:%f:Last Modified %M" --prune-empty-dirs --update /mods /data fi [ -d /data/config ] || mkdir /data/config for c in /config/* do if [ -f "$c" ]; then log Copying configuration $(basename "$c") cp -rf "$c" /data/config fi done EXTRA_ARGS="" # Optional disable console if versionLessThan 1.14 && [[ ${CONSOLE,,} = false ]]; then EXTRA_ARGS+="--noconsole" fi # Optional disable GUI for headless servers if [[ ${GUI} = false || ${GUI} = FALSE ]]; then EXTRA_ARGS="${EXTRA_ARGS} nogui" fi # put these prior JVM_OPTS at the end to give any memory settings there higher precedence log "Setting initial memory to ${INIT_MEMORY:=${MEMORY}} and max to ${MAX_MEMORY:=${MEMORY}}" expandedDOpts= if [ -n "$JVM_DD_OPTS" ]; then for dopt in $JVM_DD_OPTS do expandedDOpts="${expandedDOpts} -D${dopt/:/=}" done fi if isTrue ${ENABLE_JMX}; then : ${JMX_HOST:=0.0.0.0} : ${JMX_PORT:=7091} JVM_OPTS="${JVM_OPTS} -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=${JMX_PORT} -Dcom.sun.management.jmxremote.rmi.port=${JMX_PORT} -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.host=${JMX_HOST} -Djava.rmi.server.hostname=${JMX_HOST}" log "JMX is enabled. Make sure you have port forwarding for ${JMX_PORT}" fi if isTrue "${USE_AIKAR_FLAGS}"; then # From https://mcflags.emc.gs/ if (( $(normalizeMemSize "${MAX_MEMORY}") >= $(normalizeMemSize 12g) )); then log "Using Aikar's >12GB flags" G1NewSizePercent=40 G1MaxNewSizePercent=50 G1HeapRegionSize=16M G1ReservePercent=15 InitiatingHeapOccupancyPercent=20 else log "Using Aikar's flags" G1NewSizePercent=30 G1MaxNewSizePercent=40 G1HeapRegionSize=8M G1ReservePercent=20 InitiatingHeapOccupancyPercent=15 fi JVM_XX_OPTS="${JVM_XX_OPTS} -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=${G1NewSizePercent} -XX:G1MaxNewSizePercent=${G1MaxNewSizePercent} -XX:G1HeapRegionSize=${G1HeapRegionSize} -XX:G1ReservePercent=${G1ReservePercent} -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=${InitiatingHeapOccupancyPercent} -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true " fi if isTrue "${USE_LARGE_PAGES}"; then JVM_XX_OPTS="${JVM_XX_OPTS} -XX:+UseLargePagesInMetaspace " fi if isTrue "${DEBUG_MEMORY}"; then log "Memory usage and availability (in MB)" uname -a free -m fi JVM_OPTS="-Xms${INIT_MEMORY} -Xmx${MAX_MEMORY} ${JVM_OPTS}" function copyFilesForCurseForge() { # copy player modification files unconditionally since their # processing into json is additive anyway [ -f /data/ops.txt ] && cp -f /data/ops.txt ${FTB_DIR}/ [ -f /data/white-list.txt ] && cp -f /data/white-list.txt ${FTB_DIR}/ if [ ! -e "${FTB_DIR}/server-icon.png" -a -e /data/server-icon.png ]; then cp -f /data/server-icon.png ${FTB_DIR}/ fi cp -f /data/eula.txt "${FTB_DIR}/" } mcServerRunnerArgs="--stop-duration ${STOP_DURATION:-60}s" if [[ ${TYPE} == "CURSE_INSTANCE" ]]; then if isTrue ${DEBUG_EXEC}; then set -x fi exec mc-server-runner ${mcServerRunnerArgs} \ --cf-instance-file "${CURSE_INSTANCE_JSON}" \ java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar _SERVERJAR_ "$@" $EXTRA_ARGS elif [[ ${TYPE} == "FEED-THE-BEAST" && "${SERVER}" ]]; then copyFilesForCurseForge cd "${FTB_DIR}" log "Starting CurseForge server in ${FTB_DIR}..." if isTrue ${DEBUG_EXEC}; then set -x fi exec mc-server-runner ${bootstrapArgs} ${mcServerRunnerArgs} java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar $(basename "${SERVER}") "$@" $EXTRA_ARGS elif [[ ${TYPE} == "FEED-THE-BEAST" ]]; then mcServerRunnerArgs="${mcServerRunnerArgs} --shell bash" copyFilesForCurseForge cat > "${FTB_DIR}/settings-local.sh" <