summaryrefslogtreecommitdiff
path: root/raveos-center/raveos_center/oldalak/frissitesek.py
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-center/raveos_center/oldalak/frissitesek.py')
-rw-r--r--raveos-center/raveos_center/oldalak/frissitesek.py331
1 files changed, 331 insertions, 0 deletions
diff --git a/raveos-center/raveos_center/oldalak/frissitesek.py b/raveos-center/raveos_center/oldalak/frissitesek.py
new file mode 100644
index 0000000..baa1ccc
--- /dev/null
+++ b/raveos-center/raveos_center/oldalak/frissitesek.py
@@ -0,0 +1,331 @@
+from datetime import datetime
+
+from PyQt6.QtCore import Qt
+from PyQt6.QtWidgets import (
+ QAbstractItemView,
+ QCheckBox,
+ QHBoxLayout,
+ QHeaderView,
+ QPlainTextEdit,
+ QTableWidget,
+ QTableWidgetItem,
+ QVBoxLayout,
+ QWidget,
+)
+
+from raveos_center import muveletek, rendszerinfo, snapshotok
+from raveos_center.elemek import Kartya, Oldal, Racs, cimke, gomb
+from raveos_center.hatter import ervenytelenit, hatterben
+
+AZON = "frissitesek"
+MENU = "Frissítések"
+IKON = "frissitesek"
+
+FORRAS = {"pacman": "pacman", "aur": "AUR", "flatpak": "Flatpak"}
+
+
+def mb(meret):
+ if meret is None:
+ return "-"
+ return f"{meret / 1e6:.1f} MB"
+
+
+class Frissitesek(Oldal):
+ def __init__(self, kozpont):
+ super().__init__(kozpont, "UTOLSÓ ELLENŐRZÉS: -", "Frissítések", kitolt=True)
+ self.csomagok = []
+ self.ujrainditas_kell = False
+ self.futtato = muveletek.Futtato(self)
+ self.futtato.sor.connect(self._naplo)
+ self.futtato.kesz.connect(self._futas_kesz)
+
+ self.torzs.setSpacing(20)
+ self.ellenorzes = self.fejlec_gomb(gomb("Ellenőrzés"))
+ self.ellenorzes.clicked.connect(lambda: self._ellenoriz(True))
+ self.inditas = self.fejlec_gomb(gomb("Nincs kijelölve", fo=True))
+ self.inditas.clicked.connect(self._indit)
+
+ osszegzes = Racs(220)
+ k = Kartya("Kijelölve")
+ self.kijelolt = cimke("0 / 0 CSOMAG", "nagyszam")
+ k.elrendezes.addWidget(self.kijelolt)
+ osszegzes.hozzaad(k)
+ k = Kartya("Letöltés")
+ self.letoltes = cimke("0 MB", "nagyszam")
+ k.elrendezes.addWidget(self.letoltes)
+ osszegzes.hozzaad(k)
+ k = Kartya("Biztonság")
+ self.snapshot = QCheckBox("Snapshot készítése frissítés előtt")
+ self.snapshot.setChecked(True)
+ k.elrendezes.addWidget(self.snapshot)
+ self.snapshot_megj = cimke("", "halvany", True)
+ k.elrendezes.addWidget(self.snapshot_megj)
+ osszegzes.hozzaad(k)
+ self.torzs.addWidget(osszegzes)
+
+ self.figyelem = cimke("", "figyelem", True)
+ self.figyelem.hide()
+ self.torzs.addWidget(self.figyelem)
+ self.ujraindito_sav = QWidget()
+ us = QHBoxLayout(self.ujraindito_sav)
+ us.setContentsMargins(0, 0, 0, 0)
+ us.setSpacing(12)
+ us.addWidget(
+ cimke("A frissítés után újraindítás szükséges, hogy az új kernel vagy driver betöltődjön.", "figyelem", True),
+ 1,
+ )
+ ujraindit = gomb("Újraindítás most", fo=True)
+ ujraindit.clicked.connect(self._ujraindit)
+ us.addWidget(ujraindit)
+ self.ujraindito_sav.hide()
+ self.torzs.addWidget(self.ujraindito_sav)
+
+ csomag_resz = QVBoxLayout()
+ csomag_resz.setSpacing(12)
+ fej = QHBoxLayout()
+ fej.addWidget(cimke("CSOMAGOK", "h2"))
+ fej.addStretch(1)
+ self.mind = gomb("Mind kijelölése", kicsi=True)
+ self.mind.clicked.connect(self._mind)
+ fej.addWidget(self.mind)
+ csomag_resz.addLayout(fej)
+ csomag_resz.addWidget(
+ cimke(
+ "A hivatalos csomagok (pacman) csak együtt frissíthetők: Arch-alapú rendszeren a részleges frissítés "
+ "elronthatja a rendszert. Az AUR és a Flatpak csomagok egyenként is kijelölhetők.",
+ "halvany",
+ True,
+ )
+ )
+ self.tabla = QTableWidget(0, 6)
+ self.tabla.setHorizontalHeaderLabels(["", "Csomag", "Forrás", "Jelenlegi", "Új", "Méret"])
+ self.tabla.verticalHeader().hide()
+ self.tabla.setShowGrid(False)
+ self.tabla.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection)
+ self.tabla.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
+ self.tabla.setFocusPolicy(Qt.FocusPolicy.NoFocus)
+ fejlec = self.tabla.horizontalHeader()
+ fejlec.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
+ fejlec.setSectionResizeMode(1, QHeaderView.ResizeMode.Stretch)
+ fejlec.setDefaultAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter)
+ self.tabla.setMinimumHeight(120)
+ self.tabla.itemChanged.connect(self._valtozott)
+ csomag_resz.addWidget(self.tabla, 1)
+ self.ures = cimke("", "masodlagos", True)
+ self.ures.hide()
+ csomag_resz.addWidget(self.ures)
+ self.torzs.addLayout(csomag_resz, 3)
+
+ naplo_resz = QVBoxLayout()
+ naplo_resz.setSpacing(12)
+ naplo_resz.addWidget(cimke("NAPLÓ", "h2"))
+ self.naplo = QPlainTextEdit()
+ self.naplo.setObjectName("naplo")
+ self.naplo.setReadOnly(True)
+ self.naplo.setMaximumBlockCount(5000)
+ self.naplo.setMinimumHeight(90)
+ naplo_resz.addWidget(self.naplo, 1)
+ self.torzs.addLayout(naplo_resz, 2)
+
+ def indulaskor(self):
+ self._ellenoriz(False)
+
+ def megjelenik(self, *_):
+ snapper = rendszerinfo.snapper_elerheto()
+ automatikus = snapper and snapshotok.snap_pac()
+ self.snapshot.setVisible(not automatikus)
+ self.snapshot.setEnabled(snapper and not automatikus and not self.futtato.fut())
+ if automatikus:
+ self.snapshot.setChecked(False)
+ self.snapshot_megj.setText(
+ "Minden csomagművelet előtt automatikusan snapshot készül, ha gond van, a Rendszer > Snapshotok "
+ "fülön vissza tudsz állni."
+ )
+ elif not snapper:
+ self.snapshot.setChecked(False)
+ self.snapshot_megj.setText("Snapshot csak btrfs fájlrendszeren, beállított snapperrel készíthető.")
+ else:
+ self.snapshot_megj.setText("Ha a frissítés után gond van, erre vissza tudsz állni.")
+ if not muveletek.helper_elerheto():
+ self.figyelem.setText(
+ "A RaveOS Center rendszerhelpere nincs telepítve, ezért a rendszercsomagok frissítése nem indítható."
+ )
+ self.figyelem.show()
+ if not self.futtato.fut() and not self.csomagok:
+ self._ellenoriz(False)
+
+ def _naplo(self, szoveg):
+ self.naplo.appendPlainText(szoveg)
+
+ def _ellenoriz(self, friss):
+ if self.futtato.fut():
+ return
+ self.ellenorzes.setEnabled(False)
+ self.ellenorzes.setText("Ellenőrzés...")
+ self._naplo(":: Frissítések ellenőrzése (pacman, AUR, Flatpak)...")
+ hatterben(rendszerinfo.frissitesek, friss, kesz=self._ellenorzes_kesz, hiba=self._ellenorzes_hiba)
+
+ def _ellenorzes_vege(self):
+ self.ellenorzes.setEnabled(True)
+ self.ellenorzes.setText("Ellenőrzés")
+ mikor = rendszerinfo.frissites_ellenorizve()
+ if mikor:
+ self.eyebrow.setText(f"UTOLSÓ ELLENŐRZÉS: {datetime.fromtimestamp(mikor):%H:%M}")
+
+ def _ellenorzes_kesz(self, csomagok):
+ ervenytelenit("frissitesek")
+ self._ellenorzes_vege()
+ self.csomagok = csomagok
+ szamok = {f: sum(1 for c in csomagok if c["forras"] == f) for f in FORRAS}
+ self._naplo(
+ f":: {len(csomagok)} frissítés: {szamok['pacman']} pacman, {szamok['aur']} AUR, {szamok['flatpak']} Flatpak"
+ )
+ self.kozpont.jelveny(AZON, len(csomagok))
+ self._tablat_tolt()
+
+ def _ellenorzes_hiba(self, uzenet):
+ self._ellenorzes_vege()
+ self._naplo(f"[HIBA] {uzenet}")
+ self.figyelem.setText(f"Az ellenőrzés nem sikerült: {uzenet}")
+ self.figyelem.show()
+
+ def _tablat_tolt(self):
+ self.tabla.blockSignals(True)
+ self.tabla.setRowCount(0)
+ for c in self.csomagok:
+ sor = self.tabla.rowCount()
+ self.tabla.insertRow(sor)
+ jelolo = QTableWidgetItem()
+ jelolo.setFlags(Qt.ItemFlag.ItemIsUserCheckable | Qt.ItemFlag.ItemIsEnabled)
+ jelolo.setCheckState(Qt.CheckState.Checked)
+ self.tabla.setItem(sor, 0, jelolo)
+ nev = cimke(
+ c["nev"]
+ + (
+ ' <span style="color:#d9a441; font-family:\'Noto Sans Mono\'; font-size:11px">ÚJRAINDÍTÁS</span>'
+ if c["ujrainditas"]
+ else ""
+ )
+ )
+ nev.setContentsMargins(8, 0, 8, 0)
+ self.tabla.setCellWidget(sor, 1, nev)
+ for oszlop, ertek in ((2, FORRAS[c["forras"]]), (3, c["regi"] or "-"), (4, c["uj"]), (5, mb(c["meret"]))):
+ elem = QTableWidgetItem(ertek)
+ elem.setFlags(Qt.ItemFlag.ItemIsEnabled)
+ self.tabla.setItem(sor, oszlop, elem)
+ self.tabla.blockSignals(False)
+ ures = not self.csomagok
+ self.tabla.setVisible(not ures)
+ self.ures.setVisible(ures)
+ self.ures.setText("A rendszer naprakész, nincs elérhető frissítés.")
+ self._osszegez()
+
+ def _kijelolt(self):
+ return [
+ c
+ for i, c in enumerate(self.csomagok)
+ if self.tabla.item(i, 0) and self.tabla.item(i, 0).checkState() == Qt.CheckState.Checked
+ ]
+
+ def _valtozott(self, elem):
+ if elem.column() != 0:
+ return
+ if self.csomagok[elem.row()]["forras"] == "pacman":
+ self.tabla.blockSignals(True)
+ for i, c in enumerate(self.csomagok):
+ if c["forras"] == "pacman":
+ self.tabla.item(i, 0).setCheckState(elem.checkState())
+ self.tabla.blockSignals(False)
+ self._osszegez()
+
+ def _osszegez(self):
+ kijelolt = self._kijelolt()
+ self.kijelolt.setText(f"{len(kijelolt)} / {len(self.csomagok)} CSOMAG")
+ meret = sum(c["meret"] or 0 for c in kijelolt)
+ self.letoltes.setText(f"{meret / 1e6:.0f} MB")
+ mind = bool(self.csomagok) and len(kijelolt) == len(self.csomagok)
+ self.mind.setText("Kijelölés törlése" if mind else "Mind kijelölése")
+ self.mind.setEnabled(bool(self.csomagok) and not self.futtato.fut())
+ tiltott = any(c["forras"] == "pacman" for c in kijelolt) and not muveletek.helper_elerheto()
+ self.inditas.setEnabled(bool(kijelolt) and not self.futtato.fut() and not tiltott)
+ self.inditas.setText(f"Frissítés indítása ({len(kijelolt)})" if kijelolt else "Nincs kijelölve")
+
+ def _mind(self):
+ mind = len(self._kijelolt()) == len(self.csomagok)
+ allapot = Qt.CheckState.Unchecked if mind else Qt.CheckState.Checked
+ self.tabla.blockSignals(True)
+ for i in range(self.tabla.rowCount()):
+ self.tabla.item(i, 0).setCheckState(allapot)
+ self.tabla.blockSignals(False)
+ self._osszegez()
+
+ def _indit(self):
+ kijelolt = self._kijelolt()
+ if not kijelolt:
+ return
+ lepesek = []
+ pacman = [c for c in kijelolt if c["forras"] == "pacman"]
+ aur = [c["nev"] for c in kijelolt if c["forras"] == "aur"]
+ flatpak = [c["nev"] for c in kijelolt if c["forras"] == "flatpak"]
+ if self.snapshot.isChecked() and self.snapshot.isEnabled():
+ lepesek.append(
+ muveletek.Lepes("Snapshot készítése", muveletek.root("snapshot", "Frissítés előtt (RaveOS Center)"))
+ )
+ if pacman:
+ lepesek.append(muveletek.Lepes("Rendszercsomagok frissítése (pacman)", muveletek.root("frissites")))
+ if aur:
+ lepesek.append(
+ muveletek.Lepes(
+ "AUR csomagok frissítése",
+ [
+ "yay", "-S", "--noconfirm", "--color", "never", "--sudo", "pkexec",
+ "--answerclean", "None", "--answerdiff", "None", "--answeredit", "None",
+ *aur,
+ ],
+ kotelezo=False,
+ )
+ )
+ if flatpak:
+ lepesek.append(
+ muveletek.Lepes(
+ "Flatpak alkalmazások frissítése",
+ ["flatpak", "update", "-y", "--noninteractive", *flatpak],
+ kotelezo=False,
+ )
+ )
+ self.ujrainditas_kell = any(c["ujrainditas"] for c in pacman)
+ self.figyelem.hide()
+ self.ujraindito_sav.hide()
+ self._zarol(True)
+ self._naplo("")
+ self._naplo(f":: Frissítés indul, {len(kijelolt)} csomag")
+ self.futtato.indit(lepesek)
+
+ def _zarol(self, fut):
+ for w in (self.ellenorzes, self.inditas, self.mind, self.tabla):
+ w.setEnabled(not fut)
+ self.snapshot.setEnabled(not fut and rendszerinfo.snapper_elerheto() and not snapshotok.snap_pac())
+ if fut:
+ self.inditas.setText("Frissítés folyamatban...")
+
+ def _futas_kesz(self, rendben, hibasak):
+ ervenytelenit()
+ self._zarol(False)
+ if rendben:
+ self._naplo(":: A frissítés sikeresen befejeződött.")
+ if self.ujrainditas_kell:
+ self.ujraindito_sav.show()
+ else:
+ self._naplo(f":: A frissítés hibával ért véget: {', '.join(hibasak)}")
+ self.figyelem.setText(
+ "A frissítés nem sikerült teljesen. A részleteket a lenti napló mutatja. "
+ "Ha nem érted, mi történt, küldj hibajegyet a Visszajelzés oldalon."
+ )
+ self.figyelem.show()
+ self._ellenoriz(True)
+
+ def _ujraindit(self):
+ muveletek.Futtato(self).indit([muveletek.Lepes("Újraindítás", ["systemctl", "reboot"])])
+
+
+OLDAL = Frissitesek