Линукс факс-сервер для сети на базе Windows
Автор: (C) Pedro Fraile
Перевод: (C) Александр Михайлов


Введение

В фирме, на которую я работаю, есть система для отсылки и приема факсов, интегрированная в корпоративную e-mail платформу, Microsoft Exchange. В один прекрасный день, после обновления ПО, система сломалась. Нам потребовалось найти что-то с эквивалентной функциональностью, но удовлетворяющее следующим условиям:

Эта статья рассказывает о том, как интеграция нескольких продуктов с открытым исходным кодом на платформе Линукс позволила удовлетворить все эти требования.

Благодарности

Я хочу выразить мою признательность людям и организациям, без помощи которых я никогда не написал бы этой статьи. Во-первых, это работники IT-подразделения фабрики Solvay QuMmics S.L. в Torrelavega, Испания. Во-вторых, руководство моей фирмы за одобрение и поддержку при написании этой статьи. И, наконец, в последнюю очередь, но особенно сильно хочется поблагодарить всех кто участвовал в разработке проектов с Открытым Исходным кодом, упомянутых в этом тексте, участников списка рассылки HylaFax (которые обеспечили меня необходимой информацией) и Craig Kelly, разработчика утилиты smbfax.

Обзор системы

Чтобы уточнить о каком именно компьютере я веду здесь речь, я буду называть ПК с установленным программным обеспечением для работы с факсами, TOSERFAX.

Предлагаемое решение использует программный пакет HylaFax. Это приложение контролирует установленные модемы, распределяет входящие факсы и отсылает исходящие.

Входящие факсы конвертируются в формат PDF и направляются при помощи почтового протокола SMTP соответствующим получателям. PDF был выбран в качестве формата, так как Acrobat Reader это стандартная программная платформа в данной сети. Место назначение выбирается исходя из определенных правил, что будет разъяснено позднее.

Если кто-то хочет послать fax, то он печатает документ на принтер, расположенный на TOSERFAX, который виден всем остальным компьютерам благодаря Samba. Задание на печать вызовет отсылку e-mail сообщения пользователю, который поставил его на печать. Это e-mail сообщение содержит URL веб-формы, создаваемой на лету веб-сервером Apache. Веб-форма позволяет пользователю заполнить детали, касающиеся данного факсимильного сообщения, в частности телефонный номер. Как только пользователь закончил с заполнением формы, и щелкнул на кнопку "Отправить", факс попадает в очередь исходящих.

Программное и аппаратное обеспечение

Конфигурация TOSERFAX следующая:

Что касается программного обеспечения:

Установка и настройка HylaFAX

Установка HylaFax проводилась в соответствии со стандартными процедурами, четко определенными в документации. Самая тонкая часть - настройка модемов. В HylaFax нет шаблона для модема US Robotics 56K Faxmodem. Тем не менее, поиск в списке рассылки дал необходимую информацию, в результате чего был создан файл /var/spool/fax/etc/config.ttyS0 ( и config.ttyS1 для второго модема). Первый из этих файлов можно найти здесь.

Прием факсов

У нашего предприятия есть несколько телефонных номеров, соединенных с факс-машинами. Функция перевода звонка может переключать звонки с одного внутреннего номера на другой. Эта возможность позволяет централизовать прием всех факсов на TOSERFAX, без изменения телефонных номеров, уже известных клиентам.

Например, предположим, что у отдела закупок есть номер факса 5550001, а у отдела логистики 5550002. Один из модемов TOSERFAX подсоединен к внутреннему номеру 1700. АТС переводит все входящие звонки на номера 5550001 и 5550002, на внутренний номер 1700, где TOSERFAX принимает факс.

Но конечно же, человек, который должен получать факсы предназначенные отделу закупок, и человек, который должен получать факсы адресованные отделу логистики, это не одно и тоже лицо. Необходимое нам распределение факсов требует знания номера, на который был изначально адресован факс, и который недоступен в стандартной версии faxrcvd. Обходной маневр в данной ситуации, это восстановить этот номер из лога сессии и присвоить его некоторой переменной, например TOPHONE.

        TOPHONE=$($AWK '/SESSION BEGIN/ {print $NF; exit}' log/c${COMMID})

Модифицированные версии faxrcvd и FaxDispatch можно найти здесь и здесь.

