mirror of
https://github.com/itzg/docker-minecraft-server
synced 2024-11-10 14:24:28 +00:00
121 lines
3.3 KiB
Bash
Executable file
121 lines
3.3 KiB
Bash
Executable file
#!/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 $@
|