VPN на Mac при подигнување: launchd ја надгледува задачата, а не тунелот
Plist што го поминува lint не докажува ништо за акредитивите или подготвеноста. Усогласете ја задачата со нејзината сесија, држете го клиентот во преден план и тестирајте во тој контекст.
Задачата се извршува при најавување, дневникот покажува дека клиентот стартува, но тунелот никогаш не се подига. Или се подига и исчезнува неколку секунди подоцна. Во двата случаи списокот на својства веројатно бил во ред. launchd даде две ветувања кога ја прифати задачата: ќе надгледува процес и тој процес ќе продолжи да работи. На VPN му требаат двете, а исправна XML-датотека не дава ниту едно.
Валиден список на својства не е услуга што работи
plutil -lint ја проверува структурата. Не може да ви каже дали бинарната датотека постои, дали аргументите се поддржани од оваа верзија на клиентот или дали задачата стартува во контекст каде акредитивите се достапни. Тоа се семантички прашања и тие објаснуваат повеќето неуспеси што изгледаат како проблеми со launchd.
plutil -lint /Library/LaunchDaemons/com.example.vpn.plist
launchctl print system/com.example.vpn
Прочитајте го излезот од втората команда наместо да претпоставите дека задачата е вчитана. Таа го известува последниот излезен статус и дали услугата работи, што прави разлика помеѓу „никогаш не стартувала“ и „стартуваше и умре“ пред да го допрете профилот.
Агентите наследуваат корисничка сесија, демоните не
Документацијата на Apple за launchd ги одделува агентите по корисник од системските демони. Агентот работи во контекстот на најавениот корисник, со неговиот клучен синџир и околина. Демонот работи без таа сесија, а преместувањето на задачата во системски директориум не ги пресоздава интерактивните акредитиви на корисникот.
Токму оваа разлика го одредува дизајнот. Ако врската бара личност да се најави или да одобри MFA-поттик, поддржаната поставеност е задача во корисничката сесија што се извршува по најавувањето. Ако мора да работи без никој најавен, на клиентот му треба одобрен ненадгледан идентитет со сопствен процес за обновување и отповикување. Изборот на погрешен ред создава задача што стартува чисто и паѓа на првиот чекор за автентикација.
Не ја прикривајте разликата со лозинка во низата аргументи или со исклучување на проверките на сертификатите. Двете претвораат барање за автентикација во трајна тајна во читлива датотека, а второто значи дека тунелот автентицира сето она што ќе одговори.
Надгледувањето функционира само ако процесот остане напред
Клиент што сам се претвора во демон веднаш ја враќа контролата на launchd, а надгледувачот потоа гледа процес што веќе завршил. Тунелот може да е подигнат, но launchd смета дека задачата не успеала и неговата политика за рестартирање ќе направи нешто што не сте го сакале.
Користете го документираниот режим на преден план или услуга на клиентот. Ако производот има сопствена поддржана функција за стартување, таа функција веќе знае како да остане напред и како да предаде на мрежниот стек; прилагодената задача е посебен дизајн, а не негово подобрување.
Дајте ѝ на задачата единствена ознака, предвидената извршна датотека и намерна низа аргументи. Низата не е командна линија на shell, па цевките и пренасочувањата не работат таму, а однесувањето на наводниците е поинакво. Команда што успева во терминал на администратор е најмногу прелиминарна проверка.
Акредитивите мора да работат без поттик
Ненадгледаното работење го преместува проблемот со акредитивите наместо да го отстрани. Некој мора да го поседува идентитетот, да одлучи колку долго живее и да документира како се заменува. Сертификат без следење на рокот станува прекин со датум во календарот.
Држете ги тајните надвор од аргументите и надвор од стандардниот излез на задачата. Ако клиентот поддржува читање акредитив од заштитено складиште, користете го тој пат и проверете дали контекстот на извршување на задачата може да стигне до складиштето. Демон што работи како root обично не може да прочита ставка од најавниот клучен синџир, а тоа е вид детал што се појавува само во системски контекст.
Дефинирајте што значи подготвено, па тестирајте таму
Успешното стартување докажува дека процесот започнал. Тоа не докажува дека мрежата е подигната, дека портата го прифатила идентитетот или дека приватната апликација е достапна. Ако нешто друго зависи од тунелот, му треба сигнал за подготвеност што ја одразува врската, а не времето на стартување на задачата.
Обидите треба да бидат ограничени и треба да разликуваат отсутна мрежа од одбиен акредитив. Рестартирањето при секој неуспех не може да поправи истечен сертификат и создава дневник полн со идентични обиди што го крие вистинскиот.
Прифатете ја задачата во контекстот во кој навистина ќе работи: без мрежа при подигнување, нормална најава, будење од сон и контролирано запирање. Потоа запишете ги заедно ознаката на задачата, верзијата на клиентот и ревизијата на профилот, за следниот човек да наследи услуга што може да се припише, а не датотека што некогаш работела.