يحتاج عميل VPN إلى مساعدة مميزة لإعادة تكوين الشبكة، وهذه الحقيقة تُطبَّق على نحو أوسع من اللازم على كل ما يحيط به. لا يحتاج السكربت الذي يحمّل مشاركة ملفات إلى root، لأن المشاركة تخص جلسة المستخدم المسجل الدخول وبيانات اعتماده. إخراج التحميل من المسار المميز يلغي الحاجة إلى قواعد sudo وخطافات root وتعديل التطبيقات المرفقة. وما يتبقى هو تطبيق صغير يبقى مفتوحًا ويراقب ملف تعريف واحدًا ويقوم بمحاولة واحدة.

لماذا ينتمي هذا إلى جلسة المستخدم

المجلد المحمَّل خاصية للجلسة التي حمّلته. لا تراه جلسة مستخدم آخر، والتحميل المملوك لـ root يتصرف بشكل مختلف عن ذاك الذي أنشأه Finder. وإبقاء التحميل في جلسة المستخدم يحافظ على هذا المعنى.

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

خطافات الاتصال الخاصة بـ Tunnelblick ليست بديلًا هنا، لأنها تعمل خارج جلسة سطح المكتب، وترتيبها بالنسبة إلى سكربتات العميل غير محدد. واستعلام الحالة من تطبيق المستخدم آلية أصغر بافتراضات أقل.

أثبت أولًا يدويًا أن المشاركة تعمل

لا تستطيع الأتمتة توفير مسار أو إذن أو حساب غير موجود. اتصل بـ VPN يدويًا وافتح المشاركة في Finder قبل كتابة أي سكربت. وإذا فشل ذلك، سيفشل السكربت بطريقة أكثر إرباكًا.

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

smbutil view //files.corp.example
osascript -e 'tell application "Tunnelblick" to get state of first configuration whose name is "Office"'
mount | grep -i smbfs

يثبت الأمر الأول أن الخادم يستجيب، والثاني أن اسم ملف التعريف يُحلّ، والثالث يبيّن كيف يبدو تحميل ناجح. سجّل الثلاثة قبل أتمتة أي شيء.

اقرأ حالة ملف التعريف من Tunnelblick

يعرض Tunnelblick إعداداته وحالاتها عبر AppleScript، وهذا هو الخطاف الوحيد الذي يحتاجه هذا التصميم. الحالة المهمة هي السلسلة المُبلَّغ عنها لذلك الملف الواحد، وليست وجود التطبيق.

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

property attempted : false

on idle
    set profileName to "Office"
    set shareURL to "smb://files.corp.example/OfficeTeam"
    set volName to "OfficeTeam"
    tell application "Tunnelblick" to set vpnState to state of first configuration whose name is profileName
    if vpnState is not "CONNECTED" then
        set attempted to false
        return 20
    end if
    tell application "Finder" to set mounted to (exists disk volName)
    if (not mounted) and (not attempted) then
        set attempted to true
        try
            mount volume shareURL
        end try
    end if
    return 20
end idle

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

حمّل مرة واحدة ثم توقف عن المحاولة

علم المحاولة هو ما يمنع هذا من أن يصبح حلقة تخمّن بيانات الاعتماد. وبعد أن يحاول التطبيق، ينتظر تغيّر حالة الاتصال قبل أن يحاول من جديد.

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

لا يحمل السكربت أي كلمة مرور، وينبغي أن يبقى كذلك. اترك عملية التحميل تسأل، واترك سلسلة المفاتيح تفعل ما تدعمه المؤسسة. وتضمين بيانات اعتماد في URL يحوّل سكربت راحة إلى سر يجب تدويره.

ما لا يستطيع المساعد فعله

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

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

بالنسبة إلى جهاز بلا إشراف أو أسطول مُدار، هذا التصميم على الشكل الخاطئ. استخدم سياسة تحميل يملكها المسؤول بدلًا من توسيع تطبيق سطح مكتب إلى خدمة مميزة.

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