Страница 1 из 3

Скрипт контроля баланса для chan_dongle

Добавлено: 12 май 2012, 22:56
SolarW
Домашняя страница

Изображение

Тема для обсуждения функционала и объявлений об обновлениях.

12.05.2012
siv237 писал(а):Обновил скрипт, теперь он умеет автоматически отключать модемы с низким балансом.

Re: Скрипт контроля баланса для chan_dongle

Добавлено: 12 май 2012, 23:03
SolarW
Желающие я так понимаю могут min_bal не только глобально задавать а и для каждого канала отдельно

Код: Выделить всё

# Список модемов и соответствующих им типов ответов операторов 
# о состоянии баланса
# Последовательность заполнения:
# 1. Номер Dongle устройства, 2. Префикс строки разбора, 3. Номер симки
# 4. Имя оператора 5. USSD запрос баланса 6. Минимальный баланс при котором происходит отключение канала
# Внимание, пробелы в полях не допускаются
 
for opsos in \
"  000103    MTS2   +79140000001    МТС      *100#    50" \
"  000101    MTS    +79140000002    МТС      *100#    100" \
"  000106    MTS    +79140000003    МТС      *100#    70" \
"  000104    MGF    +79240000004    МЕГАФОН  *100#    20" \
"  000102    MGF    +79240000005    МЕГАФОН  *100#    30" \
"  000105    BEE    +79620000006    БИЛАЙН   *102#    50" \
"  000107    BEE    +79090000007    БИЛАЙН   *102#    80"
 
do
num=`echo $opsos | awk '{print $1}'`
oper=`echo $opsos | awk '{print $2}'`
numsim=`echo $opsos | awk '{print $3}'`
fovsim=`echo $opsos | awk '{print $4}'`
ussdzap=`echo $opsos | awk '{print $5}'`
min_bal=`echo $opsos | awk '{print $6}'`
Ну и чтобы уже в одной теме все было - настройки для украинских операторов

USSD-запросы

Код: Выделить всё

"  dongle1    KS     +380981234567    КИЕВСТАР      *111#"
"  dongle2    MTS    +380951234567    МТС           *110*10*01#"
"  dongle3    UTEL   +380911234567    Укртелеком    *100#"
"  dongle4    LF     +380931234567    Лайф          *111#"
Парсинг ответов

Код: Выделить всё

######## Варианты парсинга баланса для разных операторов #######################
# Результат разбора должен быть в виде:
# 28.04.2012 08:30:17;52.70;000101
################################################################################

# Оператор КИЕВСТАР
  if [ "${oper}" = "KS" ]
  then cat $opermsg | grep $num| grep USSD| grep 'Na rahunku'| sed -r 's/(: Na rahunku: | - | grn. )/;/g'| awk -F ";" '{print $1";"$4";"$3}' | tail -n $tn >>/tmp/tmpallbalans
  fi

# Оператор МТС
  if [ "${oper}" = "MTS" ]
  then cat $opermsg | grep $num| grep USSD| grep 'Na osobovomu rakhunku'| sed -r "s/(: Na osobovomu rakhunku | - |: avans |5 hrn.)/;/g"| awk -F ";" '{print $1";"$5";"$3}'| tail -n $tn >>/tmp/tmpallbalans
  fi

# Оператор Укртелеком
  if [ "${oper}" = "UTEL" ]
  then cat $opermsg | grep $num| grep USSD| grep 'Vash balans'| sed 's/,/./g'| sed "s/'//g"|sed -r "s/(: Vash balans:zagalnyi | - |; paketnyi )/;/g"| awk -F ";" '{print $1";"$4";"$3}'| tail -n $tn >>/tmp/tmpallbalans
  fi

# Оператор Лайф
  if [ "${oper}" = "LF" ]
  then cat $opermsg | grep $num| grep USSD| grep ': Balans'| sed 's/,/./g'| sed -r 's/(: Balans | - |hrn. )/;/g'| awk -F ";" '{print $1";"$4";"$3}' | tail -n $tn >>/tmp/tmpallbalans
  fi

