Рассылка факсов из 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
|