Факсы. Оно ещё шевелится.

Posted: 2015-01-29 in IT
Метки:

Приветствую своих постоянных читателей и тех, кто сюда зашёл случайно.
Немного расскажу о том, какой фигнёй иногда приходится маяться, чтобы сделать клиентам хорошо.

Год назад я писал о том, почему факс — полуживое зомби, и почему эту нечисть пора бы развоплотить.
В той заметке я немного рассказал в общих чертах, какая магия делает возможным прохождение сигналов факсового модема через воип-стыки и сколько проблем это порождает. Как я и предположил год назад, число воип-стыков стремительно растёт, и количество проблем с факсами тоже заметно выросло.
Самая засада — когда проблема наблюдается не при исходящем звонке (где вы можете с помощью диалплана и костылей хоть как-то бороться), а при входящем, когда вам остаётся только взывать к ЛММ благоразумию вышележащих аплинков и искать траблы уже совместно с ними, например, пытаясь выяснить, почему из всего множества компаний только от одной не приходят входящие факсы. Естественно, владение Wireshark-ом требуется достаточно искусное, да и тестовых вызовов и дампов надо делать много.

И как назло, у нас в офисе помер последний из могикан железный факс. Впрочем, учитывая неудобство этой шайтан-машины и крайне скудную диагностику, было решено собрать ещё более зверское решение для тестов.

Поскольку факс — технология некрофилическая, то и технику я буду использовать соответствующую, аутентичности ради =)
Итак, берём старый комп — Celeron 433 MHz (Mendocino), втыкаем туда память (я нашёл на складе 256 + 128 Мб), сетевую карту (встроенной ещё не было в то время) и какой-нить древний IDE-шный винт. Комп оказался брендовым (Compaq), и там на борту было видео. Ну и пассивное охлаждение — тоже неплохо. Ставим туда 20-ю федору в минимальном варианте, а также пакеты minicom и hylafax+.
Теперь к COM-порту подключаем ещё одну зверь-машину — аппаратный факс-модем. В моём случае вот такой — http://market.yandex.ru/model.xml?modelid=106840&hid=91029&clid=698 . Его телефонный выход соединяем с Voip-шлюзом (таким или таким), настроенным на тестовый аккаунт в нашей сети, с привязанным номером и прочим.

pap2t_us56K-fax-modem

Главное — поставить правильные приоритеты кодеков, отключить т38 и поставить кодек для fax-passthru. А вот теперь на всём этом мы попытаемся взлететь, то есть использовать данный стенд для приёма и отправки тестовых факсов. 😀 😀

Сперва проверяем модем. Запускаем minicom, и указываем порт — /dev/ttyS0 (COM1), 38400-8N1 /* Это скорость работы интерфейса RS232, никакого отношения к скорости коннекта факсом она не имеет, не путайте */. Пишем ati*-команды для проверки:

ATI3
U.S. Robotics 56K FAX EXT Rev. 11.16.63

ATI4
U.S. Robotics 56K FAX EXT Settings...

B0 E1 F1 L3 M1 Q0 V1 X1 Y0
BAUD=38400 PARITY=N WORDLEN=8
DIAL=TONE ON HOOK CID=0

&A3 &B1 &C1 &D2 &G2 &H1 &I0 &K1
&M4 &N0 &P2 &R2 &S0 &T5 &U0 &Y1

S00=000 S01=000 S02=043 S03=013 S04=010 S05=008 S06=002
S07=060 S08=002 S09=006 S10=014 S11=070 S12=050 S13=000
S15=000 S16=000 S18=000 S19=000 S21=010 S22=017 S23=019
S25=005 S27=001 S28=008 S29=020 S30=000 S31=128 S32=002
S33=000 S34=000 S35=000 S36=014 S38=000 S39=012 S40=000
S41=004 S42=010

LAST DIALED #:
Ура, модем отвечает. Попробуем позвонить:
ATDT74992221133
Если напишет «NO CARRIER» — ничего страшного, это же тёплый ламповый аналоговый модем, пробуем ещё раз. В итоге вызов должен пройти, и если на него ответить — можно услышать в трубке сигналы модема.
Теперь внимательно читаем вот этот шикарный мануал по хилафаксу: http://www.ishodniki.ru/art/artshow.php?cat=&id=713&show=linux
Главное — внимательно выполнить faxsetup. После чего обязательно настроить число попыток дозвона:
AutoCoverPage: No
MaxDials: 2
MaxTries: 2
NoCarrierRetrys: 2

С параметрами по умолчанию ваш стенд превратится в машину насилия, которая будет при плохой линии или помехах в канале по 15 раз пробовать отправить злосчастный факс. Пробуем запустить с помощью команды `hylafax start`. У меня оно сперва не запустилось — лечится временной сменой владельца на uucp:uucp для /var/spool/hylafax. Потом запускаем снова, будут созданы два таких пайпа:
# ls -la /var/spool/hylafax | grep pr
prw------- 1 uucp uucp 0 Jan 29 04:29 FIFO
prw------- 1 uucp uucp 0 Jan 28 19:47 FIFO.ttyS0

После чего можно для /var/spool/hylafax снова вернуть прежнего владельца root:root.
Всё, можно слать факсы. Для отправки нам потребуется исходный файл в формате TIFF или PS. Я проверил оба варианта — оба работают. PS-файл легко генерируется функцией «Печать в файл PostScript» в просмотровщике Okular, либо каким-нибудь консольным конвертером. Потом закидываем файл по ссш на наш стенд и даём команду:
sendfax -d 74992221133 /home/test/FaxCheck.ps
Через некоторое время хилафакс дозвонится на номер 74992221133 и отправит факсовыми писками содержимое FaxCheck.ps.
Для автоматического приёма факсов просто пропишите в rc.local запуск `faxgetty /dev/ttyS0`.
В списке процессов должно быть следующее:
# ps axu | grep fax
uucp 1622 0.0 1.0 9608 3832 ? Ss 04:40 0:00 /usr/sbin/faxq
uucp 1624 0.0 0.8 9220 3120 ? Ss 04:40 0:00 /usr/sbin/hfaxd -i hylafax
uucp 1666 0.1 1.2 9716 4832 pts/0 S 04:56 0:00 faxgetty /dev/ttyS0

