121 lines
3.2 KiB
Python
121 lines
3.2 KiB
Python
import argparse
|
|
import configparser
|
|
import json
|
|
import sys
|
|
import urllib.request
|
|
from pathlib import Path
|
|
|
|
INI_FILE = Path("latestversion.ini")
|
|
PYTHON_API = "https://endoflife.date/api/v1/products/python"
|
|
CAESIUM_API = "https://api.github.com/repos/Lymphatus/caesium-clt/tags"
|
|
|
|
EXIT_NO_UPDATE = 0
|
|
EXIT_UPDATE_AVAILABLE = 10
|
|
EXIT_ERROR = 20
|
|
|
|
|
|
def fetch_json(url):
|
|
with urllib.request.urlopen(url, timeout=15) as r:
|
|
return json.loads(r.read().decode("utf-8"))
|
|
|
|
|
|
def load_ini():
|
|
cfg = configparser.ConfigParser()
|
|
cfg.read(INI_FILE, encoding="utf-8")
|
|
return cfg
|
|
|
|
|
|
def save_ini(cfg):
|
|
with open(INI_FILE, "w", encoding="utf-8") as f:
|
|
cfg.write(f)
|
|
|
|
|
|
def check_python(cfg, result):
|
|
used = cfg["DEFAULT"].get("python_used_version", "").strip()
|
|
major_minor = ".".join(used.split(".")[:2])
|
|
|
|
data = fetch_json(PYTHON_API)
|
|
releases = data.get("result", {}).get("releases", [])
|
|
|
|
for rel in releases:
|
|
if rel.get("name") != major_minor:
|
|
continue
|
|
|
|
latest = rel.get("latest", {}).get("name", "")
|
|
is_maintained = rel.get("isMaintained", True)
|
|
|
|
cfg["DEFAULT"]["python_latest_version"] = latest
|
|
|
|
if used != latest:
|
|
result["updates"].append({
|
|
"tool": "python",
|
|
"used": used,
|
|
"latest": latest,
|
|
"maintained": is_maintained,
|
|
"url": (
|
|
f"https://www.python.org/ftp/python/{latest}/"
|
|
f"python-{latest}-embed-amd64.zip"
|
|
)
|
|
})
|
|
|
|
|
|
def check_caesium(cfg, result):
|
|
used = cfg["DEFAULT"].get("caesiumclt_used_version", "").strip()
|
|
|
|
tags = fetch_json(CAESIUM_API)
|
|
latest = tags[0]["name"]
|
|
|
|
cfg["DEFAULT"]["caesiumclt_latest_version"] = latest
|
|
|
|
if used != latest:
|
|
result["updates"].append({
|
|
"tool": "caesiumclt",
|
|
"used": used,
|
|
"latest": latest,
|
|
"maintained": True,
|
|
"url": (
|
|
f"https://github.com/Lymphatus/caesium-clt/releases/download/{latest}/"
|
|
f"caesiumclt-{latest}-x86_64-pc-windows-msvc.zip"
|
|
)
|
|
})
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("--yes", action="store_true")
|
|
parser.add_argument("--json", action="store_true")
|
|
args = parser.parse_args()
|
|
|
|
cfg = load_ini()
|
|
result = {"updates": []}
|
|
|
|
try:
|
|
check_python(cfg, result)
|
|
check_caesium(cfg, result)
|
|
except Exception as e:
|
|
print(f"ERROR: {e}")
|
|
sys.exit(EXIT_ERROR)
|
|
|
|
save_ini(cfg)
|
|
|
|
if args.json:
|
|
print(json.dumps(result, indent=2))
|
|
else:
|
|
for u in result["updates"]:
|
|
print(
|
|
f"{u['tool'].capitalize()}: aktuell genutzt {u['used']}, "
|
|
f"neu {u['latest']}, download?"
|
|
)
|
|
print(f"{u['tool'].upper()}_DOWNLOAD={u['url']}")
|
|
|
|
if not u["maintained"]:
|
|
print(
|
|
f"WARNING: Achtung Version {u['latest']} "
|
|
"wird nicht mehr gewartet!"
|
|
)
|
|
|
|
sys.exit(EXIT_UPDATE_AVAILABLE if result["updates"] else EXIT_NO_UPDATE)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |