Рубрики
MacOS

Выполнение произвольного скрипта при старте системы Mac OS X

Всем привет! У меня на работе давно есть потребность в статических маршрутах, отличных от маршрута по умолчанию. Но писать каждый раз в консоли sudo route add 10.1.1.1/24 192.168.24.222 после входа как-то напрягает, да и просто банально лень делать это каждый раз. В данном случае, прописывание маршрута — это частная задача. В общем случае это сводится к выполнению произвольного скрипта. Однако есть решение, пусть и не очень простое, но все-таки!

Для того, чтобы выполнить скрипт при старте системы Mac OS X, надо добавить еще один StartupItem. В системе есть 2 места, где они располагаются, это: /Library/StartupItems и /System/Library/StartupItems. Последнее лучше не трогать, потому что это вообще системная область и не надо туда лезть. Поэтому будем использовать /Library/StartupItems.

  1. Идем в /Library/StartupItems.
  2. Создаем там папку (в моем случае прописывания маршрутов, это будет addoute).
  3. Идем туда.
  4. Создаем там скрипт, который хотим выполнять. Он должен называться так же как и папка!
  5. Создаем файлик параметров StartupParameters.plist.
  6. Выставляем права на выполнение нашему скрипту.
  7. Перегружаем систему и убеждаемся, что все работает.

kostik@KOsTIK: ~> cd /Library/StartupItems/
kostik@KOsTIK: /Library/StartupItems> sudo mkdir addroute
kostik@KOsTIK: /Library/StartupItems> cd addroute/
kostik@KOsTIK: /Library/StartupItems/addroute> sudo vim addroute

# Вот мой скрипт для прописывания статического маршрута:
#!/bin/sh
# Setting up static routing tables for Mac OS X
. /etc/rc.common

syslogger ( ) {
   printf "%s\n" "$*" >> /var/log/system.log
}


StartService ()
{
   syslogger $(/bin/date) " : Adding static route to route table"
   syslogger $(sudo /sbin/route add 10.1.1.1/24 192.168.24.222)
   return 0
}

StopService ()
{
   syslogger $(/bin/date) ": Deleting static routes from routing table"
   syslogger $(sudo /sbin/route delete 10.1.1.1/24 192.168.24.222)
   return 0
}

RestartService ()
{
   StopService
   StartService
   return 0
}

RunService "$1"

EOF

kostik@KOsTIK: /Library/StartupItems/addroute> sudo vim StartupParameters.plist

# Вот содержание файлика параметров. Самое главное, чтобы в строчке Provides было прописано то же имя, что и название скрипта и название папки:
{
    Description = 'Add static routing tables';
    Provides = ('addroute');
    Requires = ('Network');
    OrderPreference = 'None';
}
EOF

kostik@KOsTIK: /Library/StartupItems/addroute> sudo chmod 755 addroute
kostik@KOsTIK: /Library/StartupItems/addroute> ll
total 24
-rw-r--r--  1 root  wheel   138B 16 янв 12:37 StartupParameters.plist
-rwxr-xr-x  1 root  wheel   585B 16 янв 12:09 addroute*

Вот собственно и все. Для того чтобы проверить, что все сделано правильно — совсем не обязательно перегружать комп. Можно попробовать запустить наш «сервис» ручками и убедиться что все отработало корректно.

kostik@KOsTIK: /Library/StartupItems/addroute> sudo SystemStarter start addroute

# И посмотрим что говорят логи:
kostik@KOsTIK: ~> tail -f /var/log/system.log

Jan 16 13:35:32 KOsTIK sudo[3244]: kostik : TTY=ttys002 ; PWD=/Library/StartupItems/addroute ; USER=root ; COMMAND=/sbin/SystemStarter start addroute
понедельник, 16 января 2012 г. 13:35:32 (MSK)  : Adding static route to route table
Jan 16 13:35:32 KOsTIK sudo[3247]: kostik : TTY=ttys002 ; PWD=/Library/StartupItems/addroute ; USER=root ; COMMAND=/sbin/route add 10.1.1.1/24 192.168.24.222
add net 10.1.1.1: gateway 192.168.24.222