144 lines
4.6 KiB
Python
144 lines
4.6 KiB
Python
from textual.widgets import Static, Button
|
|
from textual.containers import Vertical, Horizontal
|
|
from textual.reactive import reactive
|
|
from textual.message import Message
|
|
|
|
|
|
class SummaryPanel(Vertical):
|
|
DEFAULT_CSS = """
|
|
SummaryPanel {
|
|
padding: 1 2;
|
|
}
|
|
#summary-header {
|
|
height: auto;
|
|
layout: horizontal;
|
|
content-align: right middle;
|
|
}
|
|
#summary-cache {
|
|
width: auto;
|
|
margin-left: 2;
|
|
}
|
|
#summary-body {
|
|
height: auto;
|
|
margin-top: 1;
|
|
}
|
|
.summary-row {
|
|
height: auto;
|
|
margin: 1 0;
|
|
}
|
|
.summary-count {
|
|
color: $primary;
|
|
text-style: bold;
|
|
}
|
|
.summary-error {
|
|
color: $error;
|
|
text-style: bold;
|
|
}
|
|
"""
|
|
|
|
class ReloadPressed(Message):
|
|
pass
|
|
|
|
class UpgradePressed(Message):
|
|
def __init__(self, target_id: str, name: str):
|
|
self.target_id = target_id
|
|
self.name = name
|
|
super().__init__()
|
|
|
|
class AptClicked(Message):
|
|
def __init__(self, target_id: str):
|
|
self.target_id = target_id
|
|
super().__init__()
|
|
|
|
class CveClicked(Message):
|
|
def __init__(self, target_id: str):
|
|
self.target_id = target_id
|
|
super().__init__()
|
|
|
|
cache_time = reactive("")
|
|
apt_count = reactive(0)
|
|
cve_count = reactive(0)
|
|
target_id = reactive("")
|
|
target_name = reactive("")
|
|
error_msg = reactive("")
|
|
is_skipped = reactive(False)
|
|
|
|
def compose(self):
|
|
with Horizontal(id="summary-header"):
|
|
yield Button("🔄 Reload", id="btn-reload")
|
|
yield Static("", id="summary-cache")
|
|
|
|
with Vertical(id="summary-body"):
|
|
yield Static("Sélectionnez une cible", id="summary-title")
|
|
yield Button("Mises à jour : -", id="btn-apt", classes="summary-row", variant="default")
|
|
yield Button("CVE : -", id="btn-cve", classes="summary-row", variant="default")
|
|
yield Static("", id="summary-error", classes="summary-row summary-error")
|
|
yield Button("📦 Mettre à jour", id="btn-upgrade", variant="primary")
|
|
|
|
def watch_cache_time(self, value: str):
|
|
self.query_one("#summary-cache", Static).update(f"Cache : {value}" if value else "")
|
|
|
|
def watch_apt_count(self, value: int):
|
|
self._update_display()
|
|
|
|
def watch_cve_count(self, value: int):
|
|
self._update_display()
|
|
|
|
def watch_error_msg(self, value: str):
|
|
self._update_display()
|
|
|
|
def watch_is_skipped(self, value: bool):
|
|
self._update_display()
|
|
|
|
def watch_target_name(self, value: str):
|
|
self.query_one("#summary-title", Static).update(value if value else "Sélectionnez une cible")
|
|
|
|
def _update_display(self):
|
|
apt_btn = self.query_one("#btn-apt", Button)
|
|
cve_btn = self.query_one("#btn-cve", Button)
|
|
err_label = self.query_one("#summary-error", Static)
|
|
btn = self.query_one("#btn-upgrade", Button)
|
|
|
|
if self.is_skipped:
|
|
apt_btn.label = "Mises à jour : LXC éteint"
|
|
cve_btn.label = "CVE : LXC éteint"
|
|
err_label.update("")
|
|
btn.disabled = True
|
|
apt_btn.disabled = True
|
|
cve_btn.disabled = True
|
|
return
|
|
|
|
if self.error_msg:
|
|
apt_btn.label = f"Mises à jour : {self.apt_count}"
|
|
cve_btn.label = "CVE : ERREUR"
|
|
err_label.update(self.error_msg)
|
|
btn.disabled = False
|
|
apt_btn.disabled = self.apt_count == 0
|
|
cve_btn.disabled = True
|
|
return
|
|
|
|
apt_btn.label = f"Mises à jour : {self.apt_count}"
|
|
cve_btn.label = f"CVE : {self.cve_count}"
|
|
err_label.update("")
|
|
btn.disabled = False
|
|
apt_btn.disabled = self.apt_count == 0
|
|
cve_btn.disabled = self.cve_count == 0
|
|
|
|
def set_target(self, target_id: str, name: str, apt_count: int, cve_count: int, error: str, skipped: bool, cache_time: str):
|
|
self.target_id = target_id
|
|
self.target_name = name
|
|
self.apt_count = apt_count
|
|
self.cve_count = cve_count
|
|
self.error_msg = error
|
|
self.is_skipped = skipped
|
|
self.cache_time = cache_time
|
|
|
|
def on_button_pressed(self, event: Button.Pressed):
|
|
if event.button.id == "btn-reload":
|
|
self.post_message(self.ReloadPressed())
|
|
elif event.button.id == "btn-upgrade":
|
|
self.post_message(self.UpgradePressed(self.target_id, self.target_name))
|
|
elif event.button.id == "btn-apt":
|
|
self.post_message(self.AptClicked(self.target_id))
|
|
elif event.button.id == "btn-cve":
|
|
self.post_message(self.CveClicked(self.target_id))
|