Реализация работы с факсами в asterisk
Появилась необходимость настроить прием и отправку факсов на asterisk. По техническому заданию прием и отправка факсов должны происходить с участием операторов и возможностью предварительного разговора.
В интернете нашел примеры реализации, но в них как правило:
1) была автоматическая отправка факсов на определенный номер без предварительного разговора с оператором;
2) использовались различные связки iaxmodem либо t38modem + hylafax, в которых на мой взгляд особой надобности в данном случае нет. Asterisk умеет работать с факсами через SpanDSP (должен быть собран с поддержкой SpanDSP).
В итоге все свелось к следующему:
1) любой оператор компании должен иметь функционал для приема и отправки факсов со своего рабочего места, пользуясь ПК и телефоном;
2) для приема факса необходимо перевести вызов на номер 5555. Система должна преобразовать полученный документ из tiff в pdf, выложить в общую папку FAX и продублировать на почтовый ящик секретаря.
3) при отправке факса должна быть возможность отправки любого электронного документа или документа на бумажном носителе (через сканер). Оператор вначале должен иметь возможность сообщить, кому и что за документ передает, потом так же, как и при приеме, перевести на определенный номер, соответствующий данному документу.
Asterisk установлен на сборке gentoo.
Чтобы избежать участия пользователя в переводе документа в формат tiff, было решено использовать сетевой виртуальный принтер cups-pdf.
Устанавливаем:
emerge -va cups-pdf
Чтобы выложить принтер и папку для полученных факсов в сеть используем пакет samba
emerge -va samba
У меня он уже установлен net-fs/samba-3.6.12
Также необходим пакет cups и собственно samba должна быть собрана с поддержкой этого пакета. Установим наш виртуальный принтер через веб интерфейс сервиса cups, назовем его fax.
Расшариваем принтер, добавив следующие строчки в /etc/samba/smb.conf
[global] printing = cups printcap name = /etc/printcap [fax] comment = Факс public = yes printable = yes writable = yes create mode = 0666
На операторских компьютерах установлена Windows 7. Сетевой принтер устанавливается, как обычно только запросит драйвер, я выбрал HP LaserJet 2300 Series PS (должен подойти любой PostScript драйвер)
При печати на данный принтер сам документ должен попадать на принтер в пригодном формате, а пользователь должен получить четырехзначный номер при переводе, на который произойдет передача этого документа.
Для начала посмотрим настройки этого виртуального принтера nano /etc/cups/cups-pdf.conf
И изменим следующие настройки:
Out /var/spool/cups-pdf # папка куда сохраняются документы AnonDirName /var/spool/cups-pdf Spool /var/spool/cups-pdf TitlePref 1 # нужно для представлении имени файла UserUMask 0000 # маска для создаваемых файлов PostProcessing /opt/pdf_to_tiff # скрипт запускаемый после создания pdf файла DecodeHexStrings 1 # нужно для представлении имени файла
Скрипт /opt/pdf_to_tiff считывает текущее значение ext_num (четырехзначный номер факса) прибавляет единичку и переносит pdf файл в папку /usr/dumps под именем ext_num.
Далее преобразует файл в формат tiff и отправляет пользователю, который отправил документ письмо с четырехзначным номером на почту.
Cups-pdf будет запускать /opt/pdf_to_tiff с двумя параметрами:
имя файла — $ARGV[0]
имя пользователя — $ARGV[1]
В организации домен (samba-3.6) и почтовые ящики (корпоративная почта на postfix) соответствуют именам пользователей (кое-где пришлось добавить пару почтовых алиасов).
Сам скрипт:
srv d # cat /opt/pdf_to_tiff
#!/usr/bin/perl -w use strict; use File::Copy; # Устанавливаем путь по умолчанию $ENV{PATH} = '/bin:/usr/bin:/sbin:/usr/sbin'; # Отладка my $debug=0; # Делаем корень текущим каталогом chdir '/'; my $ext=" "; my $num=0; open(ext_num,"/opt/ext_num"); $ext=<ext_num>; $num=int($ext); close(ext_num); if ($num > 499) { $num=1; } else { $num=$num+1; } open(ext_num,">/opt/ext_num"); print ext_num "$numn"; close(ext_num); $num=$num+5000; move("$ARGV[0]","/usr/dumps/$num.pdf"); system("/usr/bin/gs -dSAFER -dBATCH -dQUIET -sDEVICE=tiffg3 -sPAPERSIZE=a4 -r204x196 -dNOPAUSE -sOutputFile=/usr/dumps/$num.tiff /usr/dumps/$num.pdf"); chmod(0644,"/usr/dumps/$num.tiff"); system("/usr/bin/sendEmail -f asterisk_fax@name.ru -t $ARGV[1]@name.ru -u FAX -o message-charset=utf-8 -m Номер для перевода на факс:$num -s localhost");
Проверяем работу, отправив на печать какой либо документ (возможно придется создать и поправить права на доступ к папке /usr/dumps/)
Далее настраиваем Asterisk на прием и отправку факсов:
Главное отключить faxdetect:
/etc/asterisk/sip.conf
[general] faxdetect=no ;faxdetect=yes t38pt_udptl=no ;t38pt_udptl=yes
/etc/asterisk/extensions.conf
[internal] exten => 5555,1,NoOp(-------------------Call from ${CALLERID(number)} to ${EXTEN}------------------) same => n,Goto(fax-rx,receive,1) exten => _5[0-4]XX,1,NoOp(-------------------Call from ${CALLERID(number)} to ${EXTEN}------------------) same => n,Set(FAXFILENAME=${EXTEN}) same => n,Goto(fax-tx,send,1) [fax-rx] exten => receive,1,NoOP(------------------- FAX from ${CALLERID(number)} ------------------) same => n,Answer() same => n,Set(DT=${TIMESTAMP}-${CALLERIDNUM}-${UNIQUEID}) same => n,Set(FAXOPT(headerinfo)=Received by ${CALLERID(number)} ${STRFTIME(${EPOCH},,%Y-%m-%d %H-%M)}) same => n,Set(FAXOPT(localstationid)=Name) same => n,Set(FAXOPT(maxrate)=14400) same => n,Set(FAXOPT(minrate)=2400) same => n,NoOp(FAXOPT(ecm) : ${FAXOPT(ecm)}) same => n,NoOp(FAXOPT(headerinfo) : ${FAXOPT(headerinfo)}) same => n,NoOp(FAXOPT(localstationid) : ${FAXOPT(localstationid)}) same => n,NoOp(FAXOPT(maxrate) : ${FAXOPT(maxrate)}) same => n,NoOp(FAXOPT(minrate) : ${FAXOPT(minrate)}) same => n,NoOp(**** RECEIVING FAX : ${DT} ****) same => n,ReceiveFax(/var/spool/asterisk/fax/${FAXOPT(headerinfo)}.tif) same => n,System(/usr/bin/tiff2pdf "/var/spool/asterisk/fax/${FAXOPT(headerinfo)}.tif" -o "/var/spool/asterisk/fax/${FAXOPT(headerinfo)}.pdf") same => n,System(/bin/cp "/var/spool/asterisk/fax/${FAXOPT(headerinfo)}.pdf" /mnt/public/samba/public/FAX ) same => n,System(/usr/bin/sendEmail -f asterisk_fax@name.ru -t office@name.ru -u FAX -o message-charset=utf-8 -m Смотри вложение -s localhost -a "/var/spool/asterisk/fax/${FAXOPT(headerinfo)}.pdf") same => n,HangUp() [fax-tx] exten => send,1,NoOp(------------------- FAX from ${CALLERID(number)} ------------------) same => n,Wait(1) same => n,Set(DT=${TIMESTAMP}-${CALLERIDNUM}-${UNIQUEID}) same => n,Set(FAXOPT(headerinfo)=Received by ${CALLERID(number)} ${STRFTIME(${EPOCH},,%Y-%m-%d %H-%M)}) same => n,Set(FAXOPT(localstationid)=Name) same => n,Set(FAXOPT(maxrate)=14400) same => n,Set(FAXOPT(minrate)=2400) same => n,NoOp(FAXOPT(headerinfo) : ${FAXOPT(headerinfo)}) same => n,NoOp(FAXOPT(localstationid) : ${FAXOPT(localstationid)}) same => n,NoOp(FAXOPT(maxrate) : ${FAXOPT(maxrate)}) same => n,NoOp(FAXOPT(minrate) : ${FAXOPT(minrate)}) same => n,NoOp(**** RECEIVING FAX : ${DT} ****) same => n,SendFAX(/usr/dumps/${FAXFILENAME}.tiff,d) same => n,NoOp(${FAXSTATUS}) same => n,NoOp(number is ${CALLERID(number)}) same => n,System(/usr/bin/sendEmail -f asterisk_fax@name.ru -t office@name.ru -u 'Fax message Sent' -o message-charset=utf-8 -m 'Номер:${CALLERID(number)}nStatus:${FAXSTATUS}' -s localhost -l /var/log/fax.log) same => n,HangUp()
Вот и все. В итоге не нужен дополнительный софт и проще обучить операторов работе с факсами.