Chyba Pythonu v OpenVPN 3: opravte nástroj, ne systémový Python
Výpis trasování pojmenovává interpret, který spustil frontend, ne službu, která vlastní tunel. Porovnejte obojí, než něco přesměrujete v celém systému.
Výpis trasování se objeví, když se spustí příkaz pro správu VPN, a prvním instinktem je nainstalovat jiný Python nebo nasměrovat systémový výchozí interpret jinam. Tento instinkt míchá dvě běhová prostředí, která spolu nemají nic společného. Jedno patří operačnímu systému a jeho zabaleným nástrojům; druhé patří jakémukoli projektu, který stavíte. Změna prvního, aby se uspokojilo druhé, je způsob, jak funkční počítač přijde o správce balíčků.
Srovnání, které stojí za to, je mezi komponentou, která skutečně selhala, a běhovým prostředím, které máte právo změnit. Téměř nikdy to není stejný objekt.
Dvě otázky o Pythonu, které vypadají jako jedna
První otázka zní: který interpret spustil program, který vypsal trasování? Druhá: který interpret má můj projekt používat? V terminálu vypadají stejně, protože na obě se odpovídá napsáním python3, a mají různé vlastníky, různé cesty aktualizace a různý dosah.
Systémový nástroj je vázán na interpret, se kterým byl dodán jeho distribucí, spolu s kompilovanými moduly sestavenými proti ABI tohoto interpretu. Projekt je vázán na prostředí, které pro něj vytvoříte. Přesunutí systémového výchozího nastavení mění první pro každý nástroj na stroji najednou; vytvoření prostředí mění druhé pro jeden adresář.
Jen jedna z těchto akcí je vratná během minuty. A není to ta první.
Která komponenta chybu vyvolala
Přečtěte si první řádek trasování a spustitelný soubor, který ho vyvolal, dřív než cokoli jiného. Frontend příkazové řádky, privilegovaná služba a vazby API jsou oddělené části a jen některé z nich jsou vůbec Python.
command -v openvpn3
head -n 1 "$(command -v openvpn3)"
dpkg -S "$(command -v openvpn3)" 2>/dev/null
systemctl status openvpn3-service-client --no-pager
První řádek skriptu pojmenovává interpret, který použije, a to je interpret, ze kterého trasování přišlo. Dotaz na balíček vám řekne, komu soubor patří, což rozhoduje o tom, kdo ho smí změnit. Stav služby odpovídá na úplně jinou otázku: zda běží privilegovaný backend, který skutečně navazuje relace.
Chyba importu modulu, odmítnutí aktivace přes D-Bus a odmítnutý přihlašovací údaj jsou tři různé fáze. Chyba importu nastane dřív, než existuje jakákoli relace, takže ji nespraví žádná konfigurace VPN a nespraví ji ani funkční služba. Zařazení zprávy do jedné z těchto tří fází je skutečný první krok.
Co prostředí projektu opravit může a co ne
Prostředí projektu řeší problém projektu: přesné verze knihoven, které jedna aplikace potřebuje, izolované od všeho ostatního. To je opravdu užitečné a je to správný nástroj, když je selhávající program skript, který vlastníte.
uv run --python 3.11 app.py
python3 -c 'import openvpn3; print(openvpn3.__file__)'
Druhý příkaz ukazuje, kterou kopii vazeb daný interpret vidí, což je nejrychlejší způsob, jak rozeznat chybějící balíček od zastíněného. Spusťte ho s interpretem, který používá selhávající skript, ne s jiným, který náhodou funguje.
Co prostředí projektu nedokáže, je opravit frontend zabalený distribucí. Závislosti toho programu byly sestaveny pro interpret, který zvolil správce balíčků, a spuštění uvnitř prostředí vašeho projektu buď selže, nebo vytvoří směs, kterou nikdo nepodporuje. Vpravit do něj cesty pomocí proměnné prostředí je stejná chyba s kroky navíc: změnili jste, co nástroj načítá, aniž byste změnili, proti čemu byl testován. Tato výměna vypadá jako oprava přesně tak dlouho, dokud nenarazíte na další import.
Proč je přesměrování systémového interpretu past
Změna výchozího interpretu je lákavá, protože vypadá, že opraví trasování jediným příkazem. Také ale boří předpoklad, na kterém je postaven každý zabalený nástroj Pythonu na hostiteli, a selhání se objevují později a na nesouvisejících místech.
Mechanismy výběru alternativ byly navrženy pro přepínání mezi rovnocennými implementacemi, ne pro instalaci novějšího jazyka pod starší kompilované moduly. Kompilovaná rozšíření se stavějí pro konkrétní ABI, takže modul, který se včera importoval, se dnes nemusí načíst, aniž by byl odstraněn jediný balíček.
V radě, kterou lidé najdou, je také past v pojmenování. Příkaz python bez verze nemá jeden univerzální význam napříč distribucemi a prostředími a jeho pojetí jako pevného synonyma pro určitou hlavní verzi dává opravy, které fungují jen na stroji, kde byly napsány. Čtěte zásady systému, který máte před sebou, ne ty z článku na blogu.
Oddělené akceptační testy
Na konci mají být dva testy a projití jednoho nic neříká o druhém. První je, že podporovaný klientský příkaz funguje s interpretem, pro který byl zabalen. Druhý je, že privilegovaná služba naváže relaci a tunel přenáší provoz.
openvpn3 sessions-list
openvpn3-service-client --help 2>/dev/null | head -n 3
ip -4 addr show tun0
Dokud pracujete, udržujte si nezávislou cestu na stroj, zvlášť pokud VPN nese váš jediný administrativní přístup. Změna systémového interpretu je přesně ten druh úpravy, který může tento přístup odstranit v polovině cesty.
Pokud je selháním chybějící modul pro systémový nástroj, opravou je operace s balíčkem přes podporovaný postup. Pokud je selháním konflikt verzí ve vašem vlastním projektu, opravou je prostředí. Volba mezi těmito dvěma je celé rozhodnutí a určuje ji to, který program vypsal trasování.