summaryrefslogtreecommitdiff
path: root/raveos-center/raveos_center/muveletek.py
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-center/raveos_center/muveletek.py')
-rw-r--r--raveos-center/raveos_center/muveletek.py107
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()