Files
ptp/infra/webhook-server.py

42 lines
1.5 KiB
Python

#!/usr/bin/env python3
import http.server, subprocess, hashlib, hmac, json, os, sys
SECRET = os.environ.get('WEBHOOK_SECRET', 'ptp-deploy-2026')
PORT = 9000
class Handler(http.server.BaseHTTPRequestHandler):
def do_POST(self):
if self.path != '/deploy':
self.send_response(404); self.end_headers(); return
length = int(self.headers.get('Content-Length', 0))
body = self.rfile.read(length)
# Verify signature (Gitea sends X-Gitea-Signature)
sig = self.headers.get('X-Gitea-Signature', '')
expected = hmac.new(SECRET.encode(), body, hashlib.sha256).hexdigest()
if not hmac.compare_digest(sig, expected):
self.send_response(403); self.end_headers()
self.wfile.write(b'Bad signature'); return
try:
data = json.loads(body)
ref = data.get('ref', '')
if ref not in ('refs/heads/mirror', 'refs/heads/main'):
self.send_response(200); self.end_headers()
self.wfile.write(b'Skipped (not mirror/main)'); return
except: pass
subprocess.Popen(['/usr/local/bin/deploy-ptp.sh'])
self.send_response(200); self.end_headers()
self.wfile.write(b'Deploy triggered')
def log_message(self, fmt, *args):
pass # silent
if __name__ == '__main__':
httpd = http.server.HTTPServer(('127.0.0.1', PORT), Handler)
print(f'Webhook server on port {PORT}')
httpd.serve_forever()