Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
popytka_obojtis_bez_reguljarnyx_vyrazhenij_dlja_nomerov_telefonov_sobstvennogo_regiona [2013/11/18 13:15]
ansealk
popytka_obojtis_bez_reguljarnyx_vyrazhenij_dlja_nomerov_telefonov_sobstvennogo_regiona [2013/11/18 13:16] (текущий)
Строка 1: Строка 1:
 +====== Попытка обойтись без регулярных выражений для номеров телефонов собственного региона ======
  
 +В процессе администрирования Asterisk PBX рано или поздно возникает необходимость маршрутизации звонков по направлениям и чаще всего это: город, МН, внутризоновая связь, МГ. С первыми двумя все ясно. А вот последние два… Ну и что здесь сложного скажете Вы? Уже написан вагон и маленькая тележка статей и скриптов по поводу составления регулярных выражений по DEF и ABC кодам, но периодически приходится обновлять все эти регулярки. И тут возникла мысль, а можно ли это автоматизировать. К сожалению чего-то готового,​ а главное подходящего найти не удалось. Значит будем изобретать свой велосипед.
 +
 +Для этого нам необходимо выполнить следующее:​
 +  * Настроить соединение asterisk с базой данных
 +  * Создать и заполнить таблицу с DEF и ABC кодами региона
 +  * Описать функции дополнительные функции для asterisk
 +  * Написать контексты для необходимых нам направлений
 +
 +===== Настраиваем соединение asterisk с БД =====
 +Предполагаю,​ что у Вас уже установлена и настроена база данных. В связи с тем, что у меня задействован механизм realtime, который использует базу данных postgresql, все описанные дальнейшие действия будут справедливы для postgresql, для иных баз возможно потребуются незначительные изменения.
 +На сервере с asterisk устанавливаем unixodbc, а также драйвер postgresql для odbc со всеми зависимостями. Для Debian/​Ubuntu это делается командой:​
 +<code bash>
 +#apt-get install unixodbc odbc-postgresql
 +</​code>​
 +
 +Приводим файл описания odbc драйверов к следующему виду:
 +<file ini /​etc/​odbcini.ini>​
 +[PostgreSQL ANSI]
 +Description ​ = PostgreSQL ODBC driver (ANSI version)
 +Driver ​ = /​usr/​lib/​x86_64-linux-gnu/​odbc/​psqlodbca.so
 +Setup  = /​usr/​lib/​x86_64-linux-gnu/​odbc/​libodbcpsqlS.so
 +Debug  = 0
 +CommLog ​ = 1
 +UsageCount ​ = 1
 +
 +[PostgreSQL Unicode]
 +Description ​ = PostgreSQL ODBC driver (Unicode version)
 +Driver ​ = /​usr/​lib/​x86_64-linux-gnu/​odbc/​psqlodbcw.so
 +Setup  = /​usr/​lib/​x86_64-linux-gnu/​odbc/​libodbcpsqlS.so
 +Debug  = 0
 +CommLog ​ = 1
 +UsageCount ​ = 1
 +</​file>​
 +Для 32-битных систем путь к драйверам будет отличаться.
 +
 +Создаем соединение с предварительной созданной базой:
 +
 +<file ini /​etc/​odbc.ini>​
 +[config]
 +Description ​        = PostgreSQL connection to '​asterisk'​ database
 +Driver ​             = PostgreSQL ANSI
 +Database ​           = asterisk
 +Servername ​         = 192.168.204.167
 +UserName ​           = asterisk
 +Password ​           = Uidj$5tuYF
 +Port                = 5432
 +Protocol ​           = 9.1
 +KSQO                = No
 +ReadOnly ​           = No
 +RowVersioning ​      = No
 +ShowSystemTables ​   = No
 +ShowOidColumn ​      = No
 +FakeOidIndex ​       = No
 +ConnSettings ​       =
 +</​file>​
 +
 +Проверяем соединение с базой:
 +<code bash>
 +isql config
 +</​code>​
 +Если видим следующее приглашение:​
 +<​code>​
 ++---------------------------------------+
 +| Connected! ​                           |
 +|                                       |
 +| sql-statement ​                        |
 +| help [tablename] ​                     |
 +| quit                                  |
 +|                                       |
 ++---------------------------------------+
 +SQL> ​
 +</​code>​
 +значит у нас соединение работает нормально.
 +
 +Прописываем данное соединение в 
 +<file ini /​etc/​asterisk/​res_odbc.conf>​
 +[asterisk]
 +enabled => yes
 +dsn => config
 +username => asterisk
 +password => Uidj$5tuYF
 +pre-connect => yes
 +</​file>​
 +
 +===== Создать и заполнить таблицу с DEF и ABC кодами региона =====
 +На сервере баз создаем базу asterisk внутри,​ которой создаем примерно такую таблицу (указано минимально необходимое количество колонок):​
 +<code sql>
 +CREATE TABLE zones ( 
 +def smallint NOT NULL,
 +start integer NOT NULL,
 +finish integer NOT NULL) 
 +WITHOUT OIDS;
 +</​code>​
 +
 +Заполняем созданную таблицу запустив следующий скрипт:​
 +<file bash sync.sh>
 +#!/bin/bash
 +REGION='​татарстан'​
 +echo "COPY zones FROM stdin;"​ > zones.sql
 +
 +wget -q http://​www.rossvyaz.ru/​docs/​articles/​DEF-9x.html -O DEF-9x.html
 +cat DEF-9x.html|iconv -f cp1251 -t utf8|grep -i $REGION|awk '​{print($3"​\t"​$6"​\t"​$9)}'​ >> zones.sql
 +rm DEF-9x.html
 +
 +wget -q http://​rossvyaz.ru/​docs/​articles/​ABC-3x.html -O ABC-3x.html
 +cat ABC-3x.html |iconv -f cp1251 -t utf8|grep -i $REGION|awk '​{print($3"​\t"​$6"​\t"​$9)}'​ >> zones.sql
 +rm ABC-3x.html
 +
 +wget -q http://​rossvyaz.ru/​docs/​articles/​ABC-4x.html -O ABC-4x.html
 +cat ABC-4x.html |iconv -f cp1251 -t utf8|grep -i $REGION|awk '​{print($3"​\t"​$6"​\t"​$9)}'​ >> zones.sql
 +rm ABC-4x.html
 +
 +wget -q http://​rossvyaz.ru/​docs/​articles/​ABC-8x.html -O ABC-8x.html
 +cat ABC-8x.html |iconv -f cp1251 -t utf8|grep -i $REGION|awk '​{print($3"​\t"​$6"​\t"​$9)}'​ >> zones.sql
 +rm ABC-8x.html
 +
 +echo "​\."​ >> zones.sql
 +
 +psql -U asterisk -d asterisk -c '​DELETE FROM zones'
 +psql -U asterisk -d asterisk ​ -f zones.sql
 +
 +rm zones.sql
 +</​file>​
 +
 +===== Описать функции дополнительные функции для asterisk =====
 +Нам понадобится дополнительная функция,​ которую опишем в 
 +<file ini /​etc/​asterisk/​func_odbc.conf>​
 +[ZONES]
 +prefix=CHECK
 +dsn=asterisk
 +readhandle=asterisk
 +readsql=SELECT count(*) from zones where def='​${ARG1:​1:​3}'​ and start<​='​${ARG1:​4}'​ and finish>​='​${ARG1:​4}'​
 +</​file>​
 +
 +===== Написать контексты для необходимых нам направлений =====
 +Заключительный шаг: описать контексты. ​
 +
 +Первый контекст для абонентов,​ которым разрешены только внутризоновые звонки:​
 +<code ini>
 +[zones]
 +include => template
 +</​code>​
 +
 +Второй для тех кому разрешены междугородние звонки:​
 +<code ini>
 +[meggorod]
 +include => template
 +</​code>​
 +
 +Да, они одинаковые:​
 +<code lua>
 +[template]
 +exten => _8XXXXXXXXXX,​1,​GotoIf($["​${CHECK_ZONES(${EXTEN})}"​ = "​1"​]?​4)
 + same => 2,​GotoIf($["​${CONTEXT}"​ = "​meggorod"​]?​6:​error,​1)
 + same => 3,Hangup()
 + same => 4,​Dial(SIP/​prov1/​${EXTEN},​30,​tTS(3600)gxX)
 + same => 5,Hangup()
 + same => 6,​Dial(SIP/​prov2/​${EXTEN},​30,​tTS(3600)gxX)
 +exten => error,​1,​Playback(an-error-has-occured)
 +exten => error,​n,​Hangup()
 +</​code>​
 +
 +Ну вот вроде бы и все. Вариант далек от идеала,​ но он работает.
popytka_obojtis_bez_reguljarnyx_vyrazhenij_dlja_nomerov_telefonov_sobstvennogo_regiona.txt · Последние изменения: 2013/11/18 13:16 (внешнее изменение)
GNU Free Documentation License 1.3
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Яндекс.Метрика