diff options
Diffstat (limited to 'raveos-center/raveos_center/karbantartas.py')
| -rw-r--r-- | raveos-center/raveos_center/karbantartas.py | 141 |
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 [] |