summaryrefslogtreecommitdiff
path: root/raveos-center/raveos_center/katalogus.py
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-center/raveos_center/katalogus.py')
-rw-r--r--raveos-center/raveos_center/katalogus.py192
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)