Просмотр Исходного

{toc:maxLevel=2}

h1. Назначение скриптов hooks

Скрипты *hooks* позволяют выполнять какие-либо действия при запуске и остановке служб (демонов в терминологии Unix).
Например, таким образом можно добавить собственные правила IPTABLES.

h1. Добавление правил

Скрипт *hooks* написан на языке Bash. Изменения вносятся в середину скрипта, первую и последнюю строки оставьте неизменными. В общем виде скрипт должен выглядеть так:

{code}
#!/bin/bash


if [ "$1" = 'Имя_службы' -a "$2" = 'Параметр' ]; then

#Ваши изменения здесь

fi

exit 0
{code}
Первый параметр - служба, второй 'start' или 'stop', третий параметр - код возврата от службы.

Например, разрешим доступ на порты пассивного режима ftp-сервера биллинга:
{code}
#!/bin/bash

if [ "$1" = "/etc/init.d/firewall" -a "$2" = start ]; then

iptables -I asr_billing_input -p tcp --destination-port 10090:10100 -j ACCEPT

fi
exit 0
{code}

После редактирования скрипта нужно перезапустить соответствующий контейнер:

Например:
{code}/app/asr_billing/service restart{code}

h2. Что для чего

{Warning}
При изменении кастомных цепочек *asr_billing*_input правила необходимо добавлять в hook контейнера *asr_billing*, если цепочка *asr_cabinet*_input - добавлять в hooks *asr_cabinet* и т.п. Изменение *базовых * цепочек (INPUT,OUTPUT,PREROUTING и т.д.) гарантированно нарушит связь контейнеров, а следовательно всей системы.
{Warning}

Необходимые правила IPTABLES и прочие действия необходимо описывать в хуках соответствующих [контейнеров|CarbonBaseSystem:Контейнеры с приложениями]

h3. auth
Базовый интерфейс авторизации в платформе, других функций нет.
Скрипт */app/base/cfg/hooks*
iptables-цепочки: *auth_input* и *auth_output*

