@@ -0,0 +1,144 @@
|
||||
"""Полная настройка киоска 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"),
|
||||
}
|
||||
Reference in New Issue
Block a user