Стандартная версия faxrcvd посылает факс адресату, как postscript вложение в e-mail сообщение. На моем предприятии это не самое лучшее решение, так как на стандартном ПК клиента нет программы для просмотра postscript. Но зато есть программа для просмотра PDF, а файлы postscript могут быть преобразованы в PDF.

Однако, здесь мы сталкиваемся с небольшой проблемой, связанной с отсылкой e-mail сообщения, с присоединенным файлом. TOSERFAX использует в качестве SMTP-ретранслятора сервер Windows NT, с ISS версии 4. По какой-то причине, которую я так и не смог установить, этот сервер не может пересылать e-mail'ы c вложениями созданными faxrcvd.

Решением стало использование утилиты "metasend", включенной в пакет metamail 2.7.19. Скрипты metasend.sh и tiff2pdf.sh успешно отсылают факсы, предварительно преобразованные в PDF-формат, таким образом (и в таком виде), который устраивает SMTP-ретранслятор. Стоит также заметить, что эти скрипты вызывают утилиты tiff2ps и gs.

Отправка факсов

Есть несколько клиентов для отправки факсов, написанных специально для HylaFAX и работающих на многих платформах. Но, IT-администраторы в Torrelavega стараются по возможности избегать установки программного обеспечения на машины клиентов. Единственной операцией на клиентских машинах, должна быть настройка сетевого принтера, и она должна проводиться автоматически, по возможности самим пользователем.

Использование очереди печати имеет дополнительное преимущество, т.к. любое приложение способное послать документ на печать (а это практически любая программа), сможет отправить факс. С учетом этого, система отправки факсов, описанная в этой статье, явно превосходит другие коммерческие системы, установленные в Microsoft Exchange, которые позволяют отсылать только факсы созданные определенными приложениями, например созданные в Microsoft Office.

Пакет smbfax, разработанный Craig Kelly, выполняет указанное выше требование. В его основе лежит очень интересная идея: клиент печатает документ, который он хочет отправить по факсу в очередь принтера, сконфигурированную на TOSERFAX при помощи Samba, и которая представляется как postscript принтер. Печать вызывает исполнение perl скрипта, который вкладывает распечатанный документ в файл и отсылает клиенту e-mail с его URL. Этот URL указывает на веб-форму, создаваемую "на лету" в веб-сервере на TOSERFAX (Apache). Клиент нажимает на URL, вызывает браузер и, используя веб-форму, заполняет номер или номера, по которым должен быть отправлен факс. Выбирает нужно ли добавлять титульную страницу и другие детали. Наконец, после нажатия на кнопку "Отправить", факс ставится в очередь на отправку. Если в ходе обработки задания возникнет какая-либо ошибка, клиент также будет извещен поcредством электронной почты. Очевидно что такая система требует знания идентификатора пользователя, отсылающего факс (должен существовать механизм, позволяющий однозначно идентифицировать пользователя Windows), а также его e-mail адреса.

Инсталляция smbfax достаточно проста. Документация пакета ясно объясняет различные шаги и повторение их здесь будет излишне.

Настройка Samba, с другой стороны, требует применения некоторых интересных приемов. Подходящий файл конфигурации можно увидеть здесь. Следующие строки должны быть выделены:

[global]
        workgroup = DOM
        netbios name = TOSERFAX
        security = DOMAIN
        winbind uid = 10000-20000
        winbind gid = 10000-20000
        template homedir = /home/win/%D/%U
        winbind separator = +
        printer admin = @DOM+PRINTADMIN
        ...

[print$]
        path = /etc/samba/printers/
        browseable = yes
        read only = yes
        write list = @DOM+PRINTADMIN,root

# В этой секции настраивается очередь печати для факса
[fax]
        comment = Fax queue
        path = /tmp
        printable = Yes
        writable = no
        create mode = 0700
        guest ok = no
        postscript = Yes
        printing = lprng
        print command = /usr/local/smbfax/smbfax -r queue %u %s
        lpq command = /usr/local/smbfax/smbfax show
        lprm command = /usr/local/smbfax/smbfax dequeue %j

Как Samba-сервер, TOSERFAX входит в домен Windows 2000 (Active Directory). Samba версии 2.2.3 включает поддержку "winbindd", который позволяет авторизовать клиентов, основываясь на мандате полученном после начала сессии в домене. Как следствие больше не нужно создавать Windows пользователей на Linux машине. Каждый клиент, который первый раз подсоединяется к samba-серверу, будет идентифицироваться комбинацией <Доменное имя>+<Имя пользователя>, и получит "uid" в диапазоне 10000 - 20000.

