Рассылка факсов из Win9x с помощью samba и mgetty

Отчего-то неполучилось у меня сделать рассылку факсов так, как предлагают в Faxing.txt. Точнее не получилось достать из Postscript'а номер факса. Скорее всего виноваты в этом русские MS Win9x и MS Office - слово Fax-Nr и сам номер чаще всего получается "размазанным" по нескольким Postcript-командам. :(
Во время этих экспериментов я заметил, что виндовый драйвер Postscript'а упорно вставляет в %%Title: имя файла. Тогда я решил, что имя файла с факсом будет содержать подстроку fax-1234567, например For_Macomnet_fax-9734010.doc.
Итого для решения поставленной задачи потребовалось:
  • Выполнить рекомендации из Faxing.txt. Если вам требуется это только в Win9x (в Unix есть более удобные средства :), то описывать принтер fax в /etc/printcap не требуется.
  • Вместо скрипта, определяющего номер факса написать свой: /usr/local/lib/samba/fax
    #!/bin/sh
    cat >/tmp/wfax.$$
    FaxNum=`egrep '\%\%Title:.*fax-[W0-9-]+' </tmp/wfax.$$ | sed -n 's/.*fax-\([0-9-][W0-9-]*\).*/\1/p'`
    /usr/local/bin/faxspool -q $FaxNum /tmp/wfax.$$
    rm -f /tmp/wfax.$$
        

  • Так как я использую в качестве спуллера печати пакет LPRng, то для возможности управления очередью из Win9x пришлось написать еще несколько скриптов: /usr/local/lib/samba/fax_q
    #!/usr/bin/perl
    
    if( !open( faxq, "/usr/local/bin/faxq -a |" )) {
            print STDERR "Cannot run /usr/local/bin/faxq. $!\n";
            exit( 1 );
    }
    print "Rank   Owner/ID                   Class Job  Files               Size Time\n";
    $count = 1;
    while( <faxq> ) {
            chop;
            last if( /^no jobs.$/ );
            ( $jobid, $st, $user, $size, $phone ) = ( /^F0*([1-9][0-9]*)\/JOB(\S+).* by (\S+)\. ([0-9]+) .* to ([0-9-]+)./ );
            $Rank = $count;
            $File = $phone;
            if( $st =~ /suspended/ ) {
                    $Rank = "hold";
    #       } elsif( $st =~ /error/ ) {
    #               $File = $File." error";
            } elsif( $st =~ /dome/ ) {
                    next;
            }
            printf "%-7s %-26s %-5s %-4s %-15s   %s %s\n", $Rank, $user."\@youhost+000", "A", $jobid, $File, $size, "00:00:00";
            $count++;
    }
    close( faxq );
        


    /usr/local/lib/samba/fax_rm
    #!/bin/sh
    
    /usr/local/bin/faxrm `/usr/bin/printf "F%06d" $1`
        

    /usr/local/lib/samba/fax_pause
    #!/bin/sh
    
    File="/var/spool/fax/outgoing/"`/usr/bin/printf "F%06d" $1`"/JOB"
    if [ -f $File ] ; then
            mv $File $File.suspended
            touch /var/spool/fax/outgoing/.queue-changed
    fi
        

    /usr/local/lib/samba/fax_resume
    #!/bin/sh
    
    File="/var/spool/fax/outgoing/"`/usr/bin/printf "F%06d" $1`"/JOB"
    if [ -f $File.suspended ] ; then
            mv $File.suspended $File
            touch /var/spool/fax/outgoing/.queue-changed
    fi
        

    В окне виндового спулера размер задания показывается в страницах несмотря на то, что там написано про байты. :) В случае невозможности отправить факс это задание hold'ится и для возобновления попыток пользователь может его сам рас'hold'ить.


  • В samba.conf добавить описание нового принтера:
    [fax]
            comment = ZyXEL Fax
            available = yes
            path = /tmp
            read only = No
            create mask = 0700
            print ok = Yes
            share modes = No
            printer = fax
            print command = cat %s | /usr/local/lib/samba/fax ; rm -f %s
            lpq command = /usr/local/lib/samba/fax_q
            lprm command = /usr/local/lib/samba/fax_rm %j
            lppause command = /usr/local/bin/fax_pause %j
            lpresume command = /usr/local/bin/fax_resume %j
          

  • Если вы хотите, чтобы пользователи получали отчеты о отправленных/ошибочных факсах с помощью Winpopup вам придется написать еще пару скриптов: /usr/local/lib/mgetty/fax-success
    #!/bin/sh
    
    File=$1
    for f in $File $File.done ; do
            if [ -r $f ] ; then
                    Phone=`egrep '^phone' $f 2>/dev/null | awk '{print $2}'`
                    User=`egrep '^user' $f 2>/dev/null | awk '{print $2}'`
                    echo "Факс на номер $Phone отправлен." | /usr/local/bin/rcode -t koi-alt | /usr/local/bin/smbclient -U FaxServer -M $User >/dev/null
                    rm -rf `dirname $File`
                    touch /var/spool/fax/outgoing/.queue-changed
                    exit
            fi
    done
        

    /usr/local/lib/mgetty/fax-fail
    #!/bin/sh
    
    File=$1
    for f in $File $File.suspended $File.error $File.done ; do
            if [ -r $f ] ; then
                    Phone=`egrep '^phone' $f 2>/dev/null | awk '{print $2}'`
                    User=`egrep '^user' $f 2>/dev/null | awk '{print $2}'`
                    Status=`tail -1 $f`
                    echo -e "Факс на номер $Phone не отправлен.\n$Status" | /usr/local/bin/rcode -t koi-alt | /usr/local/bin/smbclient -U FaxServer -M $User >/dev/null
                    exit
            fi
    done
        

    Что такое /usr/local/bin/rcode -t koi-alt сами догадаетесь. :)
    В конфиге faxrunq.config укажите:
    success-call-program /usr/local/lib/mgetty/fax-success
    failure-call-program /usr/local/lib/mgetty/fax-fail
    delete-sent-jobs n
        

Дополнение от Вячеслава Иваненкова:

From: "Иваненков В.В" 
Subject: 
To: "'oskin@macomnet.ru'" 
Date: Mon, 1 Oct 2001 14:38:55 +0800 

Здравствуйте Сергей!

Прочитал вашу статью "Рассылка факсов из Win9x с помощью samba и mgetty"
Там вы пишете , что "Точнее не получилось достать из Postscript'а номер
факса. Скорее всего виноваты в этом русские MS Win9x и MS Office - слово
Fax-Nr и сам номер чаще всего получается "размазанным" по нескольким
Postcript-командам. :("
У меня тоже не получилось. Вернее все с успехом достается если у клиента
Виндовс 2000, а вот если 98 - то действительно номер факса размазывается по
нескольким командам.
Я решил этот вопрос так: перед анализом на номер факса   я просто печатаю
ГостСкриптом этот файлик на ASCII принтер (c помощью ps2ascii - из примеров
gs)  и после этого достаю  номер факса.

---------------------------------------------
mv $1 /tmp/fax.$2.ps
telno=`/usr/local/bin/ps2ascii /tmp/fax.$2.ps|grep FAX|awk '{ print
substr($1 ,index($1,"FAX")+4, 12 ); }' | tail -1`
/usr/local/bin/faxspool $telno /tmp/fax.$2.ps
/usr/bin/logger  User $2 send fax to: $telno
----------------------------------------------

Иваненков Вячеслав
Красноярск


Вот собственно и все.


Last modified: Mon Oct 1 11:50:28 MSD 2001