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.