sat_info_view.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. # -*- coding: utf-8 -*-
  2. """
  3. Satellite SubView: Info (F1).
  4. Zeigt allgemeine Informationen zum ausgewaehlten Satellite:
  5. Uptime, Hostname, IP, Ping, MAC, Version, OS.
  6. """
  7. from __future__ import annotations
  8. from textual.app import ComposeResult
  9. from textual.containers import Vertical
  10. from textual.widgets import Static
  11. from trixy_core.tui.views.base import MainView
  12. from trixy_core.tui.widgets.status_table import StatusTable
  13. class SatInfoView(MainView):
  14. """F1 im Satellite-Kontext: Allgemeine Informationen."""
  15. TITLE = "Info"
  16. VIEW_ID = "sat_info"
  17. def __init__(self, **kwargs) -> None:
  18. super().__init__(**kwargs)
  19. self._sat_data: dict = {}
  20. self._detail_data: object | None = None
  21. self._refresh_counter: int = 0
  22. def set_satellite(self, sat_data: dict) -> None:
  23. """Setzt die Satellite-Basisdaten."""
  24. self._sat_data = sat_data
  25. def compose(self) -> ComposeResult:
  26. with Vertical(classes="section-box"):
  27. yield Static("[bold]Allgemein[/bold]", classes="section-header")
  28. yield StatusTable(id="sat-info-general")
  29. with Vertical(classes="section-box"):
  30. yield Static("[bold]System[/bold]", classes="section-header")
  31. yield StatusTable(id="sat-info-system")
  32. with Vertical(classes="section-box"):
  33. yield Static("[bold]Netzwerk[/bold]", classes="section-header")
  34. yield StatusTable(id="sat-info-network")
  35. async def on_activate(self) -> None:
  36. """Laedt und zeigt die Satellite-Infos."""
  37. await self._load_detail()
  38. async def refresh_data(self) -> None:
  39. """Periodisches Update (alle 10 Sekunden)."""
  40. self._refresh_counter += 1
  41. if self._refresh_counter % 5 == 0:
  42. await self._load_detail()
  43. async def _load_detail(self) -> None:
  44. """Laedt detaillierte Satellite-Daten vom Server."""
  45. if not self.connection or not self._sat_data:
  46. return
  47. sat_id = self._sat_data.get("satellite_id", "")
  48. if not sat_id:
  49. return
  50. try:
  51. detail = await self.connection.request_satellite_detail(sat_id)
  52. except Exception:
  53. return
  54. if detail is None or detail.error:
  55. return
  56. self._detail_data = detail
  57. self._update_display()
  58. def _update_display(self) -> None:
  59. """Aktualisiert die Anzeige."""
  60. d = self._detail_data
  61. if d is None:
  62. return
  63. # Allgemein
  64. general = self.query_one("#sat-info-general", StatusTable)
  65. general.update_data([
  66. ("Alias", d.alias or "Unbekannt"),
  67. ("Raum", d.room_id or ""),
  68. ("MAC-Adresse", d.mac_address or ""),
  69. ("Version", d.version or "Unbekannt"),
  70. ])
  71. # System
  72. system = self.query_one("#sat-info-system", StatusTable)
  73. hostname = d.hostname or "Unbekannt"
  74. os_info = ""
  75. if d.os_name:
  76. os_info = d.os_name
  77. if d.os_version:
  78. os_info += f" {d.os_version}"
  79. uptime_str = ""
  80. if d.uptime_seconds > 0:
  81. hours = int(d.uptime_seconds // 3600)
  82. minutes = int((d.uptime_seconds % 3600) // 60)
  83. uptime_str = f"{hours}h {minutes}m"
  84. system.update_data([
  85. ("Hostname", hostname),
  86. ("Betriebssystem", os_info or "Unbekannt"),
  87. ("Uptime", uptime_str or "Unbekannt"),
  88. ])
  89. # Netzwerk
  90. network = self.query_one("#sat-info-network", StatusTable)
  91. ping_str = ""
  92. if d.ping_ms >= 0:
  93. ping_str = f"{d.ping_ms:.0f} ms"
  94. network.update_data([
  95. ("IP-Adresse", d.ip_address or "Unbekannt"),
  96. ("Ping", ping_str or "Unbekannt"),
  97. ])