#!/bin/bash set -euo pipefail IFS=$'\n\t' . ${SCRIPTS:-/}start-utils handleDebugMode : ${SPIGET_RESOURCES:=} : ${SPIGET_DOWNLOAD_TOLERANCE:=5} # in minutes containsJars() { file=${1?} pat='\.jar$' while read -r line; do if [[ $line =~ $pat ]]; then return 0 fi done <<<$(unzip -l "$file") return 1 } containsPlugin() { file=${1?} pat='plugin.yml$' while read -r line; do if [[ $line =~ $pat ]]; then return 0 fi done <<<$(unzip -l "$file") return 1 } getResourceFromSpiget() { resource=${1?} log "Downloading resource ${resource} ..." mkdir -p /data/plugins versionfile="/data/plugins/.${resource}-version.json" versionfileNew="/tmp/.${resource}-version.json" if [ -f "$versionfile" ]; then if [[ -n $(find "$versionfile" -mmin +${SPIGET_DOWNLOAD_TOLERANCE}) ]]; then urlVersion="https://api.spiget.org/v2/resources/${resource}/versions/latest" if ! curl -o "${versionfileNew}" -fsSL -H "User-Agent: itzg/minecraft-server" "${extraCurlArgs[@]}" "${urlVersion}"; then log "ERROR failed to download resource version meta data '${resource}' from ${urlVersion}" exit 2 fi installedVersion=$(jq -r '.name' $versionfile) newVersion=$(jq -r '.name' $versionfileNew) if [ "$installedVersion" = "$newVersion" ]; then log "resource '${resource}' not downloaded because installed version '${installedVersion}' already up to date ('${newVersion}')" mv "${versionfileNew}" "${versionfile}" else if downloadResourceFromSpiget "${resource}"; then mv "${versionfileNew}" "${versionfile}" fi fi else log "resource '${resource}' not checked because version meta file newer than '${SPIGET_DOWNLOAD_TOLERANCE}' minutes" fi else if downloadResourceFromSpiget "${resource}"; then urlVersion="https://api.spiget.org/v2/resources/${resource}/versions/latest" if ! curl -o "${versionfileNew}" -fsSL -H "User-Agent: itzg/minecraft-server" "${extraCurlArgs[@]}" "${urlVersion}"; then log "ERROR failed to download resource version meta data '${resource}' from ${urlVersion}" exit 2 fi mv "${versionfileNew}" "${versionfile}" fi fi } downloadResourceFromSpiget() { resource=${1?} tmpfile="/tmp/${resource}.zip" url="https://api.spiget.org/v2/resources/${resource}/download" if ! curl -o "${tmpfile}" -fsSL -H "User-Agent: itzg/minecraft-server" "${extraCurlArgs[@]}" "${url}"; then log "ERROR failed to download resource '${resource}' from ${url}" exit 2 fi if containsJars "${tmpfile}"; then log "Extracting contents of resource ${resource} into plugins" unzip -o -q -d /data/plugins "${tmpfile}" rm "${tmpfile}" elif containsPlugin "${tmpfile}"; then log "Moving resource ${resource} into plugins" mv "${tmpfile}" "/data/plugins/${resource}.jar" else log "ERROR downloaded resource '${resource}' seems to be not a valid plugin" exit 2 fi } if [[ ${SPIGET_RESOURCES} ]]; then if isTrue ${REMOVE_OLD_MODS:-false}; then removeOldMods /data/plugins REMOVE_OLD_MODS=false fi log "Getting plugins via Spiget" IFS=',' read -r -a resources <<<"${SPIGET_RESOURCES}" for resource in "${resources[@]}"; do getResourceFromSpiget "${resource}" done fi exec ${SCRIPTS:-/}start-setupWorld $@