#!/usr/bin/env python3 # Cron: 15 3 * * * /usr/bin/python3 /root/update_gitea.py >> /var/log/gitea_update.log 2>&1 import subprocess import requests import os import shutil import pwd import grp GITEA_BIN = "/usr/local/bin/gitea" SERVICE_NAME = "gitea.service" DOWNLOAD_DIR = "/tmp" GITEA_USER = "gitea" GITEA_GROUP = "gitea" def get_current_version(): result = subprocess.run([GITEA_BIN, "-v"], capture_output=True, text=True) return result.stdout.strip().split()[2] # "1.23.6" def get_latest_version(): url = "https://api.github.com/repos/go-gitea/gitea/releases/latest" r = requests.get(url) r.raise_for_status() data = r.json() return data["tag_name"].lstrip("v") def download_latest(version): url = f"https://dl.gitea.com/gitea/{version}/gitea-{version}-linux-amd64" dest_path = os.path.join(DOWNLOAD_DIR, "gitea_latest") r = requests.get(url, stream=True) with open(dest_path, 'wb') as f: shutil.copyfileobj(r.raw, f) os.chmod(dest_path, 0o755) return dest_path def stop_service(): subprocess.run(["systemctl", "stop", SERVICE_NAME], check=True) def start_service(): subprocess.run(["systemctl", "daemon-reexec"]) subprocess.run(["systemctl", "daemon-reload"]) subprocess.run(["systemctl", "start", SERVICE_NAME], check=True) def replace_binary(new_binary_path): backup = GITEA_BIN + ".bak" shutil.copy2(GITEA_BIN, backup) shutil.copy2(new_binary_path, GITEA_BIN) uid = pwd.getpwnam(GITEA_USER).pw_uid gid = grp.getgrnam(GITEA_GROUP).gr_gid os.chown(GITEA_BIN, uid, gid) def verify_binary(): result = subprocess.run([GITEA_BIN, "-v"], capture_output=True, text=True) print("Nowa wersja:", result.stdout.strip()) def main(): current = get_current_version() latest = get_latest_version() print("Obecna wersja:", current) print("Najnowsza dostępna wersja:", latest) if current == latest: print("Gitea jest aktualna. Nie wykonuję żadnych zmian.") return path = download_latest(latest) stop_service() replace_binary(path) verify_binary() start_service() print("Aktualizacja zakończona.") if __name__ == "__main__": main()