Где faxq — программа управления модемом и очередью задач (модем не многозадачен by design), hfaxd — демон обработки сетевого протокола hylafax (нужен для взаимодействия по сети, например, для отправки факсов с виндового hylafax-клиента и для работы ряда утилит), а faxgetty — отдельная программа, отвечающая на входящие звонки и складывающая принятые факсы внутрь /var/spool/hylafax/recvq в виде монохромных tiff-файлов ужасающе низкого разрешения, ибо от говённости самой технологии факса никуда не уйти.

Для моих целей такой конфигурации более чем достаточно. Что особенно важно — хилафакс и все эти утилиты пишут подробнейшие логи работы модема в /var/spool/hylafax/log/*, данные об удаленной стороне — в /var/spool/hylafax/info/*, чего от обычного офисного факса добиться будет практически невозможно (без применения паяльника и программатора, как минимум).
Пример инфо-файла об удалённой стороне:
# cat 7591526
supportsVRes:3
supports2DEncoding:yes
supportsMMR:no
hasV34Trouble:no
hasV17Trouble:no
senderHasV17Trouble:no
senderSkipsV29:no
senderDataSent:0
senderDataSent1:0
senderDataSent2:0
senderDataMissed:0
senderDataMissed1:0
senderDataMissed2:0
dataSent:1
dataSent1:0
dataSent2:0
dataMissed:0
dataMissed1:0
dataMissed2:0
supportsPostScript:no
supportsBatching:yes
calledBefore:yes
maxPageWidth:1728
maxPageLength:65535
maxSignallingRate:"9600"
minScanlineTime:"20ms/10ms"
remoteCSI:"7591526"
remoteNSF:"secret HEX data =)"
remoteDIS:"secret HEX data =)"
sendFailures:1
lastSendFailure:"No response to EOP repeated 3 tries {E151}"
dialFailures:2
lastDialFailure:"Busy signal detected {E001}"
pagingProtocol:"ixo"

Пример лога:
Jan 28 17:49:43.89: [ 656]: SESSION BEGIN 000000026 7591526
Jan 28 17:49:43.89: [ 656]: HylaFAX (tm) Version 5.5.5
Jan 28 17:49:43.89: [ 656]: SEND FAX: JOB 9 DEST 7591526 COMMID 000000026 DEVICE '/dev/ttyS0' FROM 'root' USER root
Jan 28 17:49:43.90: [ 656]: STATE CHANGE: RUNNING -> SENDING
Jan 28 17:49:43.90: [ 656]: [2:OK]
Jan 28 17:49:44.06: [ 656]: MODEM set XON/XOFF/FLUSH: input ignored, output disabled
Jan 28 17:49:44.68: [ 656]: DIAL 7591526
Jan 28 17:49:44.68: [ 656]: [4:BUSY]
Jan 28 17:50:09.48: [ 656]: SEND FAILED: JOB 9 DEST 7591526 ERR Busy signal detected {E001}
Jan 28 17:50:10.48: [ 656]: [2:OK]
Jan 28 17:50:10.61: [ 656]: MODEM set DTR OFF
Jan 28 17:50:10.61: [ 656]: STATE CHANGE: SENDING -> MODEMWAIT (timeout 5)
Jan 28 17:50:10.62: [ 656]: SESSION END

Для поиска причин непрохождения факса такой детальный и качественный лог может оказаться крайне полезным, поскольку лог модема — это самое низкоуровневое, что нам доступно в нашей диагностике.
Ну и само собой, не забываем собирать логи с нашего Voip-шлюза, с телефонного сервера и дампы телефонного воип-траффика, чтобы получить полную картину происходящего.

Всё остальное — всякие рассылки факсов на емейлы, настройка хилафакса под виндовс через самба-принтер и прочие извращения есть в исходной статье, мне это не потребовалось. Если дальнейшие тесты пройдут успешно по всем основным направлениям — возможно, оживлять старый гробо-факс вообще не придётся, поскольку стенд на хилафаксе с аппаратным модемом для диагностики стократ полезнее.

Что касается т38 — я надеюсь, что оно подохнет вместе с последним факсом, и мне эту тоскливую печаль слишком уж детально осиливать не придётся :D. Я же призываю людей к благоразумию и отказу от факсов в пользу электронной почты, причём желательно с PGP-шифрованием и верификацией ключей и подписей.

- комментарии
  1. Ну и модем! Это что, тот самый!?!

  2. Именно. Иногда даже старая реликтовая вещь может внезапно найти применение. Я про этот модем вспомнил случайно, что он у меня лежит на антресолях, когда на работе последний полуживой факсовый аппарат перестал протаскивать бумагу. Кстати, этот модем прекрасно работает, насколько вообще может работать такого типа связь через современные VoIP-линки, для модемов, мягко скажем, не сильно предназначенные.

    Там самое новое — это цисковский воип-шлюз. Есть ещё более крутой модем: http://market.yandex.ru/model.xml?hid=91029&modelid=106826&clid=502 , но такие были на прошлой работе =)

  3. Ого! Ну и ценничек!

    Конечно, работает. Я б не стал презентовать хлам. )

  4. […] Про факсы я уже писал ранее. ПоциЭнт одной ногой в могиле, но ещё шевелится. […]