wrolpi/controller/defaults.py
Roland 8687816b84 controller: selectable hotspot protocol (WPA2/WPA3) with device capability probing
Probe the selected WiFi device with iw to determine which hotspot
protocols it can host: WPA2 requires AP mode; WPA3 requires SAE in AP
mode (SAE_OFFLOAD_AP, or a mac80211 driver with the CMAC cipher for
software SAE).  The Raspberry Pi's brcmfmac supports neither, so Pis
correctly offer WPA2 only (verified against real Pi 4/Pi 5 iw output).

The protocol is saved as hotspot.protocol in controller.yaml.
enable_hotspot() now always sets the Hotspot connection's key-mgmt
explicitly (sae + required PMF for WPA3) so a reused profile cannot
keep a stale protocol, and reverts to WPA2 if the driver rejects SAE.

New GET /api/hotspot/protocols endpoint; protocol dropdowns added to
both the ControllerPage React UI and the fallback controller UI.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 21:12:24 -06:00

135 lines
3.8 KiB
Python

"""
Code-defined default configuration for the Controller.
Controller starts with these defaults and loads overrides from
/media/wrolpi/config/controller.yaml after the drive is mounted.
"""
DEFAULT_CONFIG = {
"port": 80,
"media_directory": "/media/wrolpi",
"hide_cert_banner": False,
"drives": {
"supported_filesystems": ["ext4", "btrfs", "vfat", "exfat"],
"auto_mount": True,
"mounts": [], # Populated from controller.yaml after drive mount
},
"managed_services": [
# WROLPi services
{
"name": "wrolpi-controller",
"systemd_name": "wrolpi-controller",
"port": 80,
"viewable": True,
"use_https": False,
"description": "Controller API (FastAPI)",
},
{
"name": "wrolpi-api",
"systemd_name": "wrolpi-api",
"port": 8081,
"viewable": True,
"use_https": False,
"description": "Python API (Sanic)",
},
{
"name": "wrolpi-api-dev",
"systemd_name": "wrolpi-api-dev",
"port": 8081,
"viewable": True,
"use_https": False,
"description": "Python API (Development)",
"kind": "task",
"show_only_when_running": True,
},
{
"name": "wrolpi-app",
"systemd_name": "wrolpi-app",
"port": 3000,
"viewable": False,
"use_https": False,
"description": "React frontend",
},
{
"name": "wrolpi-app-dev",
"systemd_name": "wrolpi-app-dev",
"port": 3000,
"viewable": False,
"use_https": False,
"description": "React frontend (Development)",
"kind": "task",
"show_only_when_running": True,
},
{
"name": "wrolpi-help",
"systemd_name": "wrolpi-help",
"port": 8086,
"viewable": True,
"use_https": True,
"description": "Help documentation",
},
{
"name": "wrolpi-kiwix",
"systemd_name": "wrolpi-kiwix",
"port": 8085,
"viewable": True,
"use_https": True,
"description": "Kiwix/Zim server",
},
# System services
{
"name": "caddy",
"systemd_name": "caddy",
"port": 443,
"viewable": True,
"use_https": True,
"description": "Web proxy (HTTPS)",
},
# Samba file sharing services
{
"name": "smbd",
"systemd_name": "smbd",
"port": 445,
"viewable": False,
"use_https": False,
"description": "Samba file sharing",
},
{
"name": "nmbd",
"systemd_name": "nmbd",
"port": 137,
"viewable": False,
"use_https": False,
"description": "Samba NetBIOS name service",
},
# Upgrade service - only shown when running
{
"name": "wrolpi-upgrade",
"systemd_name": "wrolpi-upgrade",
"port": None,
"viewable": False,
"use_https": False,
"description": "WROLPi upgrade process",
"kind": "task",
"show_only_when_running": True,
},
],
"hotspot": {
"device": "wlan0",
"ssid": "WROLPi",
"password": "wrolpi hotspot",
"protocol": "wpa2", # wpa2 (wpa-psk) or wpa3 (sae); see get_device_hotspot_protocols
},
"throttle": {
"default_governor": "ondemand",
},
"samba": {
"shares": [],
# Each share: {"name": str, "path": str, "read_only": bool, "comment": str}
},
}