diff options
Diffstat (limited to 'raveos-center/raveos_center/muveletek.py')
| -rw-r--r-- | raveos-center/raveos_center/muveletek.py | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/raveos-center/raveos_center/muveletek.py b/raveos-center/raveos_center/muveletek.py new file mode 100644 index 0000000..3243814 --- /dev/null +++ b/raveos-center/raveos_center/muveletek.py @@ -0,0 +1,107 @@ +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() |