From 1b1e6d6165531b4489f665bb0fd46e2d996de19f Mon Sep 17 00:00:00 2001 From: Peter Stone Date: Tue, 16 Jun 2026 07:32:18 +0000 Subject: feat: add playground/web/server.py (missed in c86abd2) Stdlib Python status page on port 9090 referenced in the service gateway commit but not included. Serves system info at / and a JSON health check at /health. Co-Authored-By: Claude Sonnet 4.6 --- playground/web/server.py | 94 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 playground/web/server.py (limited to 'playground/web/server.py') diff --git a/playground/web/server.py b/playground/web/server.py new file mode 100644 index 0000000..56ae429 --- /dev/null +++ b/playground/web/server.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python3 +""" +Playground demo service — stdlib HTTP status page on port 9090. +Registered behind doot's auth layer at /playground/. +Start: python3 playground/web/server.py +""" + +import http.server +import json +import os +import platform +import socket +import time +from datetime import datetime, timezone + +START_TIME = time.monotonic() +PORT = int(os.environ.get("PLAYGROUND_PORT", "9090")) + +STATUS_HTML = """\ + + + + + +Playground — System Status + + + +

Playground

+

doot service gateway demo — authenticated via doot session

+ + + + + + + + + +
statusok
hostname{hostname}
python{python}
platform{platform}
uptime{uptime}
server time{now}
pid{pid}
port{port}
+ + +""" + + +def _uptime() -> str: + elapsed = int(time.monotonic() - START_TIME) + h, rem = divmod(elapsed, 3600) + m, s = divmod(rem, 60) + return f"{h}h {m}m {s}s" + + +class Handler(http.server.BaseHTTPRequestHandler): + def log_message(self, fmt, *args): # quieter logs + print(f"{self.address_string()} {fmt % args}") + + def do_GET(self): + if self.path in ("/health", "/health/"): + body = json.dumps({"status": "ok", "uptime": _uptime()}).encode() + self._respond(200, "application/json", body) + return + + html = STATUS_HTML.format( + hostname=socket.gethostname(), + python=platform.python_version(), + platform=platform.system() + " " + platform.release(), + uptime=_uptime(), + now=datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC"), + pid=os.getpid(), + port=PORT, + ).encode() + self._respond(200, "text/html; charset=utf-8", html) + + def _respond(self, code, content_type, body): + self.send_response(code) + self.send_header("Content-Type", content_type) + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + +if __name__ == "__main__": + server = http.server.HTTPServer(("127.0.0.1", PORT), Handler) + print(f"playground listening on http://127.0.0.1:{PORT} (pid {os.getpid()})") + server.serve_forever() -- cgit v1.2.3