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"])