Flere anlegg – hovedscene, resepsjon, crew – og ett sted å sende fra, med avkryssing for hvilke soner meldingen skal til. Sentralen er en vanlig announcer med [zones] i config. En sone er en vanlig announcer med ANNOUNCER_MESH_SECRET. Samme image, ingen mode, og en sone kan brukes alene hvis sentralen faller ut. Hver avhengighet med C-kode har aarch64-wheel i uv.lock, så det samme bildet går på en Raspberry Pi uten å kompilere noe. Sentralen syntetiserer én gang og sender ferdig WAV (POST /api/play, multipart). Sonen trenger da verken nett, edge-tts eller Pipers 670 MB for det den får – Item.wav er hele endringen i avspillingen. Køene forblir per sone: dispatcheren har egen tråd og egen kø, leverer til hver sone i hver sin tråd med timeout, og går videre. En opptatt hovedscene holder ikke igjen resepsjonen, og en sone som er nede feiler alene – synlig per sone i UI og revisjonslogg. Auth gjenbrukes: ny leverandør mesh på header X-Mesh-Key (ikke Bearer – den leses av JWT-leverandøren, som avviser alt som ikke er et JWT før neste får prøve), med én handling, play. To regler som fulgte med: - play følger aldri med «alt åpent». Uten det kunne hvem som helst POSTe en WAV til en åpen sone og få den spilt. Testen for åpen modus fanget det. - En legitimasjon som vises fram og er feil gir 401 også der gjester ellers har lov. Før slapp en feil PIN i åpen modus stille gjennom som gjest. mesh teller ikke som innlogging for folk: en sone med bare nøkkelen har fortsatt åpen side lokalt. Planlagte sendinger husker sonene sine og fordeles gjennom dispatcheren; planen ender som sent hvis minst én sone tok imot, med «hovedscene: kø #3, crew: nede» som note. Hodeløs Pi: install.sh kjører loginctl enable-linger, ellers finnes ikke lydsocketen når ingen logger inn. docs/mesh.md tar også raspi-config for jack framfor HDMI. 38 nye tester, 148 totalt. Fordelingen testes uten nett med stubbet transport; selve HTTP-en testes mot en levende werkzeug-server, så den håndrullede multiparten møter Flask sin parser. Verifisert i compose med sentral og to soner: til alle, bare til én, og én sone stoppet. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
46 lines
1.3 KiB
TOML
46 lines
1.3 KiB
TOML
# Konfigurasjon for docker compose-testingen. Alle tre innloggingsmetodene er
|
||
# på samtidig, noe man nok ikke vil i virkeligheten, men her er poenget å
|
||
# kunne prøve dem.
|
||
#
|
||
# Hemmelighetene settes som miljøvariabler i compose.yaml, ikke her.
|
||
|
||
[app]
|
||
title = "Announcer Test"
|
||
subtitle = "Docker-oppsett – PIN, JWT og OIDC er alle slått på"
|
||
accent = "#f5a623"
|
||
quick_phrases = ["Dette er en test", "Pizzaen er kommet. Hent i kantina!"]
|
||
|
||
# Mesh: denne er sentral for sitt eget anlegg og to soner i compose-nettet.
|
||
# Nøkkelen settes som ANNOUNCER_MESH_SECRET i compose.test.yaml.
|
||
[zones]
|
||
her = "local"
|
||
a = "http://sone-a:8090"
|
||
b = "http://sone-b:8090"
|
||
|
||
[auth]
|
||
providers = ["oidc", "jwt", "pin"]
|
||
|
||
[auth.pin]
|
||
pin = "1234"
|
||
role = "crew"
|
||
hint = "1234 i dette testoppsettet"
|
||
|
||
[auth.jwt]
|
||
issuer = "http://localhost:9000"
|
||
audience = "announcer"
|
||
role_claim = "roles"
|
||
|
||
[auth.oidc]
|
||
issuer = "http://localhost:9000"
|
||
client_id = "announcer"
|
||
label = "Logg inn med dummy-IdP"
|
||
# Delt horisont: nettleseren ser IdP-en som localhost:9000, mens announcer
|
||
# selv snakker med den som idp:9000 inne i compose-nettet. Derfor settes
|
||
# endepunktene manuelt istedenfor å bruke discovery.
|
||
authorization_endpoint = "http://localhost:9000/oauth/authorize"
|
||
token_endpoint = "http://idp:9000/oauth/token"
|
||
|
||
[roles]
|
||
anonymous = ["view"]
|
||
crew = ["view", "preview", "announce", "schedule"]
|
||
admin = ["*"]
|