Skip to content

CLI: dom-odczyt — odczyt procesów iPadów dla domu z bazy - #88

Merged
mbeczynski merged 2 commits into
mainfrom
feat/dom-odczyt
Oct 23, 2026
Merged

mbeczynski merged 2 commits into
mainfrom
feat/dom-odczyt

Conversation

@mbeczynski

Copy link
Copy Markdown
Contributor

Co

Nowe polecenie administratora instancji (jak dom-sieci):

kidwatch dom-odczyt <dom> [--wlacz | --wylacz] [--co SEKUNDY] [--alarm-po GODZINY]
  • Bez flag wypisuje stan: enabled, poll_seconds, unreachable_alert_hours, katalog rekordów parowania instancji (device_read.pair_record_dir z config.yaml) i urządzenia z udid/host: UDID tylko końcówka (…ABCD), host w całości, czy host dopuszcza strażnik sieci domu (jeśli nie, podpowiedź dom-sieci) i czy istnieje plik <UDID>.plist. Sprawdzamy tylko, czy plik istnieje, treści nie czytamy.
  • Zmiana (konfiguracja_domu.ustaw_odczyt) działa tylko dla domu w trybie baza. Dla domu w trybie yaml polecenie odmawia. Wszystko dzieje się w jednej transakcji:
    • zmieniane są tylko enabled / poll_seconds / unreachable_alert_hours w domy.ustawienia["device_read"]; aliasy procesów, timeout i reszta ustawień domu zostają bez zmian;
    • cały dom przechodzi walidację modelem (home_z_danych z bieżącymi integracjami i sekretami, jak przy starcie). Dom bez źródła DNS też jest walidowany, z zastępczym źródłem jak w imporcie struktury. Między innymi walidator „device_read.enabled=true, ale zadne urzadzenie nie ma udid i host” odrzuca włączenie;
    • dodatkowo blad_startu_conn przed i po zmianie: zmiana, po której dom przestałby startować, jest odrzucana;
    • strażnik: przy wynikowym enabled=true każdy host urządzenia z udid musi być literałem IP dopuszczonym przez dozwolone_sieci. Robi to ta sama funkcja, którą sprawdza build_watchers. Jeśli nie, polecenie odmawia i podaje gotowe kidwatch dom-sieci <dom> --dodaj <host>/32;
    • podbicie domy.wersja (nadzorca przeładuje dom bez restartu) i wpis w audycie dom.odczyt (kto=cli, stan przed i po, bez UDID). Gdy nic się nie zmienia, nie ma zapisu ani podbicia wersji.

Dlaczego

Odczyt iPadów z klastra działa po regule NAT na bramie domowej (2026-10-23 odczytano listę procesów iPada z poda). Dom 1 bierze jednak konfigurację z bazy, a device_read.enabled w domy.ustawienia dało się zmienić tylko ponownym dom-importuj 1 z config.yaml, a tego chcemy uniknąć.

Sprawdziłem ścieżkę runtime w trybie baza i niczego nie trzeba było naprawiać:

  • pair_record_dir to pole instancji. Config.split() wyłącza je z HomeConfig, więc nie trafia do domy.ustawienia; build_home_runtime bierze inst.device_read.records_path.
  • TcpLockdownBackend bez jawnego cache_dir używa tempfile.gettempdir()/pmd3, czyli /tmp/pmd3. /tmp w podzie to zapisywalny emptyDir (16Mi), przy readOnlyRootFilesystem.
  • W trybie baza build_watchers przepuszcza tylko hosty dopuszczone przez strażnika domu. Polecenie sprawdza to samo przed zapisem.

Testy

tests/test_dom_odczyt.py (8 testów):

  • włączenie i wyłączenie: wersja podbita, reszta ustawień i kolumn domu nietknięta, audyt bez UDID, „bez zmian” bez zapisu;
  • ścieżka runtime: zbuduj_dom → build_watchers z katalogiem rekordów instancji daje obserwatora iPada;
  • odmowy, po każdej baza bajt w bajt bez zmian: host poza siecią domu (podpowiedź dom-sieci to działające polecenie), brak urządzeń z udid+host (Dom 1 oraz dom bez źródła DNS), --co 1 poniżej minimum modelu, dom yaml, nieistniejący dom;
  • podgląd stanu nie wypisuje pełnego UDID.

Kanarki (odwrócona poprawka, python -B, -p no:cacheprovider): strażnik, podbicie wersji, odmowa yaml, maska UDID, walidacja modelu, zachowanie reszty device_read. Po każdym odwróceniu wskazany test pada.

uv run pytest -q i uv run ruff check: zielone.

Wdrożenie

Kolejność, prawdziwe adresy tylko w prywatnym repo infrastruktury:

  1. Wartości chartu (Argo helm.valuesObject): networkPolicy.egress.wDomu += {cidr: <IP iPada>/32, port: 62078} dla każdego iPada oraz deviceRead.enabled: true. Bez tego /pairing nie jest montowany. config.yaml w Sekrecie musi mieć device_read.pair_record_dir: /pairing.
  2. kidwatch dom-sieci 1 --dodaj <IP iPada>/32 dla każdego iPada.
  3. kidwatch dom-odczyt 1: sprawdzić stan (sieć „dopuszczony”, rekord „jest”), potem kidwatch dom-odczyt 1 --wlacz.

🤖 Generated with Claude Code

mbeczynski and others added 2 commits October 23, 2026 12:12
Dom w trybie `baza` trzyma device_read w domy.ustawienia, a nie bylo
polecenia, ktorym administrator moglby go wlaczyc (jedyna droga: ponowny
dom-importuj 1 z config.yaml).

`kidwatch dom-odczyt <dom> [--wlacz|--wylacz] [--co S] [--alarm-po H]`:
bez flag stan (enabled, poll_seconds, unreachable_alert_hours, urzadzenia
z koncowka UDID i hostem, czy host dopuszcza straznik domu, czy jest
rekord parowania w katalogu instancji). Zmiana tylko w trybie `baza`,
w jednej transakcji: walidacja modelu domu i bledu startu, straznik
sieci dla hostow iPadow (odmowa z gotowym `dom-sieci <dom> --dodaj
<host>/32`), podbicie wersji (przeladowanie bez restartu), audyt
`dom.odczyt` bez UDID.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Gorne granice i allow_inf_nan=False dla czasow z konfiguracji, ktore
  trafiaja do asyncio.sleep/timedelta (odczyt iPadow, TV, UniFi, MDM,
  czas gry, NextDNS/AdGuard, timeouty kanalow). `--alarm-po inf` dawal
  OverflowError w petli i restart domu w kolko, `--co inf` sen na zawsze.
- load_pair_record: kazdy blad odczytu/parsowania rekordu parowania
  (uciety XML, smiec, nie-slownik) = DeviceUnavailable, bez tresci pliku;
  urzadzenie pominiete zamiast nieudanego przeladowania domu.
- dom-odczyt --wlacz (z wylaczonego) czysci po COMMIT dev-ok/dev-since
  urzadzen domu w bazie zdarzen domu: stare klucze nie daja alarmu
  zaraz po wlaczeniu.
- SejfError w dom-odczyt: czytelna odmowa (kod 2), baza bez zmian.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@mbeczynski
mbeczynski merged commit e60f756 into main Oct 23, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant