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"] + ( ' ÚJRAINDÍTÁS' 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