diff options
Diffstat (limited to 'raveos-center/raveos_center/oldalak/frissitesek.py')
| -rw-r--r-- | raveos-center/raveos_center/oldalak/frissitesek.py | 331 |
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 |