| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- # -*- coding: utf-8 -*-
- """
- Satellite SubView: Info (F1).
- Zeigt allgemeine Informationen zum ausgewaehlten Satellite:
- Uptime, Hostname, IP, Ping, MAC, Version, OS.
- """
- from __future__ import annotations
- from textual.app import ComposeResult
- from textual.containers import Vertical
- from textual.widgets import Static
- from trixy_core.tui.views.base import MainView
- from trixy_core.tui.widgets.status_table import StatusTable
- class SatInfoView(MainView):
- """F1 im Satellite-Kontext: Allgemeine Informationen."""
- TITLE = "Info"
- VIEW_ID = "sat_info"
- def __init__(self, **kwargs) -> None:
- super().__init__(**kwargs)
- self._sat_data: dict = {}
- self._detail_data: object | None = None
- self._refresh_counter: int = 0
- def set_satellite(self, sat_data: dict) -> None:
- """Setzt die Satellite-Basisdaten."""
- self._sat_data = sat_data
- def compose(self) -> ComposeResult:
- with Vertical(classes="section-box"):
- yield Static("[bold]Allgemein[/bold]", classes="section-header")
- yield StatusTable(id="sat-info-general")
- with Vertical(classes="section-box"):
- yield Static("[bold]System[/bold]", classes="section-header")
- yield StatusTable(id="sat-info-system")
- with Vertical(classes="section-box"):
- yield Static("[bold]Netzwerk[/bold]", classes="section-header")
- yield StatusTable(id="sat-info-network")
- async def on_activate(self) -> None:
- """Laedt und zeigt die Satellite-Infos."""
- await self._load_detail()
- async def refresh_data(self) -> None:
- """Periodisches Update (alle 10 Sekunden)."""
- self._refresh_counter += 1
- if self._refresh_counter % 5 == 0:
- await self._load_detail()
- async def _load_detail(self) -> None:
- """Laedt detaillierte Satellite-Daten vom Server."""
- if not self.connection or not self._sat_data:
- return
- sat_id = self._sat_data.get("satellite_id", "")
- if not sat_id:
- return
- try:
- detail = await self.connection.request_satellite_detail(sat_id)
- except Exception:
- return
- if detail is None or detail.error:
- return
- self._detail_data = detail
- self._update_display()
- def _update_display(self) -> None:
- """Aktualisiert die Anzeige."""
- d = self._detail_data
- if d is None:
- return
- # Allgemein
- general = self.query_one("#sat-info-general", StatusTable)
- general.update_data([
- ("Alias", d.alias or "Unbekannt"),
- ("Raum", d.room_id or ""),
- ("MAC-Adresse", d.mac_address or ""),
- ("Version", d.version or "Unbekannt"),
- ])
- # System
- system = self.query_one("#sat-info-system", StatusTable)
- hostname = d.hostname or "Unbekannt"
- os_info = ""
- if d.os_name:
- os_info = d.os_name
- if d.os_version:
- os_info += f" {d.os_version}"
- uptime_str = ""
- if d.uptime_seconds > 0:
- hours = int(d.uptime_seconds // 3600)
- minutes = int((d.uptime_seconds % 3600) // 60)
- uptime_str = f"{hours}h {minutes}m"
- system.update_data([
- ("Hostname", hostname),
- ("Betriebssystem", os_info or "Unbekannt"),
- ("Uptime", uptime_str or "Unbekannt"),
- ])
- # Netzwerk
- network = self.query_one("#sat-info-network", StatusTable)
- ping_str = ""
- if d.ping_ms >= 0:
- ping_str = f"{d.ping_ms:.0f} ms"
- network.update_data([
- ("IP-Adresse", d.ip_address or "Unbekannt"),
- ("Ping", ping_str or "Unbekannt"),
- ])
|