h3. base
Отображает интерфейс перехода в другие контейнеры, к настройкам других контейнеров и настройки доступа к серверу в целом.
Скрипт */app/base/cfg/hooks*
iptables-цепочки: *base_input* и *base_output*
Обычно используется для предоставления доступа к к веб-интерфейсу управления, но правильнее использовать соответствующее поле в [веб-интерфейсе|http://docs.carbonsoft.ru/pages/viewpage.action?pageId=48693373]

h3. asr_billing
Управлениие абонентами и тарифами.
Скрипт /app/asr_billing/cfg/hooks
iptables-цепочки: asr_billing_input и asr_billing_output

h3. asr_cabinet
Содержит локальный сайт и личный кабинет.
Скрипт /app/asr_cabinet/cfg/hooks
iptables-цепочки: asr_cabinet_input и asr_cabinet_output
Обычно используется для предоставления доступа к локальному сайту и личному кабинету. По умолчанию доступ предоставлен всем.

h3. asr_fiscal
Содержит модули взаимодействия с платежными системами.
Скрипт /app/asr_fiscal/cfg/hooks
iptables-цепочки: *asr_fiscal_input* и *asr_fiscal_output*
Обычно используется для предоставления доступа платежных систем к биллингу, но правильнее использовать соответствующее поле в [веб-интерфейсе Шаг 4|http://docs.carbonsoft.ru/pages/viewpage.action?pageId=49087129]

h3. collector
Система сбора статистики (Netflow) и DHCP-сервер.
Скрипт /app/collector/cfg/hooks
iptables-цепочки: collector_input и collector_output

h3. monitoring
Система мониторинга Zabbix.
Скрипт /app/monitoring/cfg/hooks
iptables-цепочки: monitoring_input и monitoring_output
Обычно используется для предоставления доступа к ZABBIX.

h2. Использование скрипта hooks по расписанию

Ничто не мешает использовать hooks с помощью cron. Таким образом вы можете выполнять некие команды не при наступлении какого-то события, а в нужное вам время.

Для этого нужно использовать в качестве имени службы:

* cron.10min \- для того чтобы выполнять что-то каждые 10 минут
* cron.daily \- для того чтобы выполнять что-то каждый день
* cron.hourly \- для того чтобы выполнять что-то каждый час
* cron.monthly \- для того чтобы выполнять что-то каждый месяц
* cron.weekly \- для того чтобы выполнять что-то каждую неделю

Либо /etc/crontab, если вам нужно указать специфичное время, но в таком случае указать в вызове в качестве имени службы что-то уникальное, например

{code}
10 */2 * * *  root /cfg/hooks /etc/init.d/networkd start 1>/dev/null 2>/dev/null
{code}

h2. Отладка добавления правил IPTABLES
# Проверьте что правило добавляется из командной строки до того как добавлять его в скрипт hooks
# Если произошла ошибка добавления правила, информацию о ней можно попробовать найти в логе */var/log/messages* (или выполнив команду *dmesg*)

h1. При запуске системы, вижу ошибку выполнения скрипта, что делать?
Например:
{code}
[root@vm185-120 ~]# /app/xge/service start
/app/xge start
/cfg/hooks: line 8: syntax error near unexpected token `fi'
/cfg/hooks: line 8: `fi'

Ошибка 2 при запуске hook файла: /cfg/hooks /genconfig crond start
Необходимо исправить hook файл!

Копирую модули XGE
(pid 6001) is running...
Reloading Base Web Server: [ OK ]

# /app/xge/service start: [FAILED]
{code}
Попробуйте отладить скрипт, максимально его сократив, убрав все команды и операторы, добавляйте их постепенно. Например, у Вас есть скрипт:
{code}
#!/bin/bash
if [ "$1" = "/etc/init.d/firewall" -a "$2" = "start" ]; tnen

iptables -t nat -I xge_pre -d 10.0.0.2 -p tcp --dest-port 10000 -j DNAT --to-destination 10.100.0.11:10000

ip route add 10.0.0.2 dev Eeth2
ip route add 0/0 via 10.0.0.2

fi
exit 0
{code}
Сделайте следующее:
{info}Не обязательно постоянно для проверки перезапускать контейнер командой _/app/<app>/service restart_, можно передать параметры напрямую скрипту:
{code}bash -x /app/xge/cfg/hooks /etc/init.d/firewall start{code}{info}
*bash -x* - это выполнение скрипта с отладкой.
# Попробуйте удалить все строки в условии и оставьте там пустой оператор, приведите скрипт к такому виду:
{code}#!/bin/bash
if [ "$1" = "/etc/init.d/firewall" -a "$2" = "start" ]; tnen

:

fi
exit 0{code}
Данный пример все равно завершится ошибкой, в скрипте опечатка: вместо "*t{color:blue}h{color}en*" написано "*t{color:red}n{color}en*"
# Когда разобрались с синтаксисом, возвращайте все что было в условии постепенно, начните с правила iptables:
{code}#!/bin/bash
if [ "$1" = "/etc/init.d/firewall" -a "$2" = "start" ]; tnen

iptables -t nat -I xge_pre -d 10.0.0.2 -p tcp --dest-port 10000 -j DNAT --to-destination 10.100.0.11:10000

fi
exit 0{code}
Скрипт так же завершитсяс ошибкой. Вы выоде скрипта мы увидем что она заключается в некорректном формировании правила:
{code}# /app/xge/cfg/hooks /etc/init.d/firewall start
iptables v1.4.7: unknown option `--dest-port'
Try `iptables -h' or 'iptables --help' for more information.{code}
После изучения документации по фаерволу "*\-\-d{color:red}est-{color}port*" заменили на "*--dport*" и команда выполнилась успешно.
# Далее вернули настройку маррутизации и снова попроловали выполнить:
{code:title=Скрипт}#!/bin/bash
if [ "$1" = "/etc/init.d/firewall" -a "$2" = "start" ]; then

iptables -t nat -I xge_pre -d 10.0.0.2 -p tcp --dport 10000 -j DNAT --to-destination 10.100.0.11:10000

ip route add 10.0.0.2 dev Eeth2
ip route add 0/0 via 10.0.0.2

fi
exit 0{code}
{code:title=Результат выполнения}# /app/xge/cfg/hooks /etc/init.d/firewall start
Cannot find device "Eeth2"
RTNETLINK answers: File exists{code}
Мы получили ошибку того что устройство "Eeth2" не найдено. Все верно - у нас нет устройства с таким именем. Проверив настройки сети имена интерфейсов приходим к выводу что настроить нужно интерфейс eth2:
было "*ip route add 10.0.0.2 dev {color:red}E{color}eth2*", стало "*ip route add 10.0.0.2 dev eth2*"
# Выполняем исправленный скрипт
{code:title=Скрипт}#!/bin/bash
if [ "$1" = "/etc/init.d/firewall" -a "$2" = "start" ]; then

iptables -t nat -I xge_pre -d 10.0.0.2 -p tcp --dport 10000 -j DNAT --to-destination 10.100.0.11:10000

ip route add 10.0.0.2 dev eth2
ip route add 0/0 via 10.0.0.2

fi
exit 0{code}
{code:title=Результат выполнения}# /app/xge/cfg/hooks /etc/init.d/firewall start
RTNETLINK answers: File exists
{code}
Воспользовавшись [поиском Google|https://www.google.com/search?client=ubuntu&channel=fs&q=RTNETLINK+answers%3A+File+exists&ie=utf-8&oe=utf-8] можно найти информацию по ошибке.
Так же можно выполнить скрипт с повышенным логированием:
{code}# bash -x /app/xge/cfg/hooks /etc/init.d/firewall start
+ '[' /etc/init.d/firewall = /etc/init.d/firewall -a start = start ']'
+ iptables -t nat -I xge_pre -d 10.0.0.2 -p tcp --dport 10000 -j DNAT --to-destination 10.100.0.11:10000
+ ip route add 10.0.0.2 dev eth2
RTNETLINK answers: File exists
+ ip route add 0/0 via 10.0.0.2
RTNETLINK answers: File exists
+ exit 0{code}
Теперь ошибка повторяется дважды.
В данно случае проблемы не было: ядро по-сути сообщало что такое правило уже существует, первый раз так как команда "ip route add 0/0 via 10.0.0.2" все-таки выполнилась на одной из предыдущих итераций; второй раз - так как на предпоследней интерации проверки выполнилась и команда "ip route add 10.0.0.2 dev eth2"

Надеемся это поможем Вам отлаживать скрипты запуска. Общий принцип - если сразу не понятно где ошибка, максимально сократите и полняйте постепенно исправляя ошибки и добавляя слеующие пункты конечного скрипта.