OpenVPN 3 Python klaida: taisykite įrankį, o ne sistemos Python
Traceback įvardija interpretatorių, paleidusį frontendą, o ne tarnybą, kuriai priklauso tunelis. Palyginkite abu prieš ką nors peradresuodami visoje sistemoje.
Traceback pasirodo, kai paleidžiama VPN valdymo komanda, ir pirmas instinktas bėga diegti kitą Python arba nukreipti sistemos numatytąjį į kitą vietą. Tas instinktas sumaišo dvi vykdymo aplinkas, kurios neturi nieko bendra viena su kita. Viena priklauso operacinei sistemai ir jos supakuotiems įrankiams; kita priklauso bet kuriam projektui, kurį kuriate. Pakeisti pirmąją, kad būtų patenkinta antroji, yra būdas, kuriuo veikiantis darbalaukis netenka paketų tvarkyklės.
Palyginimas, kurį verta atlikti, yra tarp komponento, kuris iš tikrųjų sugedo, ir vykdymo aplinkos, kurią turite teisę keisti. Jie beveik niekada nėra tas pats objektas.
Du Python klausimai, kurie atrodo kaip vienas
Pirmas klausimas: kuris interpretatorius paleido programą, kuri išspausdino Traceback? Antras: kurį interpretatorių turėtų naudoti mano projektas? Terminale jie atrodo identiškai, nes į abu atsakoma įvedus python3, tačiau jie turi skirtingus savininkus, skirtingus atnaujinimo kelius ir skirtingą poveikio spindulį.
Sistemos įrankis yra susietas su interpretatoriumi, su kuriuo jį išleido distribucija, kartu su sukompiliuotais moduliais, sukurtais pagal to interpretatoriaus ABI. Projektas yra susietas su bet kuria aplinka, kurią jam sukursite. Sistemos numatytojo perkėlimas keičia pirmąjį visiems mašinos įrankiams iš karto; aplinkos sukūrimas keičia antrąjį tik vienam katalogui.
Tik vieną iš tų veiksmų galima atšaukti per minutę. Tai ne pirmasis.
Kuris komponentas sukėlė klaidą
Prieš ką nors kita skaitydami, perskaitykite pirmąją Traceback eilutę ir vykdomąjį failą, kuris ją sukėlė. Komandinės eilutės frontendas, privilegijuotoji tarnyba ir API sąsajos yra atskiros dalys, ir tik kai kurios jų apskritai yra Python.
command -v openvpn3
head -n 1 "$(command -v openvpn3)"
dpkg -S "$(command -v openvpn3)" 2>/dev/null
systemctl status openvpn3-service-client --no-pagerPirmoji scenarijaus eilutė įvardija interpretatorių, kurį jis naudos, ir būtent iš to interpretatoriaus atėjo Traceback. Paketo užklausa pasako, kam priklauso failas, o tai lemia, kas gali jį keisti. Tarnybos būsena atsako į visai kitą klausimą: ar veikia privilegijuotasis backend, kuris iš tikrųjų atidaro sesijas.
Modulio importo klaida, D-Bus aktyvavimo atsisakymas ir atmesti prisijungimo duomenys yra trys skirtingi etapai. Importo klaida įvyksta dar prieš atsirandant bet kokiai sesijai, todėl joks VPN konfigūracijos kiekis jos neištaisys, o veikianti tarnyba jos taip pat neištaisys. Pranešimo priskyrimas vienam iš tų trijų etapų yra tikrasis pirmas žingsnis.
Ką projekto aplinka gali ir ko negali ištaisyti
Projekto aplinka sprendžia projekto problemą: tikslios bibliotekų versijos, kurių reikia vienai programai, izoliuotos nuo viso kito. Tai tikrai naudinga, ir tai yra tinkamas įrankis, kai sugendanti programa yra jūsų pačių scenarijus.
uv run --python 3.11 app.py
python3 -c 'import openvpn3; print(openvpn3.__file__)'Antroji komanda parodo, kurią sąsajų kopiją mato duotasis interpretatorius, ir tai greičiausias būdas atskirti trūkstamą paketą nuo užgožto paketo. Vykdykite ją su interpretatoriumi, kurį naudoja sugendantis scenarijus, o ne su kitu, kuris veikia atsitiktinai.
Ko projekto aplinka negali padaryti, tai suremontuoti distribucijos supakuotą frontendą. Tos programos priklausomybės buvo sukurtos interpretatoriui, kurį pasirinko paketų tvarkyklė, o paleidus ją projekto aplinkoje ji arba sugenda, arba sukuria mišinį, kurio niekas nepalaiko. Įterpti į ją kelius per aplinkos kintamąjį yra ta pati klaida su papildomais žingsniais: pakeitėte tai, ką įrankis įkelia, bet nepakeitėte to, prieš ką jis buvo testuotas. Šis mainas atrodo kaip pataisa lygiai tol, kol pasiekiate kitą importą.
Kodėl sistemos interpretatoriaus peradresavimas yra spąstai
Numatytojo interpretatoriaus keitimas vilioja, nes atrodo, kad viena komanda ištaiso Traceback. Jis taip pat sulaužo prielaidą, kuria buvo pagrįstas kiekvienas supakuotas Python įrankis pagrindinėje mašinoje, o gedimai pasirodo vėliau ir nesusijusiose vietose.
Alternatyvų parinkimo mechanizmai buvo sukurti perjungti tarp lygiaverčių implementacijų, o ne įdiegti naujesnę kalbą po senesniais sukompiliuotais moduliais. Sukompiliuoti plėtiniai kuriami konkrečiam ABI, todėl modulis, kuris vakar importavosi, šiandien gali nebeįsikelti, nors nebuvo pašalintas nė vienas paketas.
Yra ir pavadinimo spąstai patarimuose, kuriuos žmonės randa. Komanda python be versijos neturi vienos universalios reikšmės tarp distribucijų ir aplinkų, o traktuojant ją kaip fiksuotą konkretaus pagrindinio leidimo sinonimą gaunamos pataisos, kurios veikia tik toje mašinoje, kur buvo parašytos. Skaitykite priešais esančios sistemos politiką, o ne tą, kuri yra tinklaraščio įraše.
Atskiri priėmimo bandymai
Pabaigoje turi būti du bandymai, ir vieno praėjimas nieko nesako apie kitą. Pirmasis — palaikoma kliento komanda veikia su interpretatoriumi, kuriam ji buvo supakuota. Antrasis — privilegijuotoji tarnyba užmezga sesiją, o tunelis praleidžia srautą.
openvpn3 sessions-list
openvpn3-service-client --help 2>/dev/null | head -n 3
ip -4 addr show tun0Dirbdami išlaikykite nepriklausomą kelią į mašiną, ypač jei VPN perduoda vienintelį jūsų administravimo prieigą. Sistemos interpretatoriaus pakeitimas yra būtent tokia redakcija, kuri gali tą prieigą atimti įpusėjus.
Jei gedimas yra trūkstamas sistemos įrankio modulis, pataisa yra paketo operacija per palaikomą darbo eigą. Jei gedimas yra versijų konfliktas jūsų pačiame projekte, pataisa yra aplinka. Pasirinkimas tarp tų dviejų yra visas sprendimas, ir jį lemia tai, kuri programa išspausdino Traceback.