import os import shutil from PyQt6.QtCore import QObject, QProcess, QProcessEnvironment, pyqtSignal HELPER = os.environ.get("RAVEOS_CENTER_HELPER", "/usr/lib/raveos-center/raveos-center-helper") def helper_elerheto(): return os.access(HELPER, os.X_OK) and shutil.which("pkexec") is not None def root(*args): return ["pkexec", HELPER, *args] class Lepes: def __init__(self, cimke, parancs, kotelezo=True): self.cimke = cimke self.parancs = parancs self.kotelezo = kotelezo class Futtato(QObject): sor = pyqtSignal(str) lepes_indul = pyqtSignal(str) kesz = pyqtSignal(bool, list) def __init__(self, szulo=None): super().__init__(szulo) self.lepesek = [] self.hibasak = [] self.folyamat = None self.utolso_kod = None self._maradek = b"" def fut(self): return self.folyamat is not None def indit(self, lepesek): if self.fut(): return self.lepesek = list(lepesek) self.hibasak = [] self._kovetkezo() def _kovetkezo(self): if not self.lepesek: self.folyamat = None self.kesz.emit(not self.hibasak, self.hibasak) return lepes = self.lepesek.pop(0) self.aktualis = lepes self.lepes_indul.emit(lepes.cimke) self.sor.emit(f":: {lepes.cimke}") folyamat = QProcess(self) folyamat.setProcessChannelMode(QProcess.ProcessChannelMode.MergedChannels) kornyezet = QProcessEnvironment.systemEnvironment() kornyezet.insert("LC_ALL", "C.UTF-8") folyamat.setProcessEnvironment(kornyezet) folyamat.readyReadStandardOutput.connect(self._olvas) folyamat.finished.connect(self._vege) folyamat.errorOccurred.connect(self._inditasi_hiba) self._maradek = b"" self.folyamat = folyamat folyamat.start(lepes.parancs[0], lepes.parancs[1:]) def _olvas(self): if self.folyamat is None: return adat = self._maradek + bytes(self.folyamat.readAllStandardOutput()) *sorok, self._maradek = adat.replace(b"\r", b"\n").split(b"\n") for s in sorok: szoveg = s.decode("utf-8", errors="replace").rstrip() if szoveg: self.sor.emit(szoveg) def _inditasi_hiba(self, hiba): if hiba == QProcess.ProcessError.FailedToStart: self.sor.emit(f"[HIBA] nem indítható: {self.aktualis.parancs[0]}") self._lezar(False) def _vege(self, kod, allapot): self._olvas() if self._maradek: self.sor.emit(self._maradek.decode("utf-8", errors="replace").rstrip()) self._maradek = b"" rendben = allapot == QProcess.ExitStatus.NormalExit and kod == 0 if not rendben and kod in (126, 127) and self.aktualis.parancs[0] == "pkexec": self.sor.emit("[MEGSZAKÍTVA] a hitelesítés elmaradt") self._lezar(rendben, kod) def _lezar(self, rendben, kod=None): if self.folyamat is None: return self.utolso_kod = kod self.folyamat.deleteLater() self.folyamat = None if rendben: self.sor.emit(f"[OK] {self.aktualis.cimke}") else: self.sor.emit(f"[HIBA{f' {kod}' if kod is not None else ''}] {self.aktualis.cimke}") self.hibasak.append(self.aktualis.cimke) if self.aktualis.kotelezo: self.lepesek = [] self.folyamat = None self._kovetkezo()