Apple-Icon

В Mac OS X задача добавления постоянных статических маршрутов оказалась нетривиальна. Гугление не дало желаемого результата, в результате чего пришлось включать голову и делать свой велосипед. Вполне возможно, что эту задачу можно решить проще, но у меня давно было желание разобраться с демонами и агентами OS X, так что воспользовался случаем и совместил интересное с полезным.

ТЗ: Прописать статические маршруты, автоматически подгружаемые при перезагрузке PC под управлением OS X.

В примере будет использована маршрутизация сети 172.1.0.0/22 на маршрутизатор 172.0.0.200.

1. Создаем Launch Daemon.

Launch Daemon загружается при загрузке ОС, Launch Agent при загрузке профиля. В целях безопасности OS X блокирует попытку запуска Launch Agent под root, а необходимая нам команда route add требует его привилегий. Конечно можно было бы поправить конфиг sudo, но в этом случае обновление системы может сломать реализуемую функциональность, так что было принято решение использовать именно Launch Daemon.

info: Все последующие операции выполняются в консоли.

Создадим и заполним конфиг нового Launch Daemon:

 
Как видно из конфига, мы будем запускать скрипт /usr/local/scripts/AddRoute.sh. Он будет исполняться от root.

2. Пишем скрипт.

 
Дадим скрипту доступ на исполнение:
 

Внимательно рассмотрим конструкцию:

Без нее скрипт может не работать, так как на момент его запуска сеть может еще не подняться. Apple рекомендует использовать отдельные инструменты для контроля сети, что усложнило бы реализацию, но в файле /etc/rc.common была найдена подходящая для таких случаев функция.

В итоге после запуска скрипта выполняется проверка доступности сети и, если она недоступна, повторение попытки через 5 секунд. Как только сеть появится, цикл завершится и выполнится команда:

Теперь достаточно перезагрузить машину и убедиться, что все работает как надо.
Проверить можно выполнив команду:

Вывод должен быть аналогичным:

 

На этом все, как всегда жду комментариев и предложений по улучшению!