Памылка Python у OpenVPN 3: выпраўце інструмент, а не сістэмны Python
Трасоўка называе інтэрпрэтатар, які запусціў фронтэнд, а не службу, якой належыць тунель. Параўнайце іх, перш чым нешта перанакіроўваць ва ўсёй сістэме.
Трасоўка з’яўляецца, калі запускаецца каманда кіравання VPN, і першае жаданне — усталяваць іншы Python або накіраваць сістэмны прадвызначаны інтэрпрэтатар у іншае месца. Гэтае жаданне змешвае дзве асяроддзі выканання, якія не маюць нічога агульнага. Адно належыць аперацыйнай сістэме і яе спакаваным інструментам; другое належыць любому праекту, які вы будуеце. Змена першага, каб задаволіць другое, — гэта шлях, якім працоўны стол губляе свой мэнэджар пакетаў.
Параўнанне, якое варта зрабіць, — паміж кампанентам, які сапраўды адмовіў, і асяроддзем выканання, якое вы маеце права змяніць. Яны амаль ніколі не з’яўляюцца адным аб’ектам.
Два пытанні пра Python, якія выглядаюць як адно
Першае пытанне: які інтэрпрэтатар запусціў праграму, што надрукавала трасоўку? Другое: які інтэрпрэтатар павінен выкарыстоўваць мой праект? У тэрмінале яны выглядаюць аднолькава, бо на абодва адказваюць, набраўшы python3, і ў іх розныя ўладальнікі, розныя шляхі абнаўлення і розны радыус дзеяння.
Сістэмны інструмент прывязаны да інтэрпрэтатара, з якім пастаўлялася яго дыстрыбуцыя, разам са скампіляванымі модулямі, пабудаванымі пад ABI гэтага інтэрпрэтатара. Праект прывязаны да таго асяроддзя, якое вы для яго ствараеце. Перанос сістэмнага прадвызначанага змяняе першае для ўсіх інструментаў на машыне адначасова; стварэнне асяроддзя змяняе другое для адной папкі.
Толькі адно з гэтых дзеянняў можна адкаціць за хвіліну. І гэта не першае.
Які кампанент спарадзіў памылку
Прачытайце першы радок трасоўкі і выканальны файл, што яе спарадзіў, перш чым чытаць што-небудзь іншае. Фронтэнд каманднага радка, прывілеяваная служба і прывязкі API — асобныя часткі, і толькі некаторыя з іх наогул напісаны на 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
Першы радок сцэнара называе інтэрпрэтатар, які ён будзе выкарыстоўваць, і менавіта ад гэтага інтэрпрэтатара пайшла трасоўка. Запыт да пакетаў паведамляе, каму належыць файл, а гэта вызначае, каму дазволена яго змяняць. Стан службы адказвае на зусім іншае пытанне: ці працуе прывілеяваная частка, якая фактычна ўсталёўвае сеансы.
Памылка імпарту модуля, адмова актывацыі D-Bus і адхіленыя ўліковыя даныя — гэта тры розныя этапы. Памылка імпарту ўзнікае да таго, як існуе хоць які сеанс, таму ніякая налада VPN яе не выправіць, і працоўная служба таксама не выправіць. Размеркаванне паведамлення па адным з гэтых трох этапаў і ёсць сапраўдны першы крок.
Што асяроддзе праекта можа выправіць, а што не
Асяроддзе праекта вырашае праблему праекта: дакладныя версіі бібліятэк, патрэбныя адной праграме, ізаляваныя ад усёй астатняй. Гэта сапраўды карысна, і гэта правільны інструмент, калі праграма, што адмовіла, — гэта ваш уласны сцэнар.
uv run --python 3.11 app.py
python3 -c 'import openvpn3; print(openvpn3.__file__)'
Другая каманда паказвае, якую копію прывязак бачыць дадзены інтэрпрэтатар, і гэта найхутчэйшы спосаб адрозніць адсутны пакет ад зацененага. Запускайце яе тым інтэрпрэтатарам, які выкарыстоўвае зламаны сцэнар, а не іншым, які выпадкова працуе.
Што асяроддзе праекта зрабіць не можа, дык гэта адрамантаваць фронтэнд, спакаваны дыстрыбуцыяй. Залежнасці гэтай праграмы былі пабудаваны пад інтэрпрэтатар, які абраў мэнэджар пакетаў, і яе запуск унутры асяроддзя вашага праекта або церпіць няўдачу, або дае сумесь, якую ніхто не падтрымлівае. Уліванне шляхоў у яе праз зменную асяроддзя — тая ж памылка з лішнімі крокамі: вы змянілі тое, што загружае інструмент, не змяніўшы тое, супраць чаго ён тэсціраваўся. Такі абмен выглядае выпраўленнем роўна столькі, колькі патрабуецца, каб атрымаць наступную памылку імпарту.
Чаму перанакіраванне сістэмнага інтэрпрэтатара — гэта пастка
Змяняць прадвызначаны інтэрпрэтатар прывабна, бо здаецца, што гэта выпраўляе трасоўку адной камандай. Гэта таксама ламае дапушчэнне, на якім пабудаваны кожны спакаваны інструмент Python на хасце, і збоі з’яўляюцца пазней і ў не звязаных месцах.
Механізмы выбару альтэрнатыў былі распрацаваны для пераключэння паміж раўназначнымі рэалізацыямі, а не для ўсталявання навейшай мовы пад старэйшымі скампіляванымі модулямі. Скампіляваныя пашырэнні будуюцца пад пэўны ABI, таму модуль, які імпартаваўся ўчора, сёння можа не загрузіцца, нават калі ніводзін пакет не выдалены.
Ёсць таксама пастка ў назве ў парадзе, які знаходзяць людзі. Каманда python без версіі не мае аднаго ўніверсальнага сэнсу ў розных дыстрыбуцыях і асяроддзях, і стаўленне да яе як да фіксаванага сіноніма пэўнай асноўнай версіі дае выпраўленні, што працуюць толькі на машыне, дзе іх напісалі. Чытайце палітыку сістэмы, якая перад вамі, а не тую, што ў паведамленні блога.
Асобныя прыёмачныя тэсты
У канцы павінны быць два тэсты, і паспяховае праходжанне аднаго нічога не кажа пра другі. Першы — што падтрымліваная каманда кліента працуе з інтэрпрэтатарам, пад які яна была спакаваная. Другі — што прывілеяваная служба ўсталёўвае сеанс і тунель перадае трафік.
openvpn3 sessions-list
openvpn3-service-client --help 2>/dev/null | head -n 3
ip -4 addr show tun0
Трымайце незалежны шлях на машыну, пакуль працуеце, асабліва калі VPN нясе ваш адзіны адміністрацыйны доступ. Змена сістэмнага інтэрпрэтатара — гэта менавіта той від правак, які можа адабраць гэты доступ на паўдарозе.
Калі збой — гэта адсутны модуль для сістэмнага інструмента, выпраўленне — аперацыя з пакетам праз падтрымліваемы працэс. Калі збой — канфлікт версій у вашым уласным праекце, выпраўленне — асяроддзе. Выбар паміж гэтымі двума і ёсць усё рашэнне, і яно вызначаецца тым, якая праграма надрукавала трасоўку.