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 []