Iaxmodem, hylafax и LDAP

Во многих случаях Asterisk используется для расширения функционала существующей системы связи, например, для экономии на междугородных разговорах, организации аудио конференций или в роли call центра. Операционная система Windows чрезвычайно распространена в нашей стране, у многих администраторов возникает вопрос интеграции Asterisk со службой каталогов Active Directory. Рассмотрим работу с LDAP на примере факс-сервера.

Подключение оборудования

В самом простом случае задача факс-сервера сводится к приему сообщения в сетевой каталог в виде файла формата PDF или TIFF, однако намного удобнее, если принимаемые факсы попадали бы персонально в электронный почтовый ящик пользователя. Рассмотрим типичную схему подключения Asterisk в большой компании:

В этой схеме все звонки пользователей по потоку Е1 пропускаются через сервер. Такой подход наиболее выгоден из-за низкой стоимости платы на два потока для Asterisk и дает наибольшее преимуществ благодаря цифровой передачи голоса, номеров и имен (в случае QSIG).

При разговоре с внешним абонентом, пользователь в любом случае будет соединен через сервер, однако последний в большинстве случаев не может быть уверен, с каким именно внутренним пользователем установлено соединение. Прием факса возможен только на общий почтовый ящик. Чтобы принять факс на персональный ящик, пользователь должен каким-то образом сообщить серверу о себе. Оптимальный способ – перевести звонок на специальный номер в АТС, которая переведет его на номер факс-сервера. Так как соединение АТС и Asterisk осуществлено по цифровому потоку, то передастся и номер переводящего.

Общение с Active Directory

По номеру переводящего в Active Directory можно найти адрес почтового ящика пользователя. Для Asterisk есть функция LDAPget, но нам не удалось заставить работать ее с версией 1.6.0.9, поэтому решено было реализовать ее самостоятельно с помощью phpAGI. Язык PHP хорош тем, что в его составе имеется очень много функций для работы со всевозможными протоколами, в том числе и с LDAP. Вариант phpAGI скрипта для запроса параметров в ctive Directory в процессе вызова:

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]);
 
 ?>

Этот скрипт может возвращать любые данные о пользователе, которые имеются в AD, необходимо только вписать правильные имя пользователя, пароль и имя контроллера домена. Возможно придется изменить фильтр запроса, для этого следует изучить схему AD.

Обработка вызова

Для приема факса нужно настроить диалплан так, чтобы переведенный с АТС вызов попадал в такой макрос:

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});

В нашем случае прием факса осуществляется с помощью связки iaxmodem+hylafax, однако hylafax имеет собственный механизм рассылки факсов, который нам, по сути, ни к чему. Проблема усугубляется тем, что hylafax принимает факсы в каталог /var/spool/hylafax/recvq и имя факса никак не отражает его связь с каким либо вызовом. Однако широкие возможности в маршрутизации факсовых сообщений с помощью файла FaxDispatch позволят переименовывать файлы так, как нужно:

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

Этот скрипт запускается после приема факса, и, так как мы присваиваем в качестве имени отправителя переменную ${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 Яндекс.Метрика