From a64ef966534f8dba6af889ba4bfce15691bfc85b Mon Sep 17 00:00:00 2001 From: Nippy Date: Sun, 1 Nov 2026 18:13:54 +0100 Subject: új telepítő MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- raveos-center/raveos_center/driverek.py | 179 ++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 raveos-center/raveos_center/driverek.py (limited to 'raveos-center/raveos_center/driverek.py') diff --git a/raveos-center/raveos_center/driverek.py b/raveos-center/raveos_center/driverek.py new file mode 100644 index 0000000..6ef7842 --- /dev/null +++ b/raveos-center/raveos_center/driverek.py @@ -0,0 +1,179 @@ +import re +import subprocess +from pathlib import Path + +SZKRIPT_HELYEK = [ + Path("/usr/lib/raveos-center/raveos-gpu-drivers"), + Path(__file__).resolve().parent.parent / "driverek" / "raveos-gpu-drivers", +] + +KATEGORIAK = [ + ("gpu", "Videokártya"), + ("wifi", "Wi-Fi"), + ("halozat", "Vezetékes hálózat"), + ("hang", "Hang"), + ("bemenet", "Kontrollerek"), +] + +OSZTALYOK = { + "0300": "gpu", + "0302": "gpu", + "0380": "gpu", + "0280": "wifi", + "0200": "halozat", + "0401": "hang", + "0403": "hang", +} + +KONTROLLEREK = { + "045e": "Microsoft (Xbox)", + "054c": "Sony (PlayStation)", + "057e": "Nintendo", + "28de": "Valve (Steam)", + "2dc8": "8BitDo", + "0e6f": "PDP", + "24c6": "PowerA", + "046d": "Logitech", +} + +XBOX_ADAPTEREK = {"02e6", "02fe", "091e"} + + +def _ki(parancs, ido=30): + try: + return subprocess.run(parancs, capture_output=True, text=True, timeout=ido).stdout + except (OSError, subprocess.TimeoutExpired): + return "" + + +def szkript(): + for hely in SZKRIPT_HELYEK: + if hely.is_file(): + return hely + return None + + +def _telepitett(): + return set(_ki(["pacman", "-Qq"]).split()) + + +def _gpu_terv(): + hely = szkript() + if not hely: + return {} + terv = {} + for sor in _ki(["bash", str(hely), "--terv"]).splitlines(): + if "=" in sor: + k, _, v = sor.partition("=") + terv[k] = v + return terv + + +def _azonosito(szoveg): + talalat = re.search(r"\[([0-9a-f]{4})\]$", szoveg.strip()) + return talalat.group(1) if talalat else "" + + +def _nev(szoveg): + return re.sub(r"\s*\[[0-9a-f]{4}\]$", "", szoveg.strip()) + + +def _pci_eszkozok(): + blokkok = _ki(["lspci", "-vmmnnk"]).strip().split("\n\n") + eszkozok = [] + for blokk in blokkok: + mezok = {} + for sor in blokk.splitlines(): + if ":\t" in sor: + k, _, v = sor.partition(":\t") + mezok.setdefault(k, v) + osztaly = _azonosito(mezok.get("Class", "")) + kategoria = OSZTALYOK.get(osztaly) + if not kategoria: + continue + gyarto = _nev(mezok.get("Vendor", "")) + eszkoz = _nev(mezok.get("Device", "")) + rovid = re.search(r"\[([^\]]+)\]", eszkoz) + eszkozok.append( + { + "kategoria": kategoria, + "nev": f"{gyarto.replace(' Corporation', '').replace(', Inc.', '')} {rovid.group(1) if rovid else eszkoz}".strip(), + "gyarto_id": _azonosito(mezok.get("Vendor", "")), + "jelenlegi": mezok.get("Driver", ""), + } + ) + return eszkozok + + +def _usb_kontrollerek(): + lista = [] + for sor in _ki(["lsusb"]).splitlines(): + talalat = re.search(r"ID ([0-9a-f]{4}):([0-9a-f]{4})\s*(.*)", sor) + if not talalat: + continue + gyarto, termek, nev = talalat.groups() + if gyarto not in KONTROLLEREK: + continue + if not re.search(r"(?i)controller|gamepad|joystick|wireless adapter|xbox|dualsense|dualshock|pro controller|8bitdo", nev): + continue + lista.append({"gyarto": gyarto, "termek": termek, "nev": nev or KONTROLLEREK[gyarto]}) + return lista + + +def allapot(): + telepitett = _telepitett() + terv = _gpu_terv() + kozos = terv.get("kozos", "").split() + gyartoi = { + "8086": terv.get("intel_csomagok", "").split(), + "1002": terv.get("amd_csomagok", "").split(), + "10de": terv.get("nvidia_csomagok", "").split(), + } + lista = [] + for e in _pci_eszkozok(): + elem = dict(e, ajanlott=[], megjegyzes="", gpu=False) + if e["kategoria"] == "gpu": + elem["gpu"] = True + elem["ajanlott"] = kozos + gyartoi.get(e["gyarto_id"], []) + if terv.get("virtualis") == "1" and e["gyarto_id"] in ("1af4", "1234", "15ad", "1b36", "80ee"): + elem["megjegyzes"] = "Virtuális gépben fut, a 3D gyorsítást a gazdagép adja." + elif e["gyarto_id"] == "10de": + csalad = terv.get("nvidia_csalad", "") + elem["megjegyzes"] = { + "open": "NVIDIA, Turing vagy újabb: nyílt forrású NVIDIA kernelmodul.", + "580xx": "NVIDIA, Maxwell, Pascal vagy Volta: 580-as hosszú támogatású driver.", + "470xx": "NVIDIA, Kepler: 470-es örökölt driver, már nem kap frissítést.", + "nem_tamogatott": "Ehhez a régi NVIDIA kártyához nincs zárt driver, a nyílt nouveau marad.", + }.get(csalad, "") + elif e["kategoria"] == "wifi" and e["gyarto_id"] == "14e4" and not e["jelenlegi"]: + elem["ajanlott"] = ["broadcom-wl-dkms"] + (terv.get("fejlecek", "").split() or ["linux-cachyos-headers"]) + elem["megjegyzes"] = "Broadcom Wi-Fi: a zárt wl driver szükséges hozzá." + elif e["kategoria"] == "hang" and "sof" in e["jelenlegi"]: + elem["ajanlott"] = ["sof-firmware"] + elem["megjegyzes"] = "Intel Sound Open Firmware hangkártya." + elif not e["jelenlegi"]: + elem["ajanlott"] = ["linux-firmware"] + elem["megjegyzes"] = "Nincs betöltött driver, a firmware-csomag hiányozhat." + elem["hianyzik"] = [p for p in elem["ajanlott"] if p not in telepitett] + lista.append(elem) + for k in _usb_kontrollerek(): + elem = { + "kategoria": "bemenet", + "nev": k["nev"], + "jelenlegi": "kernel (beépített)", + "ajanlott": [], + "megjegyzes": "", + "gpu": False, + } + if k["gyarto"] == "045e" and k["termek"] in XBOX_ADAPTEREK: + elem["ajanlott"] = ["xone-dkms"] + (terv.get("fejlecek", "").split() or ["linux-cachyos-headers"]) + elem["jelenlegi"] = "" + elem["megjegyzes"] = "Xbox vezeték nélküli adapter: az xone driver kell hozzá." + elem["hianyzik"] = [p for p in elem["ajanlott"] if p not in telepitett] + lista.append(elem) + return lista + + +def ujrainditas_kell(elem): + return elem["gpu"] and any(p.startswith(("nvidia", "lib32-nvidia")) for p in elem["hianyzik"]) + -- cgit v1.3