#!/usr/bin/env python3 config_file = '/etc/minecraft.conf' manifest_url = 'https://launchermeta.mojang.com/mc/game/version_manifest.json' import configparser, os, os.path, zipfile, io, json, sys import requests cparser = configparser.ConfigParser() with open(config_file) as f: # ConfigParser needs INI-style config with at least one section cparser.read_string('[a]\n' + f.read()) mc_dir = cparser['a']['srvdir'] build_type = cparser['a']['build_type'] mc_jar = os.path.join(mc_dir, 'server.jar') with zipfile.ZipFile(mc_jar) as z: with z.open('version.json') as f: mc_ver_local = json.load(io.TextIOWrapper(f, 'utf-8'))['id'] all_manifest = requests.get(manifest_url).json() mc_ver_remote = all_manifest['latest'][build_type] if mc_ver_local != mc_ver_remote: print('upgrade from', mc_ver_local, 'to', mc_ver_remote) new_manifest_url = [x['url'] for x in all_manifest['versions'] if x['id'] == mc_ver_remote][0] new_manifest = requests.get(new_manifest_url).json() download_url = new_manifest['downloads']['server']['url'] download_file = os.path.join('versions', mc_ver_remote + '.jar') download_file_full = os.path.join(mc_dir, download_file) resp = requests.get(download_url, stream=True) if resp.ok: with open(download_file_full, 'wb') as f: for chunk in resp.iter_content(None): f.write(chunk) mc_jar_new = os.path.join(mc_dir, 'server.jar.new') os.symlink(download_file, mc_jar_new) os.rename(mc_jar_new, mc_jar) else: print('download failed:', resp.status_code, file=sys.stderr) exit(1)