From e6496a821f91668f0c86f865b1f0a450c05abfb9 Mon Sep 17 00:00:00 2001 From: Chris Sader Date: Fri, 17 Jul 2026 18:16:03 -0500 Subject: [PATCH] Add HTTP trigger endpoint for on-demand frame refresh Lightweight server on port 8080 that accepts POST /refresh and starts birdframe.service. Runs as a systemd service so the web UI's Refresh Now button can trigger immediate display updates. Co-Authored-By: Claude Opus 4 --- frame/trigger.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 frame/trigger.py diff --git a/frame/trigger.py b/frame/trigger.py new file mode 100644 index 0000000..cf010ba --- /dev/null +++ b/frame/trigger.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 +"""Tiny HTTP server that triggers a birdframe refresh on demand.""" + +import http.server +import subprocess +import json + +PORT = 8080 + +class Handler(http.server.BaseHTTPRequestHandler): + def do_POST(self): + if self.path == "/refresh": + subprocess.Popen(["systemctl", "start", "birdframe.service"]) + self.send_response(200) + self.send_header("Content-Type", "application/json") + self.send_header("Access-Control-Allow-Origin", "*") + self.end_headers() + self.wfile.write(json.dumps({"status": "triggered"}).encode()) + else: + self.send_response(404) + self.end_headers() + + def do_OPTIONS(self): + self.send_response(204) + self.send_header("Access-Control-Allow-Origin", "*") + self.send_header("Access-Control-Allow-Methods", "POST, OPTIONS") + self.send_header("Access-Control-Allow-Headers", "Content-Type") + self.end_headers() + + def log_message(self, fmt, *args): + pass + +if __name__ == "__main__": + server = http.server.HTTPServer(("0.0.0.0", PORT), Handler) + print(f"frame-trigger listening on :{PORT}") + server.serve_forever()