#!/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
| status | ok |
| 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()