################################################################################

Re: Скрипт контроля баланса для chan_dongle

Добавлено: 12 май 2012, 23:31
SolarW
Немного подумав.
Хотя конечно было бы хорошо изыскать способ не полностью вырубать канал при малом балансе а исключать его из исходящей маршрутизации - не знаю как в других местах а у нас входящие бесплатны.
Сходу мыслей как это сделать в системе под управлением FreePBX пока нет.

Re: Скрипт контроля баланса для chan_dongle

Добавлено: 13 май 2012, 01:22
SolarW
Нашел глючек.
Кусок диалплана

Код: Выделить всё

[from-gsm]
exten => ussd,1,Verbose(Incoming USSD: ${BASE64_DECODE(${USSD_BASE64})})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%d.%m.%Y %H:%M:%S)} - USSD - ${DONGLENAME}:${BASE64_DECODE(${USSD_BASE64})}' >> /var/www/msg)
exten => ussd,n,Hangup()
спотыкается на USSD ответах вида

Код: Выделить всё

50.01 UAH, dejstvitelen do 02.03.2013. Tarif - Super MTS bez PZS i popolneniy 0-25. * Euro-GOOD'OK 2012: zvoni 700!

Код: Выделить всё

Na rahunku: 58.96 grn. Info pro bonusy na *112# i *119#. Unikal'na BEZKOSHTOVNA muzyka na D-Jingle! Tel. 465

Код: Выделить всё

Vash balans:zagal'nyi 25,53; bonusnyi 0,00; dodatkovyi 0,00 hrn.Nomer diysnyi do 2012-09-22 23:59:59. Perevirka dodatkovykh poslug *121#
Все ломает одинарная кавычка внутри ответа которую вставляют в транслит вместо мягкого знака.
Как бы ее заэкранировать?

Обновлено: заменил в диалплане одинарную кавычку на двойную и все заработало.

Re: Скрипт контроля баланса для chan_dongle

Добавлено: 13 май 2012, 08:01
Vlad1983
отключать исходящие можно через проверку переменной, хранимой в AstDB, которую выставлять на основе данных о балансе.

Re: Скрипт контроля баланса для chan_dongle

Добавлено: 13 май 2012, 17:29
siv237
Есть мысль сделать отключение исходящих при достижении модемом предельного количества минут в день. Например у многих операторов есть льготное число минут за которые баланс не снимается. После достижения предела минуты становятся платными. Если модемов несколько, можно экономить переключая на следующий модем в цепочке.
Есть ли идеи как сделать? Пока мысль такая, брать из основной базы cdr записей инфу по числу минут на интересующем модеме за период с начала дня и если порог превышен, отключать модем.

Re: Скрипт контроля баланса для chan_dongle

Добавлено: 13 май 2012, 17:35
siv237
Vlad1983 писал(а):отключать исходящие можно через проверку переменной, хранимой в AstDB, которую выставлять на основе данных о балансе.
Для чистого астериска можно добавить agi скрипт проверяющий баланс и устанавливающий канал в режим занят при исходящем звонке для перехода к следущему свободному. Тогда входящие будут идти независимо от состояния баланса. Но беда в том, что при настройке через FreePBX канал chan_dongle прописан customtran-ком и вписаться в диалплан между вызовом из кустомтранка и драйвером канала уже негде. Нет контекста или я не понял где его искать.
Можно поподробнее по вашему предложению?

Re: Скрипт контроля баланса для chan_dongle

Добавлено: 13 май 2012, 18:16
Vlad1983
сведения о затраченых минутах или балансе берите откуда хотите и засовываем в AstDB так

Код: Выделить всё

