Files
nearxos 0844adbcbe Update cloud-init scripts and documentation for enhanced DNS management and provisioning steps</message>
<message>Modify the first-boot.sh script to include an additional step for managing screen brightness during the provisioning process. Update user-data.bootstrap to improve DNS configuration by ensuring NetworkManager manages /etc/resolv.conf correctly, and remove obsolete scripts related to systemd-resolved. Enhance documentation to reflect these changes and clarify the setup process for users, improving overall network boot functionality and user experience.
2026-03-06 14:45:23 +02:00

85 lines
2.9 KiB
Python

#!/usr/bin/env python3
"""
Local HTTP API for screen-brightness override (crew manual control per MSC.191(79)).
Listens on 127.0.0.1 only. Run as root so it can write /run/screen-brightness/override.
"""
import os
import urllib.parse
from pathlib import Path
from http.server import HTTPServer, BaseHTTPRequestHandler
OVERRIDE_FILE = Path("/run/screen-brightness/override")
RUN_DIR = OVERRIDE_FILE.parent
HOST = "127.0.0.1"
PORT = 8765
class BrightnessHandler(BaseHTTPRequestHandler):
def do_POST(self):
path = self.path.split("?")[0]
if path != "/brightness" and path != "/":
self.send_error(404)
return
length = int(self.headers.get("Content-Length", 0))
body = self.rfile.read(length).decode("utf-8", errors="ignore") if length else ""
query = urllib.parse.parse_qs(urllib.parse.urlparse(self.path).query)
level = (query.get("level") or [None])[0] or (urllib.parse.parse_qs(body).get("level") or [None])[0]
if not level:
self.send_response(400)
self.send_header("Content-Type", "text/plain")
self.end_headers()
self.wfile.write(b"missing level=1|2|3|4|5|auto")
return
level = level.strip().lower()
if level == "auto":
value = "auto"
elif level in ("1", "2", "3", "4", "5"):
value = level
else:
self.send_response(400)
self.send_header("Content-Type", "text/plain")
self.end_headers()
self.wfile.write(b"level must be 1, 2, 3, 4, 5, or auto")
return
try:
RUN_DIR.mkdir(parents=True, exist_ok=True)
OVERRIDE_FILE.write_text(value + "\n")
except Exception as e:
self.send_response(500)
self.send_header("Content-Type", "text/plain")
self.end_headers()
self.wfile.write(f"write failed: {e}".encode())
return
self.send_response(200)
self.send_header("Content-Type", "text/plain")
self.end_headers()
self.wfile.write(f"ok {value}\n".encode())
def do_GET(self):
if self.path.split("?")[0] in ("/", "/brightness", "/state"):
state_file = Path("/run/screen-brightness/state")
if state_file.exists():
self.send_response(200)
self.send_header("Content-Type", "text/plain")
self.end_headers()
self.wfile.write(state_file.read_bytes())
else:
self.send_response(404)
self.end_headers()
else:
self.send_error(404)
def log_message(self, format, *args):
pass # quiet; use journal if needed
def main():
if os.geteuid() != 0:
raise SystemExit("brightness-api must run as root to write /run/screen-brightness/override")
server = HTTPServer((HOST, PORT), BrightnessHandler)
server.serve_forever()
if __name__ == "__main__":
main()