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

Прошлая схема с event_inc.sh выносила наружу слишком много нюансов по настройке, которые могли сказаться на дальнейшей стабильности работы схемы интеграции. В новой версии мы старались максимально скрыть нюансы работы системы.

h2. План интеграции:


h3.

*Шаг 1.* Обновить биллинг до последней версии. (схема будет налаживаться и становиться стабильнее в каждой версии, так что лучше скачивать последнюю доступную версию)

*Шаг 2.* Создать и настроить nas в менеджере 4го биллинга. Не забудьте указать имя скрипта событий (желательно, чтобы имя не пересекалось с уже существующими файлами в каталоге /var/lib/event/). Для каждого типа NAS (а иногда и для каждого NAS в принципе) нужно использовать своё имя скрипта.

*Шаг 3.* Пример работы скрипта вы можете посмотреть по пути /var/lib/event/example/xge_router.sh. Только команды для отправки на ваше оборудование нужно будет использовать свои команды.  

*Шаг 4.* Создать файл обработчик для вашего типа оборудования в каталоге /var/lib/event. Прописать управляющие команды по состояниям абонента (список состояний ниже). Добавить имя скрипта в настройках NAS в менеджере.

*Шаг 5.* Если до этого вы использовали свой скрипт отправки команд /var/lib/event/event_inc.sh, то его нужно забекапить и вместо него использовать скрипт *event_inc.sh*, текст которого описан в примере ниже.

\* На типе подписки SLA Аутсорсинг специалисты технической поддержки могут настроить оборудование. В наличии схемы для MikroTik, Redback, Cisco. И создать скрипты отказоустойчивости и полной ежедневной синхронизации.


h2. Список состояний абонента

user_add() - добавление нового абонента. Проходит при создании/изменении абонента в биллинге;
user_del() - удаление/изменение абонента в биллинге;
user_accept() - разрешение доступа в интернет (когда абонент не заблокирован и состояние "Все параметры заданы верно");
user_drop() - запрещение доступа в интернет (удаление с оборудования);
user_redirect() - переадресация на страницу заглушку при отрицательном балансе. Если редирект не используется нужно блокировать абонента;
user_redirect_cancel() - отмена переадресации на страницу заглушку при отрицательном балансе или отмена блокировки;
user_rate_set() - установка скорости абоненту из правил тарифа;
user_disconnect() - ручное отключение абонента из менеджера.

Все состояния системой вызываются группами, например при переходе абонента в отрицательный баланс проходят состояния:
- user_accept
- user_redirect
- user_rate_set

При переходе обратно в положительный баланс:
- user_accept
- user_redirect_cancel
- user_rate_set

*Логи отправки событий можно смотреть здесь: /var/log/eventd.log*
h2. event_inc.sh
{code}
LOG_LEVEL=ALL

SENDER=$1; shift
EVENT=$1; shift
DATA=$@

for VAR in $DATA; do
[[ "$VAR" = *"="* ]] && eval ${VAR%%=*}=\'${VAR#*=}\'
done

LOG INFO "$SENDER $EVENT $DATA"

user_refresh(){
accept=1
[ "$logged" = "-1" ] && accept=0
[ "$enabled" = "0" ] && accept=0
[ "$deleted" = "1" ] && accept=0
[ "$own_disabled_end" != -1 ] && accept=0
redirect=0
[ "$over_limit" = "1" ] && redirect=1

[ "$accept" = "1" ] && user_accept
[ "$redirect" = "0" ] && user_redirect_cancel
[ "$redirect" = "1" ] && user_redirect
[ "$accept" = "0" ] && user_drop
}

user_data_changed(){
if [ -f /var/lib/event/before/$id.before ]; then
changed=0
for VAR in $(</var/lib/event/before/$id.before); do
[[ "$VAR" = *"="* ]] && eval ${VAR%%=*}=\'${VAR#*=}\'
done
for val in ip mac server enabled deleted auth_type nas_ip router_ip router_vlan router_port opt82 limit_ip acl; do
old_val="old_$val"
[ "${!val}" != "${!old_val}" ] && changed=1;
done
else
changed=1
fi

if [ "$changed" = "1" ]; then
(
DATA_BEFORE=$(</var/lib/event/before/$id.before)
DATA_BEFORE="${DATA_BEFORE// old_/ }"
DATA=$DATA_BEFORE
for VAR in $DATA_BEFORE; do
[[ "$VAR" = *"="* ]] && eval ${VAR%%=*}=\'${VAR#*=}\'
done
user_del
)
user_del
user_add
user_refresh
user_rate_set
fi
}


if [ -f /var/lib/event/$script_name ]; then
source /var/lib/event/$script_name
if [ "$EVENT" = "rate_set" ]; then
user_rate_set
elif [ "$EVENT" = "user_disconnect" ]; then
user_disconnect
elif [ "$EVENT" = "user_add" ]; then
user_add
user_refresh
elif [ "$EVENT" = "user_del" ]; then
user_del
elif [ "$EVENT" = "user_data_changed_before" ]; then
echo "${DATA// / old_}" >/var/lib/event/before/$id.before
elif [ "$EVENT" = "user_data_changed" ]; then
user_data_changed
else
user_refresh
fi
else
echo "NO SCRIPT FOUND!!!"
fi
{code}

h2. Пример скрипта отправки команд на NAS
{code}
#!/bin/bash

trap __exit EXIT

TMPDIR=/tmp/${0##*/}
mkdir -p $TMPDIR

__exit() {
local ret=$?
rm -f $TMPDIR/*.$$
return $ret
}

# set -eux

burst_in=''
burst_out=''
ceil_in=${ceil_in:-1000}
rate_in=${rate_in:-1000}
ceil_out=${ceil_out:-1000}
rate_out=${rate_out:-1000}

__xge_coa_send() {
echo "Filter-Id=\"$@\"" | radclient -x $nas_ip coa $coa_psw &>$TMPDIR/radclient.$$
ret=$?
# exit 254 отложить передачу, todo возможно и другие схожие busy context и тд
grep "no response from server" $TMPDIR/radclient.$$ && exit 254
cat $TMPDIR/radclient.$$
return $ret
}

user_add() {
[ "$auth_type" = "1" ] && __xge_coa_send session $ip start IPOE
}

user_del() {
__xge_coa_send session $ip stop "user_del"
__xge_coa_send session $ip remove
}

user_accept() {
[ "$auth_type" = "1" ] && __xge_coa_send session $ip start IPOE
__xge_coa_send session $ip redirect blocked cancel
__xge_coa_send session $ip nat $snatip
}

user_drop() {
__xge_coa_send session $ip redirect blocked
}

user_redirect() {
__xge_coa_send session $ip redirect negbal
}

user_redirect_cancel() {
__xge_coa_send session $ip redirect negbal cancel
}

user_rate_set() {
__xge_coa_send session $ip rate set in $rate_in $ceil_in $burst_in out $rate_out $ceil_out $burst_out

}

user_rate_set_cancel() {
__xge_coa_send session $ip rate remove
}

user_disconnect() {
__xge_coa_send session $ip disconnect
}

{code}