summaryrefslogtreecommitdiff
path: root/raveos-center/raveos_center/karbantartas.py
blob: 2f929c01fe3fbf402c0f6a79ce32d24706441a2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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 []