summaryrefslogtreecommitdiff
path: root/raveos-center/raveos_center/karbantartas.py
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-center/raveos_center/karbantartas.py')
-rw-r--r--raveos-center/raveos_center/karbantartas.py141
1 files changed, 141 insertions, 0 deletions
diff --git a/raveos-center/raveos_center/karbantartas.py b/raveos-center/raveos_center/karbantartas.py
new file mode 100644
index 0000000..2f929c0
--- /dev/null
+++ b/raveos-center/raveos_center/karbantartas.py
@@ -0,0 +1,141 @@
+import os
+import re
+from pathlib import Path
+import shutil
+import subprocess
+
+from raveos_center.muveletek import Lepes, root
+
+CACHE = Path("/var/cache/pacman/pkg")
+
+
+def _ki(parancs, bemenet=None, ido=60):
+ try:
+ kimenet = subprocess.run(
+ parancs, input=bemenet, capture_output=True, text=True, timeout=ido, env=dict(os.environ, LC_ALL="C")
+ )
+ except (OSError, subprocess.TimeoutExpired):
+ return ""
+ return kimenet.stdout + kimenet.stderr
+
+
+def _paccache(*kapcsolok):
+ kimenet = _ki(["paccache", "-dv", *kapcsolok])
+ return {s.strip() for s in kimenet.splitlines() if re.search(r"\.pkg\.tar(\.\w+)?$", s.strip())}
+
+
+def _meret(bajt):
+ for egyseg in ("B", "KiB", "MiB", "GiB"):
+ if bajt < 1024 or egyseg == "GiB":
+ return f"{bajt:.0f} {egyseg}" if egyseg == "B" else f"{bajt:.1f} {egyseg}"
+ bajt /= 1024
+ return ""
+
+
+def cache_elonezet():
+ if not shutil.which("paccache"):
+ return {"elerheto": False, "osszegzes": "A paccache nincs telepítve (pacman-contrib).", "elemek": []}
+ elemek = sorted(_paccache("-k2") | _paccache("-uk0"))
+ osszes = 0
+ for nev in elemek:
+ for fajl in (CACHE / nev, CACHE / f"{nev}.sig"):
+ try:
+ osszes += fajl.stat().st_size
+ except OSError:
+ pass
+ return {
+ "elerheto": True,
+ "osszegzes": f"{len(elemek)} csomagfájl, {_meret(osszes)}" if elemek else "Nincs törölhető csomagfájl.",
+ "elemek": elemek,
+ }
+
+
+def arva_elonezet():
+ kimenet = _ki(["pacman", "-Qdtq"])
+ elemek = [s.strip() for s in kimenet.splitlines() if re.fullmatch(r"[a-z0-9@_+][a-z0-9@._+-]*", s.strip())]
+ return {
+ "elerheto": True,
+ "osszegzes": f"{len(elemek)} árva csomag" if elemek else "Nincs árva csomag.",
+ "elemek": elemek,
+ }
+
+
+def naplo_elonezet():
+ meret = re.search(r"take up ([0-9.]+)\s*([KMGT]?)", _ki(["journalctl", "--disk-usage"]))
+ return {
+ "elerheto": True,
+ "osszegzes": f"Jelenleg {meret.group(1)} {meret.group(2)}B" if meret else "A napló mérete nem olvasható.",
+ "elemek": [],
+ }
+
+
+def _flatpak_nem_hasznalt(telepites):
+ kimenet = _ki(["flatpak", "uninstall", f"--{telepites}", "--unused"], bemenet="n\n")
+ return [re.sub(r"\s+", " ", s.strip()) for s in kimenet.splitlines() if re.match(r"\s*[0-9]+\.\s", s)]
+
+
+def flatpak_elonezet():
+ if not shutil.which("flatpak"):
+ return {"elerheto": False, "osszegzes": "A Flatpak nincs telepítve.", "elemek": [], "telepitesek": []}
+ telepitesek = []
+ elemek = []
+ for telepites in ("user", "system"):
+ lista = _flatpak_nem_hasznalt(telepites)
+ if lista:
+ telepitesek.append(telepites)
+ elemek += [f"{telepites}: {e}" for e in lista]
+ return {
+ "elerheto": True,
+ "osszegzes": f"{len(elemek)} nem használt runtime" if elemek else "Nincs nem használt runtime.",
+ "elemek": elemek,
+ "telepitesek": telepitesek,
+ }
+
+
+def tukor_allapot():
+ try:
+ with open("/etc/pacman.d/mirrorlist", encoding="utf-8") as f:
+ szerverek = sum(1 for s in f if s.startswith("Server"))
+ except OSError:
+ szerverek = 0
+ return {"elerheto": True, "osszegzes": f"{szerverek} aktív tükör", "elemek": []}
+
+
+def kulcs_allapot():
+ gpg = [str(p) for p in Path("/usr/share/pacman/keyrings").glob("*.gpg")]
+ kulcsok = sorted(set(_ki(["pacman", "-Qqo", *gpg]).split())) if gpg else []
+ return {"elerheto": True, "osszegzes": ", ".join(kulcsok) or "Nincs kulcscsomag.", "elemek": []}
+
+
+ELONEZETEK = {
+ "cache": cache_elonezet,
+ "arva": arva_elonezet,
+ "naplo": naplo_elonezet,
+ "tukrok": tukor_allapot,
+ "kulcsok": kulcs_allapot,
+ "flatpak": flatpak_elonezet,
+}
+
+
+def lepesek(azon, adat, kivalasztott=None):
+ if azon == "cache":
+ return [Lepes("Csomag cache ürítése", root("karbantartas", "cache"))]
+ if azon == "arva":
+ csomagok = kivalasztott if kivalasztott is not None else adat["elemek"]
+ return [Lepes("Árva csomagok eltávolítása", root("arva", *csomagok))] if csomagok else []
+ if azon == "naplo":
+ return [Lepes("Naplók takarítása", root("karbantartas", "naplo"))]
+ if azon == "tukrok":
+ return [Lepes("Tükrök frissítése", root("karbantartas", "tukrok"))]
+ if azon == "kulcsok":
+ return [Lepes("Kulcsok frissítése", root("karbantartas", "kulcsok"))]
+ if azon == "flatpak":
+ lista = []
+ if "user" in adat.get("telepitesek", []):
+ lista.append(
+ Lepes("Flatpak (felhasználói)", ["flatpak", "uninstall", "--user", "--unused", "-y", "--noninteractive"], False)
+ )
+ if "system" in adat.get("telepitesek", []):
+ lista.append(Lepes("Flatpak (rendszer)", root("karbantartas", "flatpak"), False))
+ return lista
+ return []