OpenVPN 3:n Python-virhe: korjaa työkalu, älä järjestelmän Pythonia
Jäljitys nimeää tulkin, joka suoritti frontendin, ei palvelua, joka omistaa tunnelin. Vertaa näitä kahta ennen kuin ohjaat mitään uudelleen järjestelmänlaajuisesti.
Jäljitys ilmestyy, kun VPN:n hallintakomento käynnistyy, ja ensimmäinen vaisto on asentaa toinen Python tai osoittaa järjestelmän oletus jonnekin muualle. Tämä vaisto sekoittaa kaksi ajonaikaista ympäristöä, joilla ei ole mitään tekemistä toistensa kanssa. Toinen kuuluu käyttöjärjestelmälle ja sen paketoiduille työkaluille; toinen kuuluu mille tahansa projektille, jota rakennat. Ensimmäisen muuttaminen toisen tyydyttämiseksi on tapa, jolla toimiva työpöytä menettää paketinhallintansa.
Vertailu, joka kannattaa tehdä, on sen välillä, mikä komponentti todella epäonnistui, ja sen ajonaikaisen ympäristön välillä, jota sinulla on oikeus muuttaa. Ne eivät lähes koskaan ole sama objekti.
Kaksi Python-kysymystä, jotka näyttävät yhdeltä
Ensimmäinen kysymys on: mikä tulkki suoritti ohjelman, joka tulosti jäljityksen? Toinen on: mitä tulkkia projektini pitäisi käyttää? Ne näyttävät päätteessä identtisiltä, koska molempiin vastataan kirjoittamalla python3, ja niillä on eri omistajat, eri päivityspolut ja eri vaikutussäde.
Järjestelmätyökalu on sidottu tulkkiin, jonka kanssa sen jakelu toimitettiin, sekä kyseisen tulkin ABI:a vasten rakennettuihin käännettyihin moduuleihin. Projekti on sidottu siihen ympäristöön, jonka sille luot. Järjestelmän oletuksen siirtäminen muuttaa ensimmäistä kaikille koneen työkaluille kerralla; ympäristön luominen muuttaa toista yhdelle hakemistolle.
Vain yksi näistä toimista on peruttavissa minuutissa. Se ei ole ensimmäinen.
Mikä komponentti tuotti virheen
Lue jäljityksen ensimmäinen rivi ja sen tuottanut suoritettava tiedosto ennen kuin luet mitään muuta. Komentorivin frontend, etuoikeutettu palvelu ja API-sidonnat ovat erillisiä osia, ja vain osa niistä on ylipäätään Pythonia.
command -v openvpn3
head -n 1 "$(command -v openvpn3)"
dpkg -S "$(command -v openvpn3)" 2>/dev/null
systemctl status openvpn3-service-client --no-pager
Skriptin ensimmäinen rivi nimeää tulkin, jota se käyttää, ja juuri siitä tulkkista jäljitys tuli. Pakettikysely kertoo, kenelle tiedosto kuuluu, mikä ratkaisee, kuka saa muuttaa sitä. Palvelun tila vastaa täysin toiseen kysymykseen: onko etuoikeutettu taustapalvelu, joka todella muodostaa istuntoja, käynnissä.
Moduulin tuontivirhe, D-Bus-aktivoinnin hylkäys ja hylätty kirjautumistieto ovat kolme eri vaihetta. Tuontivirhe tapahtuu ennen kuin yhtään istuntoa on olemassa, joten mikään VPN-asetus ei korjaa sitä, eikä toimiva palvelukaan korjaa sitä. Viestin sijoittaminen johonkin näistä kolmesta vaiheesta on varsinainen ensimmäinen askel.
Mitä projektin ympäristö voi korjata ja mitä ei
Projektin ympäristö ratkaisee projektin ongelman: tarkat kirjastoversiot, joita yksi sovellus tarvitsee, eristettyinä kaikesta muusta. Se on aidosti hyödyllistä, ja se on oikea työkalu, kun epäonnistuva ohjelma on oma skriptisi.
uv run --python 3.11 app.py
python3 -c 'import openvpn3; print(openvpn3.__file__)'
Toinen komento näyttää, minkä kopion sidonnoista tietty tulkki näkee, ja se on nopein tapa erottaa puuttuva paketti varjostetusta. Suorita se tulkilla, jota epäonnistuva skripti käyttää, älä toisella, joka sattuu toimimaan.
Mitä projektin ympäristö ei voi tehdä, on korjata jakelun paketoima frontend. Kyseisen ohjelman riippuvuudet rakennettiin tulkkia varten, jonka paketinhallinta valitsi, ja sen suorittaminen projektisi ympäristössä joko epäonnistuu tai tuottaa sekoituksen, jota kukaan ei tue. Polkujen ruiskuttaminen siihen ympäristömuuttujan avulla on sama virhe lisäaskelilla: muutit sitä, mitä työkalu lataa, muuttamatta sitä, mitä vasten sitä testattiin. Tämä vaihtokauppa näyttää korjaukselta täsmälleen niin kauan kuin kestää seuraavaan tuontiin osumista.
Miksi järjestelmän tulkin uudelleenohjaaminen on ansa
Oletustulkin muuttaminen houkuttaa, koska se näyttää korjaavan jäljityksen yhdellä komennolla. Se rikkoo myös oletuksen, jonka varaan jokainen isäntäkoneen paketoitu Python-työkalu on rakennettu, ja viat ilmenevät myöhemmin ja toisiinsa liittymättömissä paikoissa.
Vaihtoehtojen valintamekanismit suunniteltiin vaihtamaan vastaavien toteutusten välillä, ei asentamaan uudempaa kieltä vanhempien käännettyjen moduulien alle. Käännetyt laajennukset rakennetaan tiettyä ABI:a varten, joten eilen tuotu moduuli voi jäädä tänään lataamatta, vaikka yhtään pakettia ei olisi poistettu.
Löydettävässä neuvossa on myös nimeämisansa. Versioimaton python-komento ei tarkoita yhtä yleismaailmallista asiaa jakelujen ja ympäristöjen yli, ja sen kohteleminen tietyn pääversion kiinteänä synonyymina tuottaa korjauksia, jotka toimivat vain sillä koneella, jolla ne kirjoitettiin. Lue edessäsi olevan järjestelmän käytäntöä, älä blogikirjoituksen.
Erilliset hyväksymistestit
Lopussa pitäisi olla kaksi testiä, ja toisen läpäiseminen ei kerro mitään toisesta. Ensimmäinen on, että tuettu asiakaskomento toimii tulkin kanssa, jota varten se paketoitiin. Toinen on, että etuoikeutettu palvelu muodostaa istunnon ja tunneli kuljettaa liikennettä.
openvpn3 sessions-list
openvpn3-service-client --help 2>/dev/null | head -n 3
ip -4 addr show tun0
Pidä työskennellessäsi riippumaton reitti koneelle, etenkin jos VPN kuljettaa ainoan ylläpitoyhteytesi. Muutos järjestelmän tulkkiin on juuri sellainen muokkaus, joka voi poistaa kyseisen yhteyden kesken kaiken.
Jos vika on järjestelmätyökalun puuttuva moduuli, korjaus on pakettitoimenpide tuetun työnkulun kautta. Jos vika on oman projektisi versioristiriita, korjaus on ympäristö. Näiden kahden välinen valinta on koko päätös, ja sen ratkaisee se, mikä ohjelma tulosti jäljityksen.