OpenVPN 3 کا Python نقص: ٹول ٹھیک کریں، سسٹم کا Python نہیں
Traceback اُس interpreter کا نام لیتا ہے جس نے frontend چلایا، نہ کہ اُس سروس کا جو ٹنل کی مالک ہے۔ پورے سسٹم میں کچھ بدلنے سے پہلے دونوں کا موازنہ کریں۔
VPN کے انتظام کا کمانڈ شروع ہوتے ہی Traceback ظاہر ہوتا ہے، اور پہلی تحریک کسی اور Python کو نصب کرنے یا سسٹم کے ڈیفالٹ کو کہیں اور موڑنے کی طرف دوڑتی ہے۔ یہ تحریک دو ایسے runtimes کو ملا دیتی ہے جن کا آپس میں کوئی تعلق نہیں۔ ایک آپریٹنگ سسٹم اور اُس کے پیکج شدہ ٹولز کا ہے؛ دوسرا کسی بھی پروجیکٹ کا ہے جو آپ بنا رہے ہیں۔ دوسرے کو مطمئن کرنے کے لیے پہلا بدلنا ہی وہ طریقہ ہے جس سے کام کرتا ڈیسک ٹاپ اپنا پیکیج مینیجر کھو دیتا ہے۔
موازنہ کرنے کے قابل بات اُس جزو اور اُس runtime کے درمیان ہے جسے بدلنے کا آپ کو حق ہے۔ وہ تقریباً کبھی ایک ہی چیز نہیں ہوتے۔
دو Python سوالات جو ایک لگتے ہیں
پہلا سوال: Traceback چھاپنے والے پروگرام کو کون سے interpreter نے چلایا؟ دوسرا: میرے پروجیکٹ کو کون سا interpreter استعمال کرنا چاہیے؟ ٹرمینل میں دونوں ایک جیسے لگتے ہیں، کیونکہ دونوں کا جواب python3 لکھ کر دیا جاتا ہے، مگر اُن کے مالک، اپ گریڈ کے راستے اور اثر کا دائرہ مختلف ہیں۔
سسٹم کا ٹول اُس interpreter سے بندھا ہوتا ہے جو اُس کی ڈسٹری بیوشن نے فراہم کیا، اور اُن مرتب شدہ ماڈیولز سے بھی جو اُس interpreter کے ABI کے لیے بنائے گئے۔ پروجیکٹ کسی بھی ایسے ماحول سے بندھا ہوتا ہے جو آپ اُس کے لیے بنائیں۔ سسٹم کے ڈیفالٹ کو ہٹانا پہلے کو مشین کے ہر ٹول کے لیے ایک ساتھ بدلتا ہے؛ ماحول بنانا دوسرے کو صرف ایک ڈائریکٹری کے لیے بدلتا ہے۔
اُن میں سے صرف ایک عمل ایک منٹ میں واپس کیا جا سکتا ہے۔ وہ پہلا نہیں ہے۔
نقص کس جزو نے پیدا کیا
کوئی اور چیز پڑھنے سے پہلے Traceback کی پہلی سطر اور وہ executable پڑھیں جس نے اُسے پیدا کیا۔ کمانڈ لائن کا frontend، مراعات یافتہ سروس اور 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کسی script کی پہلی سطر اُس interpreter کا نام لیتی ہے جو وہ استعمال کرے گا، اور Traceback اُسی interpreter سے آیا ہے۔ پیکیج کی استفسار بتاتی ہے کہ فائل کس کی ہے، جو یہ طے کرتی ہے کہ اُسے کون بدل سکتا ہے۔ سروس کی حالت بالکل مختلف سوال کا جواب دیتی ہے: کیا واقعی سیشن کھولنے والا مراعات یافتہ بیک اینڈ چل رہا ہے۔
ماڈیول کی درآمد میں نقص، D-Bus ایکٹیویشن کی نامنظوری اور مسترد شدہ اسناد تین مختلف مراحل ہیں۔ درآمد کا نقص کسی بھی سیشن کے وجود سے پہلے ہوتا ہے، اس لیے VPN کی کوئی بھی ترتیب اُسے درست نہیں کرے گی، اور چلتی ہوئی سروس بھی اُسے درست نہیں کرے گی۔ پیغام کو اِن تین مراحل میں سے ایک میں رکھنا ہی اصل پہلا قدم ہے۔
پروجیکٹ کا ماحول کیا درست کر سکتا ہے اور کیا نہیں
پروجیکٹ کا ماحول پروجیکٹ کا مسئلہ حل کرتا ہے: ایک ایپلیکیشن کو درکار لائبریریوں کے عین مطابق نسخے، باقی سب سے الگ تھلگ۔ یہ واقعی مفید ہے، اور جب ناکام ہونے والا پروگرام آپ کی اپنی script ہو تو یہی صحیح ٹول ہے۔
uv run --python 3.11 app.py
python3 -c 'import openvpn3; print(openvpn3.__file__)'دوسرا کمانڈ دکھاتا ہے کہ کوئی مخصوص interpreter بائنڈنگز کی کون سی نقل دیکھ سکتا ہے، اور گمشدہ پیکیج کو ڈھکے ہوئے پیکیج سے الگ پہچاننے کا یہی تیز ترین طریقہ ہے۔ اُسے اُس interpreter سے چلائیں جو ناکام ہونے والی script استعمال کرتی ہے، کسی اور سے نہیں جو اتفاقاً چل رہا ہو۔
پروجیکٹ کا ماحول جو نہیں کر سکتا وہ ڈسٹری بیوشن کے پیکج شدہ frontend کی مرمت ہے۔ اُس پروگرام کے انحصار اُس interpreter کے لیے بنائے گئے تھے جو پیکیج مینیجر نے چنا، اور اُسے آپ کے پروجیکٹ کے ماحول میں چلانا یا تو ناکام ہوتا ہے یا ایسی آمیزش پیدا کرتا ہے جس کی کوئی حمایت نہیں کرتا۔ ماحول کے متغیر سے اُس میں راستے داخل کرنا اضافی قدموں کے ساتھ وہی غلطی ہے: آپ نے بدلا کہ ٹول کیا لوڈ کرتا ہے، مگر یہ نہیں بدلا کہ اُس کا کس چیز کے خلاف امتحان ہوا تھا۔ وہ تبادلہ صرف اگلی درآمد تک درستی جیسا لگتا ہے۔
سسٹم interpreter کو موڑنا پھندا کیوں ہے
ڈیفالٹ interpreter بدلنا پرکشش ہے کیونکہ لگتا ہے کہ ایک کمانڈ سے Traceback درست ہو جاتا ہے۔ یہ اُس مفروضے کو بھی توڑتا ہے جس پر میزبان کا ہر پیکج شدہ Python ٹول بنا تھا، اور ناکامیاں بعد میں غیر متعلق جگہوں پر ظاہر ہوتی ہیں۔
متبادل چننے کے طریقے برابر کے نفاذ کے درمیان بدلنے کے لیے بنائے گئے تھے، نہ کہ پرانے مرتب شدہ ماڈیولز کے نیچے نئی زبان نصب کرنے کے لیے۔ مرتب شدہ توسیعات مخصوص ABI کے لیے بنائی جاتی ہیں، اس لیے کل درآمد ہونے والا ماڈیول آج ایک بھی پیکیج نکالے بغیر لوڈ نہ ہو سکے۔
لوگوں کو ملنے والی نصیحتوں میں نام کا جال بھی ہے۔ بغیر نسخے والے python کمانڈ کا ڈسٹری بیوشنز اور ماحول میں کوئی ایک عالمگیر معنی نہیں، اور اُسے کسی مخصوص بڑے نسخے کا مستقل ہم معنی سمجھنا ایسی درستیاں دیتا ہے جو صرف اُسی مشین پر چلتی ہیں جہاں وہ لکھی گئیں۔ بلاگ پوسٹ کی پالیسی نہیں، اپنے سامنے موجود سسٹم کی پالیسی پڑھیں۔
الگ الگ قبولیت کی جانچیں
آخر میں دو جانچیں ہونی چاہئیں، اور ایک کا پاس ہونا دوسری کے بارے میں کچھ نہیں کہتا۔ پہلی یہ کہ معاون کلائنٹ کمانڈ اُس interpreter کے ساتھ چلتی ہے جس کے لیے وہ پیکج ہوئی۔ دوسری یہ کہ مراعات یافتہ سروس سیشن قائم کرتی ہے اور ٹنل ٹریفک لے جاتا ہے۔
openvpn3 sessions-list
openvpn3-service-client --help 2>/dev/null | head -n 3
ip -4 addr show tun0کام کرتے وقت مشین تک داخلے کا ایک خودمختار راستہ رکھیں، خاص طور پر اگر VPN آپ کی واحد انتظامی رسائی لے کر جاتا ہو۔ سسٹم کے interpreter میں تبدیلی بالکل ایسی ہی تدوین ہے جو وہ رسائی آدھے راستے میں چھین سکتی ہے۔
اگر ناکامی سسٹم ٹول کے لیے گمشدہ ماڈیول ہے، تو درستی معاون ورک فلو کے ذریعے پیکیج کا عمل ہے۔ اگر ناکامی آپ کے اپنے پروجیکٹ میں نسخوں کا تصادم ہے، تو درستی ماحول ہے۔ اِن دونوں میں سے چننا ہی پورا فیصلہ ہے، اور یہ اِس سے طے ہوتا ہے کہ کون سا پروگرام Traceback چھاپتا ہے۔