Внутри секции [fax] , строка

        print command = /usr/local/smbfax/smbfax -r queue %u %s

вызывает программу smbfax, передавая ей в качестве параметра имя пользователя (%u), которое определяется как было описано ранее.

Внутри секции [global], строка

        printer admin = @DOM+PRINTADMIN

дает административные права на принтер всем членам группы PRINTADMIN в NT домене DOM. Эти пользователи смогут настраивать принтеры, устанавливать драйвера (для разных версий Windows) и давать привилегии на печать пользователям домена при помощи стандартных административных утилит, имеющихся на NT или Windows 2000 машинах, и которые используют Удаленный Вызов Процедур (RPC). Все это полностью прозрачно для пользователя, несмотря на то, что сервер печати это на самом деле не Windows-сервер, а Linux.

Члены группы DOM+PRINTADMIN конечно должны иметь доступ на запись в /etc/samba/printers. Это достигается путем установки необходимых прав в файловой системе Linux:

       $ chown -R DOM+PROWNER:DOM+PRINTADMIN /etc/samba/printers
       $ chmod 0775 /etc/samba/printers

Установка драйверов -- это особенно интересная возможность. На TOSERFAX можно установить драйвера postscript принтера для всех версий Windows, которые используются на предприятии: 95, NT и 2000. После чего любой клиент, который подсоединяется к очереди печати в первый раз, сможет автоматически установить необходимые драйвера. Таким образом достигается одна из целей сетевых администраторов: не нужно производить дополнительную настройку на стороне клиента.

Дополнительно любой член группы PRINTADMIN, может запретить доступ к очереди печати, используя списки доступа NT (ACL).

Единственный вопрос оставшийся без ответа, это как отослать e-mail сообщение пользователю, который хочет отправить факс. Благодаря winbindd, пользователь прошел процедуру аутентификации, но какой у него e-mail адрес? Т.к. считать эту информацию из Active Directory не представляется возможным (возможно здесь помог бы OpenLDAP), то решением стало вручную добавить в файл "aliases" список всех возможных пользователей факса, вместе с их e-mail адресами

        DOM+User1:      [email protected]
        DOM+User2:      [email protected]

и так далее. После этого запустите "newaliases" и система готова.

Обслуживание системы

После того как все компоненты сконфигурированы, последнее что остается сделать, это автоматизировать некоторые простые сервисные процедуры. Этого очень легко достигнуть, добавив в /etc/crontab следующие строки:

     0 21 * * *     root  test -x /usr/sbin/faxqclean && /usr/sbin/faxqclean

25 23 * * * root test -e /usr/sbin/faxcron && sh /usr/sbin/faxcron | mail faxmaster

Примите во внимание, что пакет HylaFax, поставляемый с Suse 7.2 устанавливает faxcron в /etc/cron.daily. Вам придется удалить его, чтобы предложенная схема заработала.

Заключение

Комбинация из HylaFax, Samba, smbfax и других open-source пакетов, на базе Linux системы, позволила интегрировать эффективный централизованный факс-сервис в окружение Windows сети, оправдав ожидания IT менеджеров, и, что особенно важно, исключив необходимость установки дополнительного программного обеспечения на стороне клиентов.


Pedro Fraile

Я впервые встретился с компьютерами в 1982, и если меня не подводит память, то это был Z 80. В 1998 я открыл для себя Linux, и очень скоро это операционная система была водружена на мои домашние PC. Компьютеры и программирование одни из самых моих любимых хобби.
Copyright (C) 2002, Pedro Fraile.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 79 of Linux Gazette, June 2002

Команда переводчиков:
Владимир Меренков, Александр Михайлов, Иван Песин, Сергей Скороходов, Александр Саввин, Роман Шумихин, Александр Куприн, Андрей Киселев

Со всеми предложениями, идеями и комментариями обращайтесь к Александру Куприну ([email protected]). Убедительная просьба: указывайте сразу, не возражаете ли Вы против публикации Ваших отзывов в рассылке.

Сайт рассылки: http://gazette.linux.ru.net
Эту статью можно взять здесь: http://gazette.linux.ru.net/lg79/fraile.html