New Minecraft’s server update script has landed :)
In the past, I had no idea that Mojang publishes list of all released server versions. This is why, I had this crawling like script to retrieve server.jar location.
It was nasty, but worked.
#!/bin/bash
TARGET_LOCATION=$1
AGENT="user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
SERVER_LINE=`curl -s -H "$AGENT" https://www.minecraft.net/en-us/download/server | grep "mincraft version"`
SERVER_FILE_LINE=`echo $SERVER_LINE | cut -f2 -d">" | cut -f1 -d"<"`
SERVER_DOWNLOAD_LINK=`echo $SERVER_LINE | cut -f2 -d'"'`
SERVER_VERSION=`basename $SERVER_FILE_LINE .jar | sed 's/minecraft_server.//'`
echo $SERVER_VERSION
echo $SERVER_DOWNLOAD_LINK
if [ ! -e ${TARGET_LOCATION}/minecraft_server.${SERVER_VERSION}.jar ]; then
curl -s -H "$AGENT" \
--output ${TARGET_LOCATION}/minecraft_server.${SERVER_VERSION}.jar \
$SERVER_DOWNLOAD_LINK
jar tf ${TARGET_LOCATION}/minecraft_server.${SERVER_VERSION}.jar > /dev/null
retVal=$?
if [ $retVal -ne 0 ]; then
rm ${TARGET_LOCATION}/minecraft_server.${SERVER_VERSION}.jar
echo "Error while retrieving new minecraft server"
else
ln -sf "minecraft_server.${SERVER_VERSION}.jar" ${TARGET_LOCATION}/server.jar
chown -h minecraft:minecraft ${TARGET_LOCATION}/server.jar
fi
fi
In fact, it worked for quite few years without any issues. Until the page with server.jar has changed and everything went South.
While fixing it, I have found that there was easier way to find location of server.jar. It is simply published using JSON format
#!/bin/bash
set -x
TARGET_LOCATION=$1
curl -O https://launchermeta.mojang.com/mc/game/version_manifest.json
SERVER_VERSION=`jq '.latest.release' version_manifest.json | sed 's/"//g'`
SERVER_MANIFEST=`jq -r ".versions[] | select(.id == \"${SERVER_VERSION}\") | .url" version_manifest.json`
curl $SERVER_MANIFEST > server.json
SERVER_JAR=`jq '.downloads.server.url' server.json | sed 's/"//g'`
echo $SERVER_JAR
echo ${TARGET_LOCATION}/minecraft_server.${SERVER_VERSION}.jar
if [ ! -e ${TARGET_LOCATION}/minecraft_server.${SERVER_VERSION}.jar ]; then
curl --output ${TARGET_LOCATION}/minecraft_server.${SERVER_VERSION}.jar ${SERVER_JAR}
jar tf ${TARGET_LOCATION}/minecraft_server.${SERVER_VERSION}.jar > /dev/null
retVal=$?
if [ $retVal -ne 0 ]; then
rm ${TARGET_LOCATION}/minecraft_server.${SERVER_VERSION}.jar
echo "Error while retrieving new minecraft server"
else
ln -sf "minecraft_server.${SERVER_VERSION}.jar" ${TARGET_LOCATION}/server.jar
chown -h minecraft:minecraft ${TARGET_LOCATION}/server.jar
fi
fi
And in case you can’t find JSON, you can always try calling him.