|||||||||||||||||||||

なんぶ電子

- 更新: 

hylafax+(プラス)

hylafax+

Debian11(bullseye)からDebian12(bookworm)にアップグレードしたところ、hylafax で利用していた I-O DATA の DFM-56U(Conexant) のモデムが反応しなくなってしまいました。

最初は、dmesg に出力されていた device descriptor read/64, error -71 が問題ではないかと思い試行錯誤していたのですが、そちらも解決せずになやんでいたところ、Stack Exchangeに同じようなトラブルの記事を発見し、hylafax+(プラス)というフォークにたどりつきました。

この hylafax+をビルドして利用したところ、モデムの問題は残りましたがhylafaxは利用できるようになったのでここに覚書を残しておきます。

ビルドとインストール

hylafax+(プラス)の最新のバージョンは、執筆時点で7.0.7でした。本家の hylafax は2018年からアップデートされていないようですが、こちらは2023年の1月に最終リリースがあります。

プラスにもバイナリパッケージもあるようですが、こちらはメンテナンスされていないようでした。

なので、先のページよりソースファイルをダウンロードしてビルドします。既存の環境により異なると思いますが、筆者の場合 libtiff-dev libtiff-tools の追加インストールが必要でした。

# cd /usr/local/src
# tar -vzxf hylafax-7.0.7.tar.gz
...
# cd hylafax-7.0.7
# ./configure
...

もし checking PAM library version でエラーがでるようなら ./configure --disable-pam としてPAMを無効にしてください。

実行後、バイナリを配置するディレクトリや設定のデフォルト値の確認を求められますので、yes で進めます。

HylaFAX configuration parameters (part 1 of 2) are:

[ 1] Directory for applications:        /usr/local/bin
[ 2] Directory for lib data files:      /usr/local/lib/fax
[ 3] Directory for lib executables:     /usr/local/sbin
[ 4] Directory for system apps:         /usr/local/sbin
[ 5] Directory for manual pages:        /usr/share/man
[ 6] Directory for spooling:            /var/spool/hylafax
[ 7] Directory for uucp lock files:     /var/lock
[ 8] Uucp lock file scheme:             ascii
[ 9] PostScript imager package:         gs
[10] PostScript imager program:         /usr/bin/gs
[11] Manual page installation scheme:   bsd-source-cat
[12] Default page size:                 North American Letter
[13] Default vertical res (lpi):        98

Are these ok [yes]?

HylaFAX configuration parameters (part 2 of 2) are:

[14] Location of getty program:         /sbin/agetty
[15] Location of voice getty program:   /bin/vgetty
[16] Location of sendmail program:      /usr/sbin/sendmail
[17] Location of TIFF tools:            /usr/bin
[18] Location of SysV init scripts:     /etc/init.d
[19] Location of SysV start scripts:    ../rc2.d ../rc3.d ../rc4.d ../rc5.d
[20] Location of SysV stop scripts:     ../rc0.d ../rc1.d ../rc6.d
[21] Name of SysV start script:         S97hylafax
[22] Name of SysV stop script:          K05hylafax
[23] Init script starts faxq:           yes
[24] Init script starts hfaxd           yes
[25] Start paging protocol:             no
Are these ok [yes]?

この後 make を実行します。

make install をする前にひとつ確認しておくことがあります。本家の hylafax においては、セキュリティの観点から /etc/hylafax ある設定ファイルを /var/spool/hylafax/etc へ複写します。

ビルド環境では /usr/local/lib/fax ディレクトリが /etc/hylafax に相当するものになりますが、このディレクトリをバインドさせて利用するなら、あらかじめバインドしておかないと、make install で /var/spool/hylafax/etc 内に直接ファイルが生成されていまします。

ビルド環境ではバインドさせない(/var/spool/hylafax/etcに実態を置く)前提で構成されているようですが、そうすると /usr/local/lib/fax と /var/spool/hylafax/etc で、どちらにある設定が有効なのか分かりづらいので、筆者はすべて /usr/local/lib/fax に保持してバインドするようにしました。

その準備をします。inistallで生成されるはずディレクトリを先行して作成し、バインドさせます。

# mkdir -p /usr/local/lib/fax
# mkdir -p /var/spool/hylafax/etc
# mount --bind /usr/local/lib/fax /var/spool/hylafax/etc

そのまま make install してしまった後で修正したい場合は /var/spool/hylafax/etc 内のファイルのすべてを /usr/local/lib/fax に移動させればいいと思います。

設定

インストール後の設定を faxsetupコマンドから行います。これは、先のバインド設定の注意する点以外は 以前、hylafaxをインストールした際と同様ですので、簡単に説明します。

電話番号を国コードに81、LingDistancePrexixに0、AriaCodeに0を抜いた市外局番を設定します。

サーバープロセスを起動するか聞いてきます。これを yes にするとエラーになりますが、無視して問題ないです。

faxaddmodem の設定をするか聞いてくるので yes として設定を続けます。

モデムの設定で、再度電話番号を設定します。先ほどは市外局番まででしたが、今度は末尾まで設定します。

あとはおおむねデフォルト値で設定していきます。

TagLineFormat だけ "From %%l|%Y-%m-%d %T|Page %%P of %%T" と変更します。

faxsetup
...

Ok, time to setup a configuration file for the modem.  The manual
page config(5F) may be useful during this process.  Also be aware
that at any time you can safely interrupt this procedure.

Reading scheduler config file /var/spool/hylafax/etc/config.

Hey, there is an existing config file /var/spool/hylafax/etc/config.ttyACM0...

The non-default server configuration parameters are:

CountryCode:            81
AreaCode:               3
FAXNumber:              +81.3.9999.9999
LongDistancePrefix:     0
InternationalPrefix:    001
DialStringRules:        etc/dialrules
RingsBeforeAnswer:      1
SpeakerVolume:          off
GettyArgs:              "-h %l dx_%s"
LocalIdentifier:        "NothingSetup"
TagLineFont:            etc/LiberationSans-25.pcf
TagLineFormat:          "From %%l|%Y-%m-%d %T|Page %%P of %%T"
MaxRecvPages:           25

Are these ok [yes]? 

Probing for best speed to talk to modem: 38400 OK.

...
This modem looks to have support for Class 1, 1.0 and 2.
How should it be configured [1]?.
...
DTE-DCE flow control scheme [default]?
...
Are these ok [yes]?
...
Don't forget to run faxmodem(8C) (if you have a send-only environment)
or configure init to run faxgetty on ttyACM0.

configure another modem を no で抜けると、最後に Shuuld I run faxmodem for each configured modem ? と聞いてきます。今回設定したモデムに対して faxmodem を実行するかと同義なので yes(デフォルト)で進めます。

すべてが終わったら、バインドしてあったディレクトリを元に戻してみて、/var/spool/hylafax/etc/が空になるか確認します。その後、再度バインドします。

# umount /var/spool/hylafax/etc
...
# mount --bind /usr/local/lib/fax /var/spool/hylafax/etc

デフォルトではSysVで構成されているので、まずそれを利用してみます。

update-rc.d hylafax defaults

手動でhylafax(hfaxd,faxq)を起動します。

/etc/init.d/hylafax start

faxmodem または faxgettyを起動します。

# faxmodem ttyACM0
...
# faxgetty ttyACM0
...

hylafaxのアカウント管理

このままの状態だと、ローカルから sendfax などの操作を実行した時に管理者のパスワードを求められ、何を入力してもエラーになります。

これはユーザーアカウント管理用のファイルがない為なので、 /usr/local/lib/fax/hosts.hfaxd というファイルを次のように作成します。

/usr/local/lib/fax/hosts.hfaxd

localhost
127.0.0.1

この時ファイルのパーミッションは 600、所有者はhfaxdの起動ユーザー(uucp)である必要があるので変更します。グループはrootでも動きましたが、本家では uucp になっていました。

先の設定の場合ローカルホストからのアクセスはすべてパスワードなしで許可する設定になりますが、このの設定の他、ユーザー毎のアカウント制御に用いることもできます。詳しくはman man hosts.hfaxd や man faxadduser を確認してください。

また、設定ファイルの場所を変更したいなら /usr/local/lib/fax/hfaxd.conf に記述することで変更が可能です。

さらに、コンパイルの状況にもよりますが、PAMも利用可能です。その際は、/etc/pam.d/ ディレクトリに hylafax という名前で設定ファイルを用意します。

/etc/pam.d/hylafax

auth required pam_unix.so
account required pam_permit.so
session required pam_permit.so

pam_unix.so は OS のユーザーで認証をします。これを pam_permit.so にすると無制限に許可する状態になります。

PAM を利用する場合でも hosts.hfaxd は必要で、こちらで判定できない場合にPAMが利用される仕組みのようです。

hosts.hfaxd ファイルが無かったり権パーミッションの指定値が600でなかったり、読み込めなかったりする場合は、PAM認証にはならず、そのまま管理者権限のパスワードを求められます。

以上で利用可能になります。faxの送信や状況の確認の方法は hylafaxと同じですので、前回の記事を参照してください。

注意としては デフォルトで用意されている hylafaxプラスの SysVスクリプトは faxmodem の実行をしないので、再起動後に sendfax を実行しても ステータス W のままです。その際は faxmodem ttyACM0 とすることで動き出します。

サービス化

近年のDebianでは SysVはあまり使われないので、APT経由でインストールされている本家の hylafax を参考にサービスファイルを生成します。

もし SysVのスクリプトを使いたいようでしたら、スクリプトの中に、バインドマウントの記述と、送信のみなら faxmodem、送受信するなら faxgetty を含めたコードを追記しておく必要があります。

サービスファイルの配置場所はいろいろあると思いますが、今回はすべて、/etc/systemd/system/ に配置します。

まず、faxd と faxq を束ねる仮のサービスを作成します。

/bin/trueを実行すると終了コード0でサービスは終了してしまいますが、ACTIVEの状態を残すために RemainAfterExit=on の設定をしています。

hylafax.service

[Unit]
Description=HylaFAX

[Service]
Type=oneshot
ExecStart=/bin/true
ExecReload=/bin/true
RemainAfterExit=on

[Install]
WantedBy=multi-user.target

次に、hylafax.serviceに依存する hfaxd.serviceを作成します

hfaxd.service

[Unit]
Description=HylaFAX client-server protocol server
After=hylafax.service
PartOf=hylafax.service
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/sbin/hfaxd -d -i 4559
BindPaths=/usr/local/lib/fax:/var/spool/hylafax/etc
WorkingDirectory=/var/spool/hylafax
RestartSec=5s
Restart=on-failure

[Install]
WantedBy=hylafax.service

BinidPaths の部分で /usr/local/lib/fax の内容を /var/spool/hylafax/etc にバインドするように設定しています。

faxqもhylafaxサービスに依存させる形にします。

faxq.service

[Unit]
Description=HylaFAX queue manager process for outbound facsimile jobs
After=hylafax.service
PartOf=hylafax.service

[Service]
Type=forking
ExecStart=/usr/local/sbin/faxq
BindPaths=/usr/local/lib/fax:/var/spool/hylafax/etc
WorkingDirectory=/var/spool/hylafax

[Install]
WantedBy=hylafax.service

最後にfaxmodem とfaxgetty です。送信専用の時は faxmodem 送受信を行うなら faxgetty サービスを設定します。

こちらは、hylafaxサービスとは関連づけません。

faxmodem@.service

[Unit]
Description=Faxmodem on %I

[Service]
type=oneshot
ExecStart=/usr/local/sbin/faxmodem %I
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

faxgetty@.service

[Unit]
Description=Faxgetty on %I

[Service]
ExecStart=/usr/local/sbin/faxgetty %I
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

これらのサービスでは待機するモデム(ttyACM0)を可変にするために@と%Iを使います。

@以降にモデムのデバイス名を指定する事で、その値を%Iとして利用することができます。

念のため競合するinit.dの hylafaxを削除し(必要に応じてバックアップを取ってください)、サービスを有効化させます。

# update-rc.d hylafax remove
...
# rm /etc/init.d/hylafax
...
# systemctl enable hylafax.service
# systemctl enable hfaxd.service
# systemctl enable faxq.service
# systemctl enable faxgetty@ttyACM0.service

#サーバーの再起動なしにサービスを開始させるなら、
# systemctl daemon-reload
...

サービスのユニットファイルの説明等、一部でchatGPTの回答を利用しています。ファクトチェックを行ってはおりますが、誤りがあるかもしれません。あらかじめご了承ください。

筆者紹介


自分の写真
がーふぁ、とか、ふぃんてっく、とか世の中すっかりハイテクになってしまいました。プログラムのコーディングに触れることもある筆者ですが、自分の作業は硯と筆で文字をかいているみたいな古臭いものだと思っています。 今やこんな風にブログを書くことすらAIにとって代わられそうなほど技術は進んでいます。 生活やビジネスでPCを活用しようとするとき、そんな第一線の技術と比べてしまうとやる気が失せてしまいがちですが、おいしいお惣菜をネットで注文できる時代でも、手作りの味はすたれていません。 提示されたもの(アプリ)に自分を合わせるのでなく、自分の活動にあったアプリを作る。それがPC活用の基本なんじゃなかと思います。 そんな意見に同調していただける方向けにLinuxのDebianOSをはじめとした基本無料のアプリの使い方を紹介できたらなと考えています。

広告