Napaka Pythona v OpenVPN 3: popravite orodje, ne sistemskega Pythona
Traceback navaja tolmač, ki je zagnal frontend, ne storitve, ki ji pripada tunel. Primerjajte oba, preden karkoli preusmerite po celem sistemu.
Traceback se pojavi, ko se zažene ukaz za upravljanje VPN, in prvi vzgib steče k namestitvi drugega Pythona ali k preusmeritvi sistemske privzete vrednosti kam drugam. Ta vzgib meša dve izvajalni okolji, ki nimata nič skupnega. Eno pripada operacijskemu sistemu in njegovim zapakiranim orodjem; drugo pripada kateremu koli projektu, ki ga gradite. Zamenjati prvo, da bi zadovoljili drugo, je način, kako delujoč namizni računalnik izgubi svojega upravitelja paketov.
Primerjava, ki se je vredno lotiti, je med komponento, ki je zares odpovedala, in izvajalnim okoljem, ki ga smete spremeniti. Skoraj nikoli nista isti objekt.
Dve vprašanji o Pythonu, ki izgledata kot eno
Prvo vprašanje je: kateri tolmač je zagnal program, ki je izpisal traceback? Drugo je: kateri tolmač naj uporablja moj projekt? V terminalu izgledata enako, ker na obe odgovorimo s tipkanjem python3, imata pa različne lastnike, različne poti nadgradnje in različen polmer učinka.
Sistemsko orodje je vezano na tolmač, s katerim ga je dobavila distribucija, skupaj s prevedenimi moduli, zgrajenimi za ABI tega tolmača. Projekt je vezan na katero koli okolje, ki ga ustvarite zanj. Premik sistemske privzete vrednosti spremeni prvo za vsako orodje na stroju hkrati; ustvarjanje okolja spremeni drugo za eno mapo.
Samo eno od teh dejanj je mogoče razveljaviti v minuti. To ni prvo.
Katera komponenta je povzročila napako
Preden preberete karkoli drugega, preberite prvo vrstico tracebacka in izvršljivo datoteko, ki ga je ustvarila. Frontend ukazne vrstice, privilegirana storitev in vezave API so ločeni deli in le nekateri od njih so sploh Python.
command -v openvpn3
head -n 1 "$(command -v openvpn3)"
dpkg -S "$(command -v openvpn3)" 2>/dev/null
systemctl status openvpn3-service-client --no-pagerPrva vrstica skripta navaja tolmač, ki ga bo uporabil, in prav iz tega tolmača je prišel traceback. Poizvedba o paketu vam pove, komu datoteka pripada, kar določi, kdo jo sme spreminjati. Stanje storitve odgovarja na povsem drugo vprašanje: ali teče privilegirani backend, ki resnično odpira seje.
Napaka pri uvozu modula, zavrnitev aktivacije D-Bus in zavrnjene poverilnice so tri različne faze. Napaka pri uvozu se zgodi, preden obstaja kakršna koli seja, zato je nobena količina konfiguracije VPN ne odpravi, in tudi delujoča storitev je ne odpravi. Uvrstitev sporočila v eno od teh treh faz je pravi prvi korak.
Kaj okolje projekta zmore in česa ne
Okolje projekta reši projektno težavo: natančne različice knjižnic, ki jih potrebuje ena aplikacija, izolirane od vsega drugega. To je resnično koristno in je pravo orodje, kadar je program, ki odpoveduje, vaša lastna skripta.
uv run --python 3.11 app.py
python3 -c 'import openvpn3; print(openvpn3.__file__)'Drugi ukaz pokaže, katero kopijo vezav vidi določen tolmač, in to je najhitrejši način, da ločite manjkajoči paket od zasenčenega paketa. Zaženite ga s tolmačem, ki ga uporablja skripta, ki odpoveduje, ne z drugim, ki slučajno deluje.
Česar okolje projekta ne zmore, je popraviti frontend, ki ga je zapakirala distribucija. Odvisnosti tega programa so bile zgrajene za tolmač, ki ga je izbral upravitelj paketov, in njegovo izvajanje v okolju vašega projekta bodisi odpove bodisi ustvari mešanico, ki je nihče ne podpira. Vbrizgavanje poti vanj s spremenljivko okolja je ista napaka z dodatnimi koraki: spremenili ste, kaj orodje naloži, niste pa spremenili, proti čemu je bilo preizkušeno. Ta menjava izgleda kot popravek natanko tako dolgo, dokler ne pridete do naslednjega uvoza.
Zakaj je preusmerjanje sistemskega tolmača past
Spreminjanje privzetega tolmača je vabljivo, ker se zdi, da z enim ukazom popravi traceback. Prav tako zlomi predpostavko, na kateri je bilo zgrajeno vsako zapakirano Python orodje na gostitelju, in odpovedi se pojavijo pozneje ter na nepovezanih mestih.
Mehanizmi za izbiro alternative so bili zasnovani za preklapljanje med enakovrednimi izvedbami, ne za nameščanje novejšega jezika pod starejše prevedene module. Prevedene razširitve se gradijo za določen ABI, zato se modul, ki se je včeraj uvozil, danes morda ne naloži, ne da bi bil odstranjen en sam paket.
V nasvetih, ki jih ljudje najdejo, je tudi past z imenom. Ukaz python brez različice nima enega univerzalnega pomena med distribucijami in okolji, in obravnavanje kot fiksnega sinonima za določeno glavno različico prinese popravke, ki delujejo le na stroju, kjer so bili napisani. Berite politiko sistema pred seboj, ne tiste iz bloga.
Ločeni sprejemni preizkusi
Na koncu spadata dve preizkušnji in uspeh pri eni ne pove nič o drugi. Prva je, da podprti odjemalski ukaz deluje s tolmačem, za katerega je bil zapakiran. Druga je, da privilegirana storitev vzpostavi sejo in tunel prenaša promet.
openvpn3 sessions-list
openvpn3-service-client --help 2>/dev/null | head -n 3
ip -4 addr show tun0Med delom ohranite neodvisno pot na stroj, še zlasti če VPN prenaša vaš edini skrbniški dostop. Sprememba sistemskega tolmača je prav tista vrsta urejanja, ki lahko ta dostop na pol poti odvzame.
Če je odpoved manjkajoči modul za sistemsko orodje, je popravek operacija s paketom po podprtem delovnem toku. Če je odpoved konflikt različic v vašem lastnem projektu, je popravek okolje. Izbira med tema dvema je cela odločitev in določi jo to, kateri program je izpisal traceback.