Различия

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

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

iaxmodem_hylafax_i_ldap [2013/11/20 12:27] (текущий)
Строка 1: Строка 1:
 +====== Iaxmodem, hylafax и LDAP ======
  
 +Во многих случаях Asterisk используется для расширения функционала существующей системы связи, например,​ для экономии на междугородных разговорах,​ организации аудио конференций или в роли call центра. Операционная система Windows чрезвычайно распространена в нашей стране,​ у многих администраторов возникает вопрос интеграции Asterisk со службой каталогов Active Directory. Рассмотрим работу с LDAP на примере факс-сервера.
 +===== Подключение оборудования =====
 +
 +В самом простом случае задача факс-сервера сводится к приему сообщения в сетевой каталог в виде файла формата PDF или TIFF, однако намного удобнее,​ если принимаемые факсы попадали бы персонально в электронный почтовый ящик пользователя. Рассмотрим типичную схему подключения Asterisk в большой компании:​
 +
 +{{:​asterisk:​46.png|}}
 +
 +В этой схеме все звонки пользователей по потоку Е1 пропускаются через сервер. Такой подход наиболее выгоден из-за низкой стоимости платы на два потока для Asterisk и дает наибольшее преимуществ благодаря цифровой передачи голоса,​ номеров и имен (в случае QSIG).
 +
 +При разговоре с внешним абонентом,​ пользователь в любом случае будет соединен через сервер,​ однако последний в большинстве случаев не может быть уверен,​ с каким именно внутренним пользователем установлено соединение. Прием факса возможен только на общий почтовый ящик. Чтобы принять факс на персональный ящик, пользователь должен каким-то образом сообщить серверу о себе. Оптимальный способ – перевести звонок на специальный номер в АТС, которая переведет его на номер факс-сервера. Так как соединение АТС и Asterisk осуществлено по цифровому потоку,​ то передастся и номер переводящего.
 +
 +===== Общение с Active Directory ===== 
 +
 +По номеру переводящего в Active Directory можно найти адрес почтового ящика пользователя. Для Asterisk есть функция LDAPget, но нам не удалось заставить работать ее с версией 1.6.0.9, поэтому решено было реализовать ее самостоятельно с помощью phpAGI. Язык PHP хорош тем, что в его составе имеется очень много функций для работы со всевозможными протоколами,​ в том числе и с LDAP. Вариант phpAGI скрипта для запроса параметров в ctive Directory в процессе вызова:​
 +<file php ldap-get.php>​
 + #​!/​usr/​bin/​php -q
 + <?​php
 + ///​var/​lib/​asterisk/​agi-bin/​ldap-get.php:​ LDAP query 
 +
 +
 +   ​$ldap_host = “ldap://​domain.controller.ru”; ​
 +   ​$ldap_port = “389”; ​
 +   ​$base_dn = “ou=CO,​dc=controller,​dc=ru”;​
 +   //​$justthese = array(‘ou’,​‘sn’,​‘givenName’,​‘mail’); ​
 +   ​$ldap_user =“controller\user”; ​
 +   ​$ldap_pass = “password”; ​
 +
 + ​include(“phpagi.php”);​
 +
 +$agi = new AGI;
 + //​первый параметр:​ номер телефона для поиска
 + if (!isset($argv[1])) {
 +        $agi->​verbose("​Missing phone number"​);​
 +        exit(1);
 + }
 + //​второй параметр:​ искомое значение
 + if (!isset($argv[2])) {
 +        $agi->​verbose("​Missing justthese type"​);​
 +        exit(1);
 + }
 + //​третий параметр:​ имя переменной для возврата результата
 + if (!isset($argv[3])) {
 +        $agi->​verbose("​Missing return var name"​);​
 +        exit(1);
 + }
 +
 + ​$number = $argv[1];
 + ​$justthese= array($argv[2]);​
 + ​$argvarname = $argv[3];
 +
 + // фильтр определяет типы объектов,​ по которым производится поиск
 + // возможно придется уточнить/​изменить фильтр в соответствии с вашей схемой AD 
 + ​$filter =  "( & (objectclass=person) (!(objectclass=computer)) ​
 +(!(userAccountControl=66050)) (!(description=hidden)) ​
 +(telephonenumber="​.$number."​))";​
 +
 +   ​$connect = ldap_connect( $ldap_host, $ldap_port); ​
 +   ​ldap_set_option($connect,​ LDAP_OPT_PROTOCOL_VERSION,​ 3); 
 +   ​$agi->​verbose("​LDAP connect: "​.$connect); ​
 +   ​ldap_set_option($connect,​ LDAP_OPT_REFERRALS,​ 0); 
 +   $bind = ldap_bind($connect,​ $ldap_user, $ldap_pass); ​
 +   ​$agi->​verbose("​LDAP bind: "​.$bind); ​
 +   $read = ldap_search($connect,​ $base_dn, $filter,​$justthese); ​
 +   ​$agi->​verbose("​LDAP query: "​.$read); ​
 +   $info = ldap_get_entries($connect,​ $read); ​
 +   ​$agi->​verbose("​LDAP result: "​.$info[0][$justthese[0]][0]);​
 +
 +  ldap_close($connect); ​
 +
 + ​$agi->​set_variable($argvarname,​ $info[0][$justthese[0]][0]);​
 +
 + ?> ​  
 +
 +</​file>​
 +
 +Этот скрипт может возвращать любые данные о пользователе,​ которые имеются в AD, необходимо только вписать правильные имя пользователя,​ пароль и имя контроллера домена. Возможно придется изменить фильтр запроса,​ для этого следует изучить схему AD.
 +
 +===== Обработка вызова =====
 +
 +Для приема факса нужно настроить диалплан так, чтобы переведенный с АТС вызов попадал в такой макрос:​
 +<file lua macro-fax-ldap.conf>​
 + ​[macro-fax-ldap]
 + exten => s,​1,​answer()
 + exten => s,​n(start),​Background(custom/​start-fax)
 + exten => s,​n,​AGI(ldap-get.php,​${CALLERID(num)},​mail,​faxemail)
 + exten => s,​n,​Set(faxemail=${IF($["​${faxemail}"​ = ""​]?​ ${FAX_RX_EMAIL}:​${faxemail})})
 + exten => s,​n,​Goto(in_fax,​1)
 +
 + exten => in_fax,​1,​StopPlayTones  ​
 + exten => in_fax,​n,​Set(FAXFILE=/​tmp/​${UNIQUEID}.tif)
 + exten => in_fax,​n,​set(__call-from=${CALLERID(number)})
 + exten => in_fax,​n,​set(CALLERID(number)=${UNIQUEID})
 + exten => in_fax,​n,​Dial(IAX2/​iaxmodem1/​${UNIQUEID})
 + exten => in_fax,​n,​Dial(IAX2/​iaxmodem2/​${UNIQUEID})
 + exten => in_fax,​n,​Dial(IAX2/​iaxmodem3/​${UNIQUEID})
 + exten => in_fax,​n,​Dial(IAX2/​iaxmodem4/​${UNIQUEID})
 + exten => in_fax,​n,​wait(3)
 + exten => in_fax,​n,​Hangup
 +
 + exten => h,​1,​system(/​var/​lib/​asterisk/​bin/​fax-process.pl --to ${faxemail} ​
 +--from ${FAX_RX_FROM} --subject "Fax from ${call-from} ${CALLERID(name)}" ​
 +--attachment ${CALLERID(number)}.pdf --type application/​pdf --file ${FAXFILE});​
 +</​file>​
 +
 +В нашем случае прием факса осуществляется с помощью связки iaxmodem+hylafax,​ однако hylafax имеет собственный механизм рассылки факсов,​ который нам, по сути, ни к чему. Проблема усугубляется тем, что hylafax принимает факсы в каталог /​var/​spool/​hylafax/​recvq и имя факса никак не отражает его связь с каким либо вызовом. Однако широкие возможности в маршрутизации факсовых сообщений с помощью файла FaxDispatch позволят переименовывать файлы так, как нужно:
 +<file bash FaxDispatch>​
 +## /​var/​spool/​hylafax/​etc/​FaxDispatch
 +TEMPLATE=en
 +SENDTO=FaxMaster;​ #​ by default email to FaxMaster
 +FILETYPE=pdf;​ #​ in PDF format
 +FOLDER="/​var/​spool/​hylafax/​recvq/"​
 +FULLPATH="​${FOLDER}${FILENAME}.tif"​
 +## переименовываем файлы и меняем права доступа
 +mv $FULLPATH /​tmp/​$CIDNUMBER.tif
 +chmod a+rw /​tmp/​$CIDNUMBER.tif ​   # all faxes received on ttyS14
 +</​file>​
 +
 +Этот скрипт запускается после приема факса, и, так как мы присваиваем в качестве имени отправителя переменную ${UNIQUEID},​ то имя файла однозначно определяет соответствие какому-либо вызову. После того, как факс принят и перемещен в каталог /tmp, скрипт fax-process.pl,​ запускаемый из asterisk, отправляет файл на почту абоненту.
iaxmodem_hylafax_i_ldap.txt · Последние изменения: 2013/11/20 12:27 (внешнее изменение)
GNU Free Documentation License 1.3
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Яндекс.Метрика