asterisk -rx 'database put TRUNKLIMIT gsm0 1200'
asterisk -rx 'database put TRUNKLIMIT gsm1 1210'
делал для шлюзов для обеспечения равномерной нагрузки на симки и отключения при привышении месячного лимита (пример для двухсимок)
под модемы точите сами

Код: Выделить всё

[outbound-allroutes-custom]
...
exten => _7XXXXXXXXXX,1,GoSub(sub-outbound,${EXTEN},gsm)
exten => _7XXXXXXXXXX,n,GoSub(sub-outbound,${EXTEN},sipnetmsk) ;резерв
...

[sub-outbound]
...
exten => _X.,n(gsm),ExecIf($[ ${DB(TRUNKLIMIT/gsm0)} > 3000 ]?Return()) ; на симках одинаковый лимит 3000 минут.
exten => _X.,n,ExecIf($[ ${DB(TRUNKLIMIT/gsm1)} > 3000 ]?Return())      ; распределение нагрузки нормальное поэтому выходим сразу
exten => _X.,n,GotoIf($[ ${DB(TRUNKLIMIT/gsm0)} > ${DB(TRUNKLIMIT/gsm1)} ]?gsm1:gsm0)
exten => _X.,n(gsm0),Macro(record-enable,${AMPUSER},OUT)
exten => _X.,n,Set(CDR(to)=gsm0)
exten => _X.,n,Dial(SIP/gsm/10${EXTEN},60,TX)
exten => _X.,n,StopMixMonitor()
exten => _X.,n,Macro(record-enable,${AMPUSER},OUT)
exten => _X.,n,Set(CDR(to)=gsm1)
exten => _X.,n,Dial(SIP/gsm/11${EXTEN},60,TX)
exten => _X.,n,StopMixMonitor()
exten => _X.,n,Return()
exten => _X.,n(gsm1),Macro(record-enable,${AMPUSER},OUT)
exten => _X.,n,Set(CDR(to)=gsm1)
exten => _X.,n,Dial(SIP/gsm/11${EXTEN},60,TX)
exten => _X.,n,StopMixMonitor()
exten => _X.,n,Macro(record-enable,${AMPUSER},OUT)
exten => _X.,n,Set(CDR(to)=gsm0)
exten => _X.,n,Dial(SIP/gsm/10${EXTEN},60,TX)
exten => _X.,n,StopMixMonitor()
exten => _X.,n,Return()
...

Re: Скрипт контроля баланса для chan_dongle

Добавлено: 13 май 2012, 21:58
SolarW
Насчет порядка использования транков в зависимости от потраченных минут попадался вот такой, более года назад заброшенный модуль для FreePBX - Trunk Cost / Load Balancing
Поставить / освоить руки если честно не доходили.

Re: Скрипт контроля баланса для chan_dongle

Добавлено: 14 май 2012, 05:13
siv237
Vlad1983 писал(а):сведения о затраченых минутах или балансе берите откуда хотите и засовываем в AstDB так

Код: Выделить всё

asterisk -rx 'database put TRUNKLIMIT gsm0 1200'
asterisk -rx 'database put TRUNKLIMIT gsm1 1210'
делал для шлюзов для обеспечения равномерной нагрузки на симки и отключения при привышении месячного лимита (пример для двухсимок)
под модемы точите сами

Код: Выделить всё

[outbound-allroutes-custom]
...
exten => _7XXXXXXXXXX,1,GoSub(sub-outbound,${EXTEN},gsm)
exten => _7XXXXXXXXXX,n,GoSub(sub-outbound,${EXTEN},sipnetmsk) ;резерв
...
...
К сожалении проблема с free-pbx в том, что нет возможности встроиться в диалплан на этапе набора номера и соответственно отработать кустом контекст не получится.
Вот если есть мысли, как привязать custom trunk к конкретному контексту не потеряв интерактивность настройки исходящей маршрутизации в freepbx из webgui, а уж дальше логику можно любую выстраивать.