diff options
Diffstat (limited to 'raveos-center/raveos_center/katalogus.py')
| -rw-r--r-- | raveos-center/raveos_center/katalogus.py | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/raveos-center/raveos_center/katalogus.py b/raveos-center/raveos_center/katalogus.py new file mode 100644 index 0000000..118d948 --- /dev/null +++ b/raveos-center/raveos_center/katalogus.py @@ -0,0 +1,192 @@ +import json +import locale +import os +import shlex +import subprocess +from pathlib import Path + +from raveos_center.muveletek import Lepes, root + +ADAT_HELYEK = [Path("/usr/lib/raveos-center/adat"), Path(__file__).resolve().parent.parent / "adat"] + +KATEGORIAK = [ + ("all", "Mind"), + ("Games", "Gaming"), + ("Media", "Média"), + ("Internet", "Internet"), + ("Office", "Iroda"), + ("Dev", "Fejlesztés"), + ("System", "Rendszer"), + ("Security", "Biztonság"), +] + +GAMING_ALAPOK = ["steam", "lutris", "heroic", "gamemode", "mangohud"] + +FLATHUB = "https://dl.flathub.org/repo/flathub.flatpakrepo" + + +def adat_mappa(): + for hely in ADAT_HELYEK: + if (hely / "katalogus" / "app-list.json").is_file(): + return hely + raise RuntimeError("Nem található az alkalmazáskatalógus (app-list.json).") + + +def nyelv(): + kod = (locale.getlocale()[0] or os.environ.get("LANG", "hu"))[:2] + return kod if kod in ("hu", "en", "de") else "hu" + + +def loc(ertek): + if isinstance(ertek, dict): + return ertek.get(nyelv()) or ertek.get("hu") or ertek.get("en") or next(iter(ertek.values()), "") + return ertek or "" + + +def betolt(): + adat = json.loads((adat_mappa() / "katalogus" / "app-list.json").read_text(encoding="utf-8")) + lista = [] + for a in adat.get("apps", []): + if not isinstance(a, dict) or "id" not in a or "name" not in a: + continue + a.setdefault("type", "pacman") + a.setdefault("category", "System") + lista.append(a) + lista.sort(key=lambda a: a["name"].lower()) + return lista + + +def _halmaz(parancs): + try: + kimenet = subprocess.run(parancs, capture_output=True, text=True, timeout=30) + except (OSError, subprocess.TimeoutExpired): + return set() + return {s.strip() for s in kimenet.stdout.splitlines() if s.strip()} + + +def telepitett_index(): + return { + "pacman": _halmaz(["pacman", "-Qq"]), + "flatpak": _halmaz(["flatpak", "list", "--app", "--columns=application"]), + } + + +def csomagok(app): + return app.get("packages") or [app["id"]] + + +def opcio_telepitve(opcio, index): + return all(p in index["pacman"] for p in (opcio.get("packages") or [opcio["id"]])) + + +def telepitve(app, index): + tipus = app["type"] + if tipus in ("pacman", "aur"): + return all(p in index["pacman"] for p in csomagok(app)) + if tipus == "flatpak-user": + return bool(app.get("flatpak_id")) and app["flatpak_id"] in index["flatpak"] + if tipus == "script": + ellenorzes = app.get("check_packages") + if ellenorzes: + return all(p in index["pacman"] for p in ellenorzes) + return False + if tipus == "choice": + return any(opcio_telepitve(o, index) for o in app.get("options", [])) + return False + + +def forras(app): + return {"flatpak-user": "flatpak", "aur": "aur", "message": "info"}.get(app["type"], "pacman") + + +def _konfig_lepesek(app): + lepesek = [] + otthon = str(Path.home()) + konfigok = adat_mappa() / "configs" + parok = [] + if app.get("config_dir") and app.get("config_dest"): + parok.append((app["config_dir"], app["config_dest"])) + for m in app.get("config_mappings", []): + if m.get("source") and m.get("dest"): + parok.append((m["source"], m["dest"])) + for forras_mappa, cel in parok: + honnan = konfigok / forras_mappa + if not honnan.is_dir(): + continue + cel = cel.replace("{HOME}", otthon) + kapcsolo = "-rf" if app.get("config_overwrite") else "-rn" + lepesek.append( + Lepes( + f"Beállítások: {app['name']}", + [ + "bash", + "-c", + f"mkdir -p {shlex.quote(cel)} && cp {kapcsolo} {shlex.quote(str(honnan))}/. {shlex.quote(cel)}/ " + f"&& rm -f {shlex.quote(cel)}/Singleton*", + ], + kotelezo=False, + ) + ) + return lepesek + + +def lepesek(app, telepites, opciok=None): + tipus = app["type"] + nev = app["name"] + lista = [] + if tipus in ("pacman", "aur") or tipus == "choice": + if tipus == "choice": + valasztott = [o for o in app.get("options", []) if o["id"] in (opciok or [])] + pkgs = [p for o in valasztott for p in (o.get("packages") or [o["id"]])] + else: + pkgs = csomagok(app) + if not pkgs: + return [] + if tipus == "aur": + parancs = ["yay", "-S" if telepites else "-Rns", "--noconfirm", "--color", "never", "--sudo", "pkexec"] + if telepites: + parancs += ["--needed", "--answerclean", "None", "--answerdiff", "None", "--answeredit", "None"] + lista.append(Lepes(f"{'Telepítés' if telepites else 'Eltávolítás'}: {nev}", parancs + pkgs)) + else: + lista.append( + Lepes(f"{'Telepítés' if telepites else 'Eltávolítás'}: {nev}", root("telepit" if telepites else "eltavolit", *pkgs)) + ) + if telepites: + for parancs in app.get("post_install", []): + reszek = shlex.split(parancs) + if reszek[:2] == ["systemctl", "enable"] and len(reszek) == 3: + lista.append(Lepes(f"Szolgáltatás bekapcsolása: {reszek[2]}", root("szolgaltatas", reszek[2]), kotelezo=False)) + else: + lista.append(Lepes(f"Utólagos lépés: {nev}", reszek, kotelezo=False)) + elif tipus == "flatpak-user": + fid = app.get("flatpak_id") + if not fid: + return [] + if telepites: + lista.append( + Lepes("Flathub tároló", ["flatpak", "remote-add", "--if-not-exists", "--user", "flathub", FLATHUB]) + ) + lista.append( + Lepes( + f"Telepítés: {nev}", + ["flatpak", "install", "--user", "--noninteractive", "--or-update", "flathub", fid], + ) + ) + for parancs in app.get("post_install", []): + lista.append(Lepes(f"Utólagos lépés: {nev}", shlex.split(parancs), kotelezo=False)) + else: + lista.append(Lepes(f"Eltávolítás: {nev}", ["flatpak", "uninstall", "--user", "-y", fid])) + elif tipus == "script": + szkript = app.get("script", "") + if not szkript: + return [] + lista.append( + Lepes(f"{'Telepítés' if telepites else 'Eltávolítás'}: {nev}", root("akcio", szkript, "install" if telepites else "remove")) + ) + if telepites and tipus != "script": + lista += _konfig_lepesek(app) + return lista + + +def eltavolithato(app): + return app["type"] != "message" and app.get("removable", True) |