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)