Files
site/WESP_REL/app/services/kiosk_full_setup_service.py
2026-07-17 12:57:18 +03:00

145 lines
4.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Полная настройка киоска 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"),
}