145 lines
4.6 KiB
Python
145 lines
4.6 KiB
Python
"""Полная настройка киоска 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"),
|
||
}
|