Traceback sa objaví, keď sa spustí príkaz na správu VPN, a prvý inštinkt beží k inštalácii iného Pythonu alebo k nasmerovaniu systémovej predvoľby niekam inam. Ten inštinkt mieša dve runtime prostredia, ktoré nemajú nič spoločné. Jedno patrí operačnému systému a jeho zabaleným nástrojom; druhé patrí akémukoľvek projektu, ktorý vytvárate. Zmeniť prvé, aby sa uspokojilo druhé, je spôsob, akým funkčný počítač stratí svojho správcu balíčkov.

Porovnanie, ktoré stojí za to urobiť, je medzi komponentom, ktorý skutočne zlyhal, a runtime prostredím, ktoré smiete meniť. Takmer nikdy nie sú tým istým objektom.

Dve otázky o Pythone, ktoré vyzerajú ako jedna

Prvá otázka je: ktorý interpret spustil program, ktorý vytlačil traceback? Druhá: ktorý interpret má použiť môj projekt? V termináli vyzerajú rovnako, pretože na obe sa odpovedá napísaním python3, a majú rôznych vlastníkov, rôzne cesty aktualizácie a rôzny polomer účinku.

Systémový nástroj je viazaný na interpret, s ktorým ho dodala distribúcia, spolu s kompilovanými modulmi zostavenými pre ABI tohto interpretu. Projekt je viazaný na akékoľvek prostredie, ktoré preň vytvoríte. Presunutie systémovej predvoľby zmení prvé pre každý nástroj na stroji naraz; vytvorenie prostredia zmení druhé pre jeden adresár.

Len jedna z týchto akcií sa dá vrátiť za minútu. Nie je to tá prvá.

Ktorý komponent spôsobil chybu

Predtým, než prečítate čokoľvek iné, prečítajte prvý riadok tracebacku a spustiteľný súbor, ktorý ho vytvoril. Frontend príkazového riadka, privilegovaná služba a API väzby sú oddelené časti a len niektoré z nich sú 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

Prvý riadok skriptu uvádza interpret, ktorý bude používať, a práve z tohto interpretu prišiel traceback. Otázka na balík vám povie, komu súbor patrí, čo určuje, kto ho smie meniť. Stav služby odpovedá na celkom inú otázku: či beží privilegovaný backend, ktorý skutočne otvára relácie.

Chyba importu modulu, odmietnutie aktivácie D-Bus a odmietnuté prihlasovacie údaje sú tri rôzne fázy. Chyba importu nastane predtým, než existuje akákoľvek relácia, takže ju nijaké množstvo konfigurácie VPN neopraví, a neopraví ju ani fungujúca služba. Zaradenie správy do jednej z tých troch fáz je skutočný prvý krok.

Čo prostredie projektu dokáže a čo nedokáže opraviť

Prostredie projektu rieši problém projektu: presné verzie knižníc, ktoré potrebuje jedna aplikácia, izolované od všetkého ostatného. To je naozaj užitočné a je to správny nástroj, keď zlyhávajúci program je váš vlastný skript.

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

Druhý príkaz ukazuje, ktorú kópiu väzieb daný interpret vidí, a to je najrýchlejší spôsob, ako odlíšiť chýbajúci balík od zatieneného balíka. Spustite ho interpretom, ktorý používa zlyhávajúci skript, nie iným, ktorý náhodou funguje.

Čo prostredie projektu nedokáže, je opraviť frontend zabalený distribúciou. Závislosti tohto programu boli zostavené pre interpret, ktorý vybral správca balíčkov, a jeho spustenie v prostredí vášho projektu buď zlyhá, alebo vytvorí zmes, ktorú nikto nepodporuje. Vstrekovať doň cesty premennou prostredia je tá istá chyba s krokmi navyše: zmenili ste, čo nástroj načítava, ale nezmenili ste, voči čomu bol testovaný. Tá výmena vyzerá ako oprava presne tak dlho, ako trvá dostať sa k ďalšiemu importu.

Prečo je presmerovanie systémového interpretu pasca

Zmena predvoleného interpretu je lákavá, pretože vyzerá, že opraví traceback jediným príkazom. Tiež narúša predpoklad, na ktorom bol zostavený každý zabalený nástroj Pythonu na hostiteľovi, a zlyhania sa objavia neskôr a na nesúvisiacich miestach.

Mechanizmy výberu alternatív boli navrhnuté na prepínanie medzi rovnocennými implementáciami, nie na inštaláciu novšieho jazyka pod staršie kompilované moduly. Kompilované rozšírenia sa zostavujú pre konkrétne ABI, takže modul, ktorý sa včera importoval, dnes nemusí načítať, aj keď nebol odstránený ani jeden balík.

V radách, ktoré ľudia nachádzajú, je aj pasca s názvom. Príkaz python bez verzie nemá jedno univerzálne označenie naprieč distribúciami a prostrediami, a jeho chápanie ako pevného synonyma konkrétnej hlavnej verzie prináša opravy, ktoré fungujú len na stroji, kde boli napísané. Čítajte politiku systému pred sebou, nie tú z blogového príspevku.

Oddelené akceptačné skúšky

Na konci patria dve skúšky a absolvovanie jednej nič nehovorí o druhej. Prvá je, že podporovaný klientsky príkaz funguje s interpretom, pre ktorý bol zabalený. Druhá je, že privilegovaná služba nadviaže reláciu a tunel prenáša premávku.

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

Kým pracujete, udržiavajte si nezávislú cestu na stroj, najmä ak VPN prenáša váš jediný administratívny prístup. Zmena systémového interpretu je presne ten druh úpravy, ktorý môže ten prístup v polovici odobrať.

Ak je zlyhaním chýbajúci modul pre systémový nástroj, opravou je operácia s balíkom cez podporovaný pracovný postup. Ak je zlyhaním konflikt verzií vo vašom vlastnom projekte, opravou je prostredie. Výber medzi tými dvoma je celé rozhodnutie a určuje ho to, ktorý program vytlačil traceback.

Súvisiace články