Python greška u OpenVPN 3: popravite alat, a ne sistemski Python
Trag greške imenuje tumač koji je pokrenuo frontend, a ne servis koji posjeduje tunel. Uporedite to dvoje prije nego što bilo šta preusmjerite na nivou sistema.
Trag greške se pojavi kada se pokrene komanda za upravljanje VPN-om, a prvi nagon je instalirati drugi Python ili sistemski podrazumijevani tumač usmjeriti negdje drugdje. Taj nagon miješa dva runtime-a koja nemaju ništa zajedničko. Jedan pripada operativnom sistemu i njegovim pakovanim alatima; drugi pripada bilo kojem projektu koji gradite. Mijenjanje prvog da bi se zadovoljilo drugo jeste način na koji radna površina izgubi svoj menadžer paketa.
Poređenje koje vrijedi napraviti je između komponente koja je zaista zakazala i runtime-a koji imate pravo mijenjati. Oni gotovo nikada nisu isti objekat.
Dva Python pitanja koja izgledaju kao jedno
Prvo pitanje je: koji tumač je pokrenuo program koji je ispisao trag greške? Drugo je: koji tumač moj projekt treba da koristi? U terminalu izgledaju identično jer se na oba odgovara kucanjem python3, a imaju različite vlasnike, različite putanje nadogradnje i različit radijus dejstva.
Sistemski alat je vezan za tumač s kojim je njegova distribucija isporučena, zajedno s kompajliranim modulima izgrađenim prema ABI-ju tog tumača. Projekt je vezan za kakvo god okruženje za njega napravite. Premještanje sistemskog podrazumijevanog mijenja prvo za svaki alat na mašini odjednom; pravljenje okruženja mijenja drugo za jedan direktorij.
Samo jedna od tih radnji je povratna u roku od minute. To nije prva.
Koja komponenta je proizvela grešku
Pročitajte prvi red traga greške i izvršnu datoteku koja ga je proizvela prije nego što pročitate bilo šta drugo. Frontend komandne linije, privilegovani servis i API veze su odvojeni dijelovi, i samo su neki od njih uopšte 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
Prvi red skripte imenuje tumač koji će koristiti, i to je tumač iz kojeg je trag greške došao. Upit za paket vam kaže kome datoteka pripada, što određuje kome je dozvoljeno da je mijenja. Status servisa odgovara na sasvim drugo pitanje: da li privilegovani backend koji zaista uspostavlja sesije radi.
Greška pri uvozu modula, odbijanje D-Bus aktivacije i odbijeni akreditiv tri su različite faze. Greška pri uvozu se javlja prije nego što ikakva sesija postoji, pa je nikakva VPN konfiguracija neće popraviti, a ni radni servis je neće popraviti. Razvrstavanje poruke u jednu od te tri faze jeste pravi prvi korak.
Šta projektno okruženje može popraviti, a šta ne
Projektno okruženje rješava problem projekta: tačne verzije biblioteka koje jedna aplikacija treba, izolovane od svega ostalog. To je zaista korisno i to je pravi alat kada je program koji je zakazao skripta koju posjedujete.
uv run --python 3.11 app.py
python3 -c 'import openvpn3; print(openvpn3.__file__)'
Druga komanda pokazuje koju kopiju veza dati tumač vidi, što je najbrži način da razlikujete nedostajući paket od zasjenjenog. Pokrenite je tumačem koji koristi skripta koja je zakazala, a ne drugim koji slučajno radi.
Ono što projektno okruženje ne može je popraviti frontend koji je pakovala distribucija. Zavisnosti tog programa izgrađene su za tumač koji je menadžer paketa izabrao, a pokretanje unutar okruženja vašeg projekta ili ne uspijeva ili proizvodi mješavinu koju niko ne podržava. Ubacivanje putanja u njega pomoću varijable okruženja ista je greška s dodatnim koracima: promijenili ste šta alat učitava, a niste promijenili prema čemu je testiran. Ta razmjena izgleda kao popravka tačno onoliko dugo koliko je potrebno da naletite na sljedeći uvoz.
Zašto je preusmjeravanje sistemskog tumača zamka
Mijenjanje podrazumijevanog tumača je privlačno jer izgleda da popravlja trag greške jednom komandom. Ono takođe ruši pretpostavku na kojoj je izgrađen svaki pakovani Python alat na hostu, a otkazi se pojavljuju kasnije i na nepovezanim mjestima.
Mehanizmi za izbor alternative napravljeni su da prebacuju između ekvivalentnih implementacija, a ne da instaliraju noviji jezik pod starijim kompajliranim modulima. Kompajlirana proširenja se grade za određeni ABI, pa modul koji je juče uvezen danas može da se ne učita, iako nijedan paket nije uklonjen.
U savjetu koji ljudi nađu postoji i zamka s imenom. Komanda python bez verzije nema jedno univerzalno značenje kroz distribucije i okruženja, a tretiranje kao fiksnog sinonima za određenu glavnu verziju daje popravke koje rade samo na mašini na kojoj su napisane. Čitajte politiku sistema pred sobom, a ne onu iz blog posta.
Odvojeni prijemni testovi
Na kraju treba da budu dva testa, a prolazak jednog ne govori ništa o drugom. Prvi je da podržana klijentska komanda radi s tumačem za koji je pakovana. Drugi je da privilegovani servis uspostavi sesiju i tunel prenosi saobraćaj.
openvpn3 sessions-list
openvpn3-service-client --help 2>/dev/null | head -n 3
ip -4 addr show tun0
Održavajte nezavisan put do mašine dok radite, posebno ako VPN nosi vaš jedini administrativni pristup. Promjena sistemskog tumača je upravo ona vrsta izmjene koja taj pristup može ukloniti na pola puta.
Ako je otkaz nedostajući modul za sistemski alat, ispravka je operacija paketa kroz podržani tok rada. Ako je otkaz sukob verzija u vašem vlastitom projektu, ispravka je okruženje. Izbor između ta dva je cijela odluka, i njega određuje to koji je program ispisao trag greške.