ה-VPN של Mac מתחבר מחדש מעצמו מיד לאחר לחיצה על התנתק
צג שמתייחס לכל מצב מנותק כתקלה ייאבק בכפתור התנתק. הפרידו בין כוונה למצב נצפה, ואז הגבילו את הניסיונות החוזרים.
לחיצה על התנתק עובדת, וכעבור עשר שניות המנהרה חוזרת בכל זאת. הלולאה הזו היא רק לעתים רחוקות התנהגות שגויה של לקוח ה-VPN; זהו סקריפט התאוששות שתמיד שאל רק שאלה אחת, „האם זה למטה?“, וענה עליה בחיבור. ברגע שמפרידים בין השאלה שהמשתמש ענה עליה לבין השאלה שהמערכת מדווחת עליה, התיקון הופך לכמות קטנה של מצב במקום להמתנה ארוכה יותר.
שתי שאלות, לא אחת
האם הפרופיל הזה אמור להיות מחובר כרגע, ומה המערכת מדווחת ברגע זה? אלו שאלות שונות עם בעלים שונים, ומדיניות התאוששות זקוקה לשתיהן לפני שהיא פועלת. כוונה היא משהו שהכלי שלכם מחליט וזוכר. מצב נצפה הוא משהו שהפלטפורמה אומרת לכם.
| Intent | What you observe | What to do |
|---|---|---|
| Wanted | Dropped unexpectedly | Allow one supported recovery attempt |
| Paused by the user | Disconnected | Do nothing until intent changes |
| Wanted | Already connecting | Wait instead of starting a rival attempt |
| Wanted | Authentication needs a person | Prompt, then stop replaying credentials |
קראו את השורות כמדיניות ולא כרשימת מקרים. השורה השנייה היא זו שרוב הסקריפטים משמיטים, והיא השורה היחידה שמבדילה צג ממכונה שמתעקשת להיות צודקת.
מצב נצפה אינו העדפה
מודל המצב Network Extension של אפל מדווח על המצבים connecting, connected, disconnecting, disconnected ו-recovery. חמשת המצבים מתארים את החיבור. אף אחד מהם אינו אומר „המשתמש ביקש שהפרופיל הזה יישאר מושהה“, כי זה בכלל לא מצב חיבור. לקוחות שאינם בנויים על המסגרת הזו חושפים את הפקדים והקריאות הנתמכים שלהם, והם משרטטים את אותו קו באוצר המילים שלהם.
המסקנה היא שמצב מנותק לא יכול להתפרש לעולם לבדו. הוא אומר אחד משלושה דברים לפחות: המנהרה נפלה, המשתמש עצר אותה, או שהמערכת נמצאת בין ניסיונות. רק הרשומה שלכם של הכוונה יכולה להבדיל ביניהם. כתבו את הרשומה הזו, שמרו אותה בין אתחולים אם עליה לשרוד אתחול, ועדכנו אותה ברגע שבו המשתמש פועל במקום להסיק אותה מאוחר יותר משורת יומן.
scutil --nc list
scutil --nc status "Office VPN"
מי עוד רשאי להפעיל את הפרופיל הזה
השהיה שהעוזר שלכם מבטיח היא חזקה רק כמו שאר הבעלים של אותו פרופיל. כלל On Demand, תצורה מנוהלת או לקוח שני יכולים כולם לבקש חיבור, והעוזר שלכם ייראה שבור בזמן שהוא מתנהג בדיוק כפי שנכתב.
מצאו כל מנגנון שיכול להפעיל את הפרופיל לפני שאתם מבטיחים לכבד השהיה, ורשמו מי מנצח. כאשר שירות מנוהל מונע בכוונה אפשרות השהיה אישית, זו החלטה של מנהל מערכת בנוגע למדיניות, ולא פער שסקריפט אמור למלא על ידי מאבק בניהול.
הפכו את הניסיונות החוזרים למשעממים
הגבילו את מספר הניסיונות והפכו כל אחד מהם למגיב למשהו שהשתנה: הרשת חזרה, השער ענה, בקשת האישורים הושלמה. שער לא זמין, זהות שפגה וגורם שני שנדחה זקוקים לשלוש תגובות שונות, ולולאה הדוקה נותנת לשלושתם את אותה תגובה.
שימו לב למה שניסיון חוזר מהיר באמת מייצר על המסך. דיאלוגים חוזרים שהמשתמש סוגר גרועים מהודעת כשל אחת ברורה, והם מלמדים אנשים ללחוץ דרך הנחיות בלי לקרוא אותן.
השהיה ומדיניות תעבורה הן הבטחות נפרדות
מנהרה מושהית על ידי המשתמש לעתים קרובות משאירה את התעבורה חסומה בכוונה, וזה כל העניין של מדיניות בסגנון kill switch. זה אומר שהשהיה צריכה להבטיח בדיוק דבר אחד: ההתאוששות נעצרת. היא לא צריכה לשנות בשקט את מה שהרשת מתירה.
החליטו על התנהגות התעבורה בנפרד, תעדו אותה לצד פקד ההשהיה, ושמרו על עקביות בין אם המנהרה מושהית, נכשלה או נעדרת. אחרת המשתמש לומד שלחיצה על התנתק עושה משהו בלתי צפוי, וכרטיס התמיכה הבא עוסק ברשת ש„לפעמים מפסיקה לעבוד“ בלי סיבה נראית לעין.