Пресретање кућног VPN-а помоћу systemd ExecCondition
Намерно прескакање и покварена припремна команда су различити исходи. Дефинишите излазне кодове помоћника, затим тестирајте прелаз између мрежа.
Ваш кућни VPN нема шта да ради када је лаптоп већ на тој мрежи. Примамљив кратак пут је припремна команда која излази са кодом различитим од нуле; то обара јединицу и чини сваку контролну таблу поквареном. systemd има директиву управо за овакав облик одлуке, и она одваја намерно прескакање од стварне грешке. Урадити то исправно углавном значи записати шта значи сваки излазни код.
Зашто неуспешан предуслов није прави облик
ExecStartPre третира ненулти излаз као неуспех при покретању, што је исправно за команду која припрема сервис. Његово коришћење као услова чини политичку одлуку неразлучном од покварене зависности. ExecCondition постоји да би јединица могла да одбије покретање без означавања као неуспешне.
Та разлика је важна у три сата ујутру, када нико не жели да анализира црвену јединицу која се понашала по дизајну. Неуспешна јединица такође скрива стварне кварове међу намернима.
Прво напишите уговор о излазним кодовима
Напишите уговор пре скрипте. Излаз са нулом значи настави, излаз са један значи прескочи преостале наредбе за покретање, а излаз са 255 значи да сам услов није могао да ради. Кодови између два и 254 обично такође значе прескакање, што је лако заборавити када помоћник врати случајан код грешке. Drop-in испод повезује помоћника са стварним именом јединице.
[Service]
ExecCondition=/usr/local/libexec/should-start-home-vpnПроверите ефективну јединицу на наслеђена SuccessExitStatus или stop-post подешавања пре него што претпоставите подразумевану семантику. Затим намерно тестирајте сваки од три исхода.
Мрежни наговештај није доказ локације
Доступна адреса рутера или познати MAC могу указати на исправну мрежу, и ниједно то не доказује. Друга мрежа може поново користити исту адресу, ARP подаци могу бити застарели, а идентификатори се могу имитирати. Третирајте проверу као оптимизацију усклађену са политиком, а не као резултат аутентификације.
Одлучите унапред шта значи неизвесност. Покретање VPN-а када нисте сигурни безбедно је за клијента који једноставно не би могао да се повеже; прескакање када нисте сигурни није безбедно. Ограничите проверу и читајте активни интерфејс уместо да претпостављате први на листи. Провера која се заглави гора је од оне која одговори не, јер јединица на њу чека.
Запишите те претпоставке поред датотеке јединице да би следећа особа знала у шта помоћник верује. Коментар на врху скрипте најјефтиније је место да их сачувате.
Рукујте прелазом између мрежа
Услов се извршава при покретању сервиса и не преоцењује се касније. Прескочена јединица остаје прескочена након што се лаптоп премести у кафић, а тунел који ради остаје подигнут након што се лаптоп врати кући. Повежите животни циклус промене мреже са одлуком о покретању и заустављању преко посебног механизма.
systemctl cat home-vpn.serviceТестирајте четири случаја: покретање код куће, покретање ван куће, проверу која не може да ради и прелаз између мрежа док је јединица активна. Држите разлог прескакања видљив у дневнику како намерна одлука никада не би изгледала као неуспех аутентификације. Референца сервиса документује семантику излаза и минималну верзију.