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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
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)
|