كثيراً ما تشغّل النصوص البرمجية التي تحتاج إلى تشغيل VPN قبل النسخ الاحتياطي ملف openvpn مباشرة. وهذا يتخلّى عن معالجة ملف التعريف وDNS والمسارات التي يديرها Tunnelblick أصلاً. المسار المدعوم هو واجهة AppleScript الخاصة بـTunnelblick، التي تقبل طلبات connect وstate وdisconnect لملف تعريف مسمّى. استخدمها ودع التطبيق يبقى مسؤولاً.

تحدّث إلى التطبيق، لا إلى openvpn

يملك Tunnelblick ملف تعريف OpenVPN واختيار المحرّك والنصوص وتكامل DNS والمسارات. أما ملف openvpn التنفيذي المنفصل فهو ترتيب تشغيل مختلف، وليس اختصاراً إلى الاتصال نفسه.

استدعاء واجهة البرمجة النصية للتطبيق يحافظ على هذه الملكية ويجعل كل طلب قابلاً للمراجعة.

تفترض الأمثلة هنا أن Tunnelblick موجود في Applications، وأن ملف تعريف عامل اسمه HQ، وأن الأوامر تُنفَّذ في جلسة مستخدم Mac المسجّل. غيّر الاسم إلى ملف التعريف الدقيق الذي لديك.

ابدأ ملف تعريف مسمّى واحداً بالضبط

يسمّي طلب connect ملف التعريف. وهو ليس طلباً للاتصال بآخر ما جرى اختياره.

نفّذه في جلسة المستخدم التي تملك ملف التعريف:

osascript -e 'tell application "/Applications/Tunnelblick.app" to connect "HQ"'

اتبع مطالبات تسجيل الدخول المعتادة. قد يسأل macOS عمّا إذا كان يُسمح للتطبيق الذي يستدعي الأمر بالتحكم في Tunnelblick؛ تحقّق من التطبيق والهدف قبل الموافقة. الأتمتة التي تنقر متجاوزةً ذلك الحوار تُبطل الغرض منه.

طلب connect يعود قبل أن يصبح النفق جاهزاً

دليل البرمجة النصية في Tunnelblick صريح: يعود connect قبل اكتمال الاتصال. حالة خروج تساوي صفراً تعني أن الطلب قُبِل، لا أن حركة البيانات تتدفق.

اقرأ الحالة على حدة:

osascript -e 'tell application "/Applications/Tunnelblick.app" to get state of first configuration where name = "HQ"'

CONNECTED نتيجة لحالة الاتصال. وهي لا تُثبت بعد أن المورد الخاص الذي تحتاجه مهمتك قابل للوصول، لذا تحقّق من ذلك على حدة قبل بدء العمل التابع.

تغطي أدوات التحكم الأخرى في واجهة البرمجة النصية إجراءات أوسع وليست لازمة عندما يتغيّر ملف تعريف واحد فقط.

انتظر بمهلة، ثم افشل

الاستقصاء إلى ما لا نهاية هو ما يجعل النص يعلق طوال الليل ويعطّل التشغيل التالي. امنح الانتظار مهلة وفاصلاً قصيراً ونتيجة فشل صريحة. اعتبر كل حالة غير CONNECTED غير جاهزة، بما فيها الحالات الانتقالية. سجّل آخر حالة رأيتها حتى يفسّر الفشل نفسه.

تبدو الحلقة المحدودة هكذا:

for i in $(seq 1 30); do
  state=$(osascript -e 'tell application "/Applications/Tunnelblick.app" to get state of first configuration where name = "HQ"')
  if [ "$state" = "CONNECTED" ]; then exit 0; fi
  sleep 1
done
echo "tunnel did not reach CONNECTED" >&2
exit 1

ثلاثون ثانية مثال، وليست مهلة عالمية. اختر مهلة من مسار المصادقة الذي يستخدمه ملف التعريف فعلاً، واحتفظ بها في سجل سير العمل.

افحص الحالة وافصل بالاسم

لإيقاف ملف التعريف نفسه، استدعِ disconnect بالاسم نفسه. هذا يبقي الطلب ضيقاً ويترك ملفات التعريف الأخرى دون مساس.

osascript -e 'tell application "/Applications/Tunnelblick.app" to disconnect "HQ"'

احتفظ باسم ملف التعريف والوحدة المتحكّمة معاً في سجل سير العمل، مع فحوص المصادقة والاكتمال المتوقعة. هذا السجل هو ما يجعل الأمر قابلاً للمراجعة بعد ستة أشهر.

سلوك بدء التشغيل مع الحاسوب نمط مختلف. استخدم خيار بدء التشغيل الموثّق في Tunnelblick وإعداد بيانات الاعتماد الذي يتوقعه. الأمر الذي يعمل في جلسة سطح مكتب مسجّلة والخدمة التي تبدأ مع الجهاز لا يتشاركان السياق نفسه. لا تفترض أن نصاً يعمل أثناء تسجيل دخولك سيعمل عند الإقلاع. اختبر مسار بدء التشغيل بمعزل عنه، بالمهلة والتسجيل نفسيهما.

مقالات ذات صلة