"""Полная настройка киоска Pi: wesp.env + systemd + киоск + одна перезагрузка.""" from __future__ import annotations import os from typing import Any, Dict, List from app.services.kiosk_boot_service import get_kiosk_boot_status, set_kiosk_boot from app.services.pi_platform_setup_service import ( apply_pi_platform_setup, get_pi_platform_setup_status, ) from app.services.system_restart_service import schedule_system_reboot def _is_root() -> bool: geteuid = getattr(os, "geteuid", None) if geteuid is None: return False try: return geteuid() == 0 except OSError: return False def _full_setup_reboot_delay(app_config: Dict[str, Any]) -> float: try: raw = app_config.get("WESP_FULL_SETUP_REBOOT_DELAY_SEC") if raw is None: raw = app_config.get("WESP_AUTO_REBOOT_DELAY_SEC", 10) return max(5.0, float(raw)) except (TypeError, ValueError): return 10.0 def get_full_kiosk_setup_status(app_config: Dict[str, Any]) -> Dict[str, Any]: pi = get_pi_platform_setup_status(app_config) kiosk = get_kiosk_boot_status(app_config) ready = ( pi.get("running_as_root") and pi.get("platform_ready") and kiosk.get("kiosk_enabled") and kiosk.get("kiosk_mode") == "system_labwc" ) return { "running_as_root": pi.get("running_as_root"), "platform_ready": pi.get("platform_ready"), "kiosk_enabled": kiosk.get("kiosk_enabled"), "kiosk_mode": kiosk.get("kiosk_mode"), "chromium_found": kiosk.get("chromium_found"), "full_setup_ready": ready, "env_path": pi.get("env_path"), "systemd_unit": pi.get("systemd_unit"), "gui_user": kiosk.get("gui_user"), "active_url": kiosk.get("active_url"), "message": ( "Киоск Pi полностью настроен" if ready else "Нажмите «Настроить киоск Pi» для env, киоска и перезагрузки" ), } def apply_full_kiosk_setup( app_config: Dict[str, Any], *, hide_desktop: bool = True, schedule_reboot: bool = True, ) -> Dict[str, Any]: if not _is_root(): return { "ok": False, "code": "not_root", "message": ( "Нужен WESP от root (myscript.service), " "иначе нельзя записать /etc и labwc." ), } steps_done: List[str] = [] delay = _full_setup_reboot_delay(app_config) pi = apply_pi_platform_setup(app_config, restart_service=False) if not pi.get("ok"): return { "ok": False, "code": pi.get("code") or "pi_platform_error", "failed_step": "pi_platform", "steps_completed": steps_done, "message": pi.get("message") or "Ошибка настройки Pi", "pi_platform": pi, } steps_done.append("pi_platform") kiosk = set_kiosk_boot( True, app_config, hide_desktop=hide_desktop, schedule_reboot=False, ) if not kiosk.get("ok"): return { "ok": False, "code": kiosk.get("code") or "kiosk_error", "failed_step": "kiosk", "steps_completed": steps_done, "message": kiosk.get("message") or "Ошибка включения киоска", "pi_platform": pi, "kiosk": kiosk, } steps_done.append("kiosk") reboot: Dict[str, Any] = {"scheduled": False} if schedule_reboot: reboot = schedule_system_reboot( app_config, delay_sec=delay, reason="полная настройка киоска", ) if reboot.get("scheduled"): steps_done.append("reboot") parts = [ "Настроены wesp.env и systemd", "киоск Chromium без рабочего стола", ] if reboot.get("scheduled"): parts.append(f"перезагрузка через {int(delay)} с") msg = ". ".join(parts) + "." st = get_full_kiosk_setup_status(app_config) return { "ok": True, "code": "full_setup_applied", "message": msg, "steps_completed": steps_done, "reboot_scheduled": bool(reboot.get("scheduled")), "reboot_delay_sec": delay if reboot.get("scheduled") else None, "reboot_message": reboot.get("message"), "pi_platform": pi, "kiosk": kiosk, "full_setup_ready": st.get("full_setup_ready"), "startup_screen_url": kiosk.get("target_url"), }