Traceback parādās, kad sākas VPN pārvaldības komanda, un pirmais instinkts skrien uz citas Python instalēšanu vai sistēmas noklusējuma pavēršanu citur. Šis instinkts sajauc divas izpildlaika vides, kurām nav nekā kopīga. Viena pieder operētājsistēmai un tās iepakotajiem rīkiem; otra pieder jebkuram projektam, ko veidojat. Mainīt pirmo, lai apmierinātu otro, ir veids, kā strādājošs dators zaudē savu paku pārvaldnieku.

Salīdzinājums, ko ir vērts veikt, ir starp komponenti, kas patiešām sabojājās, un izpildlaika vidi, ko jums ir tiesības mainīt. Tie gandrīz nekad nav viens un tas pats objekts.

Divi Python jautājumi, kas izskatās kā viens

Pirmais jautājums: kurš interpretētājs palaida programmu, kas izdrukāja Traceback? Otrais: kuru interpretētāju lai izmanto mans projekts? Terminālī tie izskatās identiski, jo uz abiem atbild, ierakstot python3, taču tiem ir dažādi īpašnieki, dažādi atjaunināšanas ceļi un dažāds ietekmes rādiuss.

Sistēmas rīks ir piesaistīts interpretētājam, ar kuru to izlaida distributīvs, kopā ar kompilētajiem moduļiem, kas būvēti pret šī interpretētāja ABI. Projekts ir piesaistīts jebkurai videi, ko tam izveidojat. Sistēmas noklusējuma pārvietošana maina pirmo visiem mašīnas rīkiem uzreiz; vides izveide maina otro vienai mapei.

Tikai vienu no šīm darbībām var atcelt minūtes laikā. Tā nav pirmā.

Kura komponente radīja kļūdu

Pirms lasīt jebko citu, izlasiet Traceback pirmo rindu un izpildāmo failu, kas to radīja. Komandrindas frontends, privileģētais serviss un API saistības ir atsevišķas daļas, un tikai dažas no tām vispār ir 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

Skripta pirmā rinda nosauc interpretētāju, ko tas izmantos, un tieši no šī interpretētāja nāca Traceback. Pakas vaicājums pasaka, kam pieder fails, un tas nosaka, kas drīkst to mainīt. Servisa statuss atbild uz pavisam citu jautājumu: vai darbojas privileģētais aizmugurs, kas patiešām atver sesijas.

Moduļa importa kļūda, D-Bus aktivizācijas atteikums un noraidīti akreditācijas dati ir trīs dažādi posmi. Importa kļūda notiek pirms jebkuras sesijas, tāpēc to neizlabos neviens VPN konfigurācijas daudzums, un arī strādājošs serviss to neizlabos. Ziņojuma iedalīšana vienā no šiem trim posmiem ir īstais pirmais solis.

Ko projekta vide var un ko nevar izlabot

Projekta vide atrisina projekta problēmu: precīzas bibliotēku versijas, kas vajadzīgas vienai lietotnei, izolētas no visa pārējā. Tas patiešām ir noderīgi, un tas ir pareizais rīks, kad bojājošā programma ir jūsu pašu skripts.

uv run --python 3.11 app.py
python3 -c 'import openvpn3; print(openvpn3.__file__)'

Otrā komanda parāda, kuru saistību kopiju konkrētais interpretētājs redz, un tas ir ātrākais veids, kā atšķirt trūkstošu paku no aizsegtas pakas. Palaidiet to ar interpretētāju, ko izmanto bojājošais skripts, nevis ar citu, kas nejauši strādā.

Ko projekta vide nevar izdarīt, ir salabot distributīva iepakotu frontendu. Šīs programmas atkarības tika būvētas interpretētājam, ko izvēlējās paku pārvaldnieks, un tās palaišana projekta vidē vai nu neizdodas, vai rada maisījumu, ko neviens neatbalsta. Ceļu ievadīšana tajā ar vides mainīgo ir tā pati kļūda ar papildu soļiem: jūs esat mainījis to, ko rīks ielādē, bet ne to, pret ko tas tika pārbaudīts. Šī maiņa izskatās kā labojums tieši tik ilgi, kamēr jāsasniedz nākamais imports.

Kāpēc sistēmas interpretētāja pārvirzīšana ir slazds

Noklusējuma interpretētāja maiņa vilina, jo šķiet, ka tā ar vienu komandu izlabo Traceback. Tā arī salauž pieņēmumu, uz kura tika būvēts katrs iepakotais Python rīks uz resursdatora, un kļūmes parādās vēlāk un nesaistītās vietās.

Alternatīvu atlases mehānismi tika izstrādāti, lai pārslēgtos starp līdzvērtīgām implementācijām, nevis lai zem vecākiem kompilētiem moduļiem instalētu jaunāku valodu. Kompilētie paplašinājumi tiek būvēti konkrētam ABI, tāpēc modulis, kas vakar importējās, šodien var neielādēties, lai gan nav noņemta neviena paka.

Padomos, ko cilvēki atrod, ir arī nosaukuma slazds. Komandai python bez versijas nav vienas universālas nozīmes pāri distributīviem un vidēm, un tās uztveršana par fiksētu konkrētas pamatversijas sinonīmu rada labojumus, kas strādā tikai tajā mašīnā, kur tie tika rakstīti. Lasiet priekšā esošās sistēmas politiku, nevis to, kas ir bloga ierakstā.

Atsevišķi pieņemšanas testi

Beigās jābūt diviem testiem, un viena izturēšana neko nepasaka par otru. Pirmais ir tas, ka atbalstītā klienta komanda strādā ar interpretētāju, kuram tā tika iepakota. Otrais ir tas, ka privileģētais serviss nodibina sesiju un tunelis pārvadā datu plūsmu.

openvpn3 sessions-list
openvpn3-service-client --help 2>/dev/null | head -n 3
ip -4 addr show tun0

Strādājot saglabājiet neatkarīgu ceļu uz mašīnu, jo īpaši, ja VPN pārvadā jūsu vienīgo administratīvo piekļuvi. Sistēmas interpretētāja maiņa ir tieši tāda rediģēšana, kas var atņemt šo piekļuvi pusceļā.

Ja kļūme ir trūkstošs modulis sistēmas rīkam, labojums ir pakas operācija atbalstītajā darbplūsmā. Ja kļūme ir versiju konflikts jūsu pašu projektā, labojums ir vide. Izvēle starp šiem diviem ir viss lēmums, un to nosaka tas, kura programma izdrukāja Traceback.

Saistītie raksti