Roads to Linux - mgetty+sendfaxのインストール
PC-UN*Xをインストールするたび、これまで必ず行ってきたのが、モデムを介して外部からログインできるようにする事でした。かつてNEC-98互換機に386BSDをインストールした時も、また初めてLinuxをインストールした時も、真っ先に模索したのはこれでした。
アクセスされる側に立つという事は、何と言うか、高性能の証のような感覚があります。これは古くからパソコンをやっている人間には共通の感覚なんじゃないだろうかと思っています。
しかし実際には、せっかく設定を行っても、それを活かす事はありませんでした。外部にモデムのある環境が無かったり、留守番電話のじゃまになったりするためです。
が、遂にISDNによる2回線を手にした今、もう誰も私を阻む物はいません。しかも遠隔地からのログインだけでなくFAXまで扱ってくれるとなれば、もう笑うしかありません。わはは。便利な時代になったものじゃのう。
■mgetty+sendfaxのインストール
mgetty+sendfax-1.0.0.tar.gzを入手、展開し、コンパイルのための設定を行います。
tar zxvf mgetty+sendfax-1.0.0.tar.gz
cd mgetty-1.0.0
cp policy.h-dist policy.h
vi policy.h
mgetty+sendfaxはconfigureを使用していないので、コンパイルに必要な設定は、付属のヘッダファイルの雛型から作成する事になります。以下が私の行った修正点です。
#define DEVICE_OWNER "root"
#define DEVICE_GROUP "tty"
#define LOG_PATH "/var/log/log_mg.%s"
#define MGETTY_PID_FILE "/var/run/mg-pid.%s"
#define MODEM_INIT_STRING "ATS0=0Q0B0&C1"
#define DEFAULT_MODEMTYPE "cls2"
#define FAX_IN_GROUP "uucp"
#define FAX_RECV_SWITCHBD 19200
#define FAX_STATION_ID "xxx xxx xxxx"
#define FAX_DIAL_PREFIX "ATDT"
#define FAX_MODEM_TTYS "ttyS0"
# define MAILER "/usr/sbin/sendmail"
#define MAIL_TO "root"
私が今回Linuxサーバに接続したモデムは、Midori-HayesのACCURA 288 V.34+FAXというモデムです。COM1に接続しました(COM2がTA)。このモデムはWindows 95マシンで使っていたものですが、今回おさがりしました。本当はもう一つ使っていないFAXモデム(OPTIMA)が余っていたのですが、これのFAX機能はClass1まででした。mgetty+sendfaxはClass2以上が前提ですので、やむなくといったところです。
ACCURAはClass2までのFAXを扱う事ができますが、Class2.0は扱えません。そのためDEFAULT_MODEMTYPEには明示的にそれを指定しています(autoのままでも問題はないのですが)。
また、試してみるとうまくいかず、ログをみると+FCONというステータスだったので、コメントに従ってFAX_RECV_SWITCHBDを指定しました。
policy.hの編集が終れば、コンパイルとインストールを行います。
make
make install
あとは、/etc/inittabの編集です。シリアルラインについての定義部に以下を追加しました。
s1:12345:respawn:/usr/local/sbin/mgetty ttyS0
で、以下のようにして変更を反映させます(再起動してもいい)。
init q
この状態で、Windows 95マシンから通信ソフトを使って電話をかけてみると、正しくログインプロンプトが表示され、ログインできました。また、Microsoft FAXでFAXを送信してみると、これも正しく受信されたようです。
受信されたFAXページは、G3形式で/var/spool/fax/incomingに置かれます。この時、policy.hで指定したFAX管理者に受信通知のメールが送られるので、受信を後から知る事ができます。
さて、この受信FAX、一体どうやって中身を見ればいいのでしょうか。
■netpbmのインストール
mgetty+sendfaxには、G3形式からPBM形式にファイルを変換するフィルタが付属しています。PBMとはPortable BitMapの略で、何やらファイル変換の仲立ちをさせるためのファイルフォーマットらしいです(日本のパソコン界で言えばQ0に相当するのか?)。で、このフォーマットを元にして各種ファイルを相互変換するためのパッケージがnetpbm(昔はpbmplusという名前だった?)らしいです。
...ただでさえ各種ファイルフォーマットがあり(しかも日本のDOS/Windows世界ではどれもほとんど馴染みがない...G3? PBM? PostScript? 最初からJpegかMagで出力してくれ(笑))、かつXをきちんと整備していない今の状態ではプリンタに出力せねばならず、その際のコンバートまで考えなければなりません。考えていると訳がわからなくなるので、とにかくnetpbmをインストールしてみる事にします。
netpbm-1mar1994.tar.gzを入手したので、これを展開します。READMEやMakefileをちらっと見ましたが、何だかよくわからず、またどうせフィルタなのでマシン依存もほとんどないだろうと勝手に決め込んで、一気にコンパイル/インストールを行います。
tar zxvf netpbm-1mar1994.tar.gz
cd netpbm
make
make install
プリンタへの出力経路ですが、G3→PBM→PostScriptと変換し、ghostscriptを使って出力する事にします。ghostscriptはPJEからインストールしたので、うちのESC/PSプリンタもうまい事サポートされているのではないかと考えたからです。
試しに、コマンドラインから以下のようにしてみました。
gs -h
そうすると、組み込まれているデバイス一覧にepagの文字が見えます。これを確認するため、ひたすらHDDの中を探し歩いたところ(ghostscriptなぞ使った事がないのでさっぱり勝手がわからないのです)、/usr/local/share/ghostscript/3.33/READMEsにデバイス毎の日本語ドキュメントが見付かりました。私の場合はepag600を使うと幸せになれるようです。
これでG3ファイルからプリンタまでの道が開けました。試しに以下のようにして出力してみます(FFFというのがG3ファイルとします)。
/usr/local/bin/g32pbm FFF | /usr/local/netpbm/pnmtops | /usr/local/bin/gs -q -sDEVICE=epag600 -sOutputFile=- -dNOPAUSE - quit.ps | lpr -P LP-800
送り先のプリンタLP-800はSambaで使うために作ったものですが、今回もデータを生で送らなければならないので流用しています。
こうしたところ、FAXデータが正しくプリンタに出力できました。ついでですので、FAXデータをそのまま出力できるプリンタ定義を作ってしまう事にします。以下のようなフィルタを/usr/sbin/g3epagifとして作成します。
#!/bin/sh
/usr/local/bin/g32pbm | /usr/local/netpbm/pnmtops | /usr/local/bin/gs -q -sDEVICE=epag600 -sOutputFile=- -dNOPAUSE - quit.ps
exit $?
このフィルタは、以下のようにしてescpagesfフィルタと同じ属性にしておきます。
cd /usr/sbin chmod 755 g3epagif
chown bin.bin g3epagif
そして/etc/printcapに以下の定義を追加します。
g3|G3 FAX:\
:sd=/var/spool/g3:\
:lf=/var/log/lp-err-g3:\
:lp=/dev/lp1:sh:\
:if=/usr/sbin/g3epagif:
スプールディレクトリとログファイルは以下のように作成します。
cd /var/spool
mkdir g3
chmod 775 g3
chgrp lp g3
touch /var/log/lp-err-g3
そして、lpc restart allすると、
lpr -P g3 FFF
とするだけでFAXデータが印刷できるようになりました。
■自動印刷のための設定
普段からずっとX上で作業しているなら、FAXが届いた段階でgv(ghostscriptビューア)等で内容を確認し、必要なら印刷すればいいのでしょうが、常用環境がWindows 95ですからそういう訳にも行きません。うちの場合、使ったとしても仕事だけですので、そんなに量も見込まれませんし、いっそ普通のFAXのように届いた時点でそのまま印刷されると便利です。
mgetty+sendfaxでは、/usr/local/lib/mgetty+sendfax/new_faxというスクリプトを作成しておく事で、FAX受信時に受信ファイルに対して何でも好きな事を行えるようになっています。ソースと一緒にサンプルも同梱されていますので、これを参考にして、以下のようなスクリプトを作成しました。
#!/bin/sh
shift 3
files=
for i in $@
do
lpr -P g3 $i
files="$files `basename $i`"
done
# archive
cd `dirname $1`
tar -cvzf `basename $1 .01`.tar.gz $files
# delete
rm -f $*
exit 0
ここでは、印刷を行い、それらをtar+gzでまとめて保存するようにしてみました。このスクリプトを実行可能にし(chmod 755)、もう一度Windows 95側からFAXを送信してみると、正しく処理が行われました。
mgetty+sendfaxには、AutoPPPという機能もあります。FAXとログイン認証を振り分けるだけでなく、相手がPPP接続を求めている場合には自動的にPPPを起動するという機能で、これができるとこれまたすさまじく便利と思われますが、今のところテストできる環境を簡単に作れないので、これについては後日にまわす事にします。