Scanner Button Daemon
ハンディスキャナは大抵「受動的」なデバイスです。適切なアプリケーションを使うことで上手く動作しますがボタンだけでは使うことができません。
scanbd はスキャナについているスキャナボタンを活用してスキャナを管理します (ただしボタンが sane によってサポートされている必要があります)。
イントロダクション
scanbd (scanner button daemon) はスキャナと定期的に通信するためデバイスはロックされます。他のアプリケーションは (/dev/
を開いたり libusb などを使って) デバイスに直接アクセスできなくなります。
この問題を解決するため、別のデーモンを使用します (scanbd のマネージャモード)。他のアプリケーションからスキャナを使うことを考えて、scanbm をスキャナにアクセスするための「プロキシ」として設定し、他のスキャンアプリケーションがスキャナを使っているときはポーリングを停止します。
そのために scanbm を saned の代わりになるネットワークスキャニングデーモンとして設定します。sane のポートからスキャン要求が scanbm に届くと、scanbm はポーリングを実行する scanbd デーモンに dbus シグナルを送信してポーリングを停止させます。それから本当の saned を起動してスキャンが実行され、それから要求を行ったアプリケーションにデータが送信されます。その後に scanbm は scanbd に dbus シグナルを送信してポーリングを再開します。
scanbd をセットアップするには sane のデフォルト設定を変更するだけでなくアクションスクリプトの定義も必要になります (スキャナのボタンが押されたときに何を実行するかを定義します)。
scanbd の代替として scanbuttond なども存在しますが、最近はメンテナンスが止まっています。
インストール
バージョン 1.3 現在、scanbd は systemd のサービスアクティベーションに完全に対応しており scanbm (scanbd のマネージャモード) を起動するのに inet や xinetd は不要です。
Sane の設定
scanbd と saned はスキャナが接続された同一のマシン上で動作するため、saned の設定を2セット用意する必要があります。デフォルトの設定ディレクトリ (/etc/sane.d/
) の設定ではローカルアプリケーションを (systemd が listen する) ネットワークソケットに転送し、接続されたスキャナに sane バックエンドからアクセスするときは別の設定ディレクトリ (/etc/scanbd/sane.d/
) の設定を使用します。
まず、/etc/sane.d/
の設定ファイルを全て /etc/scanbd/sane.d/
にコピーしてください (後で必要になります):
# cp /etc/sane.d/* /etc/scanbd/sane.d/
/etc/sane.d/dll.conf
を編集して "net" ディレクティブだけ残してください (他のディレクティブは消去するか # 記号でコメントアウトしてください):
/etc/sane.d/dll.conf
net
net バックエンドの設定ファイルを編集してください (詳しい設定方法については scanbd の README.txt を参照):
/etc/sane.d/net.conf
connect_timeout = 3 localhost # scanbm is listening on localhost
これで (libsane を使用する) デスクトップアプリケーションは net バックエンドだけを使うようになります。ローカルに接続されたスキャナが直接使われることはなくなります。
標準の sane のネットワークソケットに接続要求が来ると、systemd は scanbm (scanbd のマネージャモード) を起動して、それから scanbd はスキャナのポーリングを停止して、別の設定ディレクトリを使用して saned が起動します。
最後に /etc/scanbd/sane.d/dll.conf
の設定を修正します: "net" ディレクティブをコメントアウトして適切なスキャナバックエンドをアンコメントしてください:
/etc/scanbd/sane.d/dll.conf
#net pixma epson2 #... whatever other scanner backend needed ...
設定が完了したら scanbm の systemd ユニットを起動・有効化してください:
# systemctl enable scanbd.service # systemctl start scanbd.service # systemctl start scanbm.socket
scanbd サービスと scanbm ソケットが動作しているかどうかは /var/log/everything
で確認できます。デバッグするときは /etc/scanbd/scanbd.conf
の debug-level = 7
を変更して scanbd サービスを再起動してください。
scanbd の設定
運が良ければ何も設定しなくてもスキャナが機能し、ボタンが押されたときに何を実行するか定義するアクションスクリプトを修正するだけでことが足りる場合があります。
scanbm はスキャナの状態を確認して、受け取ったメッセージから何をするべきか判断します。標準の挙動は /etc/scanbd/scanbd.conf
に定義されています。例えばスキャンアクションの場合:
action scan { filter = "^scan.*" numerical-trigger { from-value = 1 to-value = 0 } desc = "Scan to file" script = "test.script" }
スキャナから送られたメッセージに "scan" という単語が含まれていて値が 1 から 0 に変更されたときに /etc/scanbd/test.script
スクリプトを実行します。
/etc/scanbd/test.script
は何もせず syslog にメッセージを送ります:
/etc/scanbd/test.script
#!/bin/bash # look in scanbd.conf for environment variables logger -t "scanbd: $0" "Begin of $SCANBD_ACTION for device $SCANBD_DEVICE" # printout all env-variables /usr/bin/printenv > /tmp/scanbd.script.env logger -t "scanbd: $0" "End of $SCANBD_ACTION for device $SCANBD_DEVICE"
/etc/scanbd/
には他にもスクリプトが存在しており、中には実際にスキャンを実行するスクリプトも存在します。
また、/etc/scanbd/scanbd.conf
には "include" ディレクティブが含まれており、少数ながらプリンターの事前定義済みボタンの設定を参照しています:
$ cat /etc/scanbd/scanbd.conf | grep include\(
# include("scanner.d/myscanner.conf") # include("/my/long/path/myscanner.conf") include(scanner.d/avision.conf) include(scanner.d/fujitsu.conf) include(scanner.d/hp.conf) include(scanner.d/pixma.conf) include(scanner.d/snapscan.conf)