config.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. # -*- coding: utf-8 -*-
  2. """
  3. Installer-Konfiguration als Dataclass.
  4. Speichert alle Einstellungen die der Benutzer
  5. in der TUI vornimmt.
  6. """
  7. from __future__ import annotations
  8. from dataclasses import dataclass, field
  9. @dataclass
  10. class InstallerConfig:
  11. """Alle Installer-Einstellungen."""
  12. # Modus und Version (von CLI gesetzt)
  13. mode: str = "server"
  14. version: str = "1.0.0"
  15. source_archive: str = ""
  16. # System (F1)
  17. hostname: str = "trixyone"
  18. username: str = "pi"
  19. install_path: str = "/home/pi/trixy"
  20. autostart: bool = True
  21. install_service: bool = True
  22. auto_regist: bool = True
  23. # Netzwerk (F2) — Server
  24. wifi_enabled: bool = True
  25. wifi_ssid: str = "trixyone_srv"
  26. wifi_password: str = "trixy2026!"
  27. wifi_channel: int = 6
  28. ap_ip: str = "10.10.10.1"
  29. dhcp_range_start: str = "10.10.10.10"
  30. dhcp_range_end: str = "10.10.10.50"
  31. # Netzwerk (F2) — Client/Standalone WLAN
  32. wifi_connect: bool = False # WLAN umkonfigurieren
  33. wifi_connect_ssid: str = "" # SSID zum Verbinden
  34. wifi_connect_password: str = "" # WLAN-Passwort
  35. # Netzwerk (F2) — Client
  36. server_host: str = "10.10.10.1"
  37. server_port: int = 2101
  38. room: str = ""
  39. alias: str = ""
  40. # Plugins (F3)
  41. selected_plugins: list[str] = field(default_factory=list)
  42. # NLP Backend (nur relevant wenn nlp_llm in selected_plugins)
  43. nlp_backend: str = "llama_cpp" # "llama_cpp", "ollama" oder "ollama_remote"
  44. ollama_host: str = "http://localhost:11434"
  45. # Modelle
  46. download_models: bool = False
  47. # Vereinbarung (F5)
  48. agreement_accepted: bool = False
  49. @property
  50. def venv_path(self) -> str:
  51. """Pfad zum Python venv."""
  52. return f"{self.install_path}/venv"
  53. @property
  54. def source_path(self) -> str:
  55. """Pfad zum entpackten Quellcode."""
  56. return f"{self.install_path}/source"
  57. def validate(self) -> list[tuple[str, str]]:
  58. """
  59. Validiert die Konfiguration.
  60. Returns:
  61. Liste von (view_id, fehlermeldung) Tupeln.
  62. """
  63. errors: list[tuple[str, str]] = []
  64. # System
  65. if not self.hostname.strip():
  66. errors.append(("system", "Hostname darf nicht leer sein"))
  67. if not self.username.strip():
  68. errors.append(("system", "Benutzername darf nicht leer sein"))
  69. if not self.install_path.strip():
  70. errors.append(("system", "Installationspfad darf nicht leer sein"))
  71. # Netzwerk — Server
  72. if self.mode == "server" and self.wifi_enabled:
  73. if not self.wifi_ssid.strip():
  74. errors.append(("network", "WiFi SSID darf nicht leer sein"))
  75. if len(self.wifi_password) < 8:
  76. errors.append(("network", "WiFi Passwort muss mindestens 8 Zeichen haben"))
  77. # Netzwerk — Client
  78. if self.mode == "client":
  79. if not self.server_host.strip():
  80. errors.append(("network", "Server-Host darf nicht leer sein"))
  81. if not self.room.strip():
  82. errors.append(("network", "Raum darf nicht leer sein"))
  83. if not self.alias.strip():
  84. errors.append(("network", "Alias darf nicht leer sein"))
  85. # Vereinbarung
  86. if not self.agreement_accepted:
  87. errors.append(("agreement", "Nutzungsbedingungen muessen akzeptiert werden"))
  88. # Quellarchiv
  89. if not self.source_archive:
  90. errors.append(("install", "Kein Quellarchiv angegeben"))
  91. return errors