Add gitea-webhook.py

This commit is contained in:
ozymandias 2025-05-20 00:12:37 +00:00
parent aae9a59c48
commit 428e8d879f

37
gitea-webhook.py Normal file
View File

@ -0,0 +1,37 @@
#!/root/kpr-links/.venv/bin/python
import hashlib, hmac, os, subprocess, sys
from dotenv import load_dotenv
from flask import Flask, request, abort
app = Flask(__name__)
REPO_DIR = os.getenv("REPO_DIR", "/root/kpr-links")
SERVICE_NAME = os.getenv("SERVICE_NAME", "kpr-links")
SECRET = os.getenv("GITEA_SECRET", "")
def signature_ok(body: bytes, header: str | None) -> bool:
if not SECRET:
return True
if not header or not header.startswith("sha256="):
return False
theirs = header.split("=", 1)[1]
ours = hmac.new(SECRET.encode(), body, hashlib.sha256).hexdigest()
return hmac.compare_digest(ours, theirs)
@app.post("/webhook")
def handle():
if not signature_ok(request.data, request.headers.get("X-Gitea-Signature")):
abort(403)
if request.headers.get("X-Gitea-Event") != "push":
return "ignored", 200
try:
subprocess.check_call(["git", "-C", REPO_DIR, "fetch", "--all"])
subprocess.check_call(["git", "-C", REPO_DIR, "reset", "--hard", "origin/main"])
subprocess.check_call(["systemctl", "restart", SERVICE_NAME])
except subprocess.CalledProcessError as e:
abort(500, str(e))
return "ok", 200
if __name__ == "__main__":
app.run("0.0.0.0", 9000)