mirror of
https://github.com/itzg/docker-minecraft-server
synced 2024-11-13 23:57:08 +00:00
133 lines
3.8 KiB
Bash
Executable file
133 lines
3.8 KiB
Bash
Executable file
#!/bin/bash
|
|
set -euo pipefail
|
|
IFS=$'\n\t'
|
|
|
|
# shellcheck source=start-utils
|
|
. "${SCRIPTS:-/}start-utils"
|
|
handleDebugMode
|
|
|
|
: "${SPIGET_RESOURCES:=}"
|
|
: "${SPIGET_DOWNLOAD_TOLERANCE:=5}" # in minutes
|
|
: "${REMOVE_OLD_MODS_INCLUDE:=*.jar,*-version.json}"
|
|
|
|
acceptArgs=(--accept application/zip --accept application/java-archive --accept application/octet-stream)
|
|
|
|
containsJars() {
|
|
file=${1?}
|
|
|
|
pat='\.jar$'
|
|
|
|
while read -r line; do
|
|
if [[ $line =~ $pat ]]; then
|
|
return 0
|
|
fi
|
|
done < <(unzip -l "$file" | tail -n +4)
|
|
|
|
return 1
|
|
}
|
|
|
|
containsPlugin() {
|
|
file=${1?}
|
|
|
|
pat='plugin.yml$'
|
|
|
|
while read -r line; do
|
|
if [[ $line =~ $pat ]]; then
|
|
return 0
|
|
fi
|
|
done < <(unzip -l "$file" | tail -n +4)
|
|
|
|
return 1
|
|
}
|
|
|
|
getResourceFromSpiget() {
|
|
resource=${1?}
|
|
|
|
log "Downloading resource ${resource} ..."
|
|
|
|
mkdir -p /data/plugins
|
|
|
|
versionfile="/data/plugins/.${resource}-version.json"
|
|
versionfileNew="${versionfile}.tmp"
|
|
|
|
if [ -f "$versionfile" ]; then
|
|
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}"
|
|
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 ! get -o "${versionfileNew}" "${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?}
|
|
|
|
tempDir="/data/plugins/tmp-${resource}"
|
|
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"
|
|
if externalUrl=$(get --json-path '$.file.externalUrl' "${resourceUrl}"); then
|
|
log " Visit $externalUrl to pre-download the resource"
|
|
log " 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"
|
|
exit 1
|
|
fi
|
|
if containsPlugin "${outfile}"; then
|
|
log "Moving resource ${resource} into plugins"
|
|
mv "$outfile" /data/plugins
|
|
elif containsJars "${outfile}"; then
|
|
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}"
|
|
exit 2
|
|
fi
|
|
rm -rf "$tempDir"
|
|
}
|
|
|
|
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" "$@"
|