読者です 読者をやめる 読者になる 読者になる

Folioscope

プログラミング/Unix系/デザイン/CG などのメモがもりもり

ACアダプタの抜き挿しをデスクトップ通知する

f:id:ibenza:20150112144736p:plain

全体の構成

ACアダプタを抜き挿しからデスクトップ通知までの流れは、大体次のようになる。 少し複雑だが、汎用性とカスタマイズ性とお行儀を考えて、journal経由にした。

              event            logger
[AC adapter] ------> [acpid] ---------> |         |
                                        | journal |
[Desktop] <---------------------------- |         |   
           notify-send       journalctl

各モジュールを少し整理する。

ACPI

ACPI (Advanced Configuration and Power Interface) とは、 簡単に言うとハードウェアの各構成要素を管理するインターフェイスで、 acpidはそのデーモン。 acpidで電源プラグのイベントをキャッチできる。

journal

journalとはsystemdで採用されたログシステムで、従来のsyslogや /var/log/messages に変わるもの。 journalctlはjournalのログを見るためのコマンドで、loggerコマンドでログへ出力できる。

ACPIのイベントを記述

どのハードウェアでどんなイベントが発生するかは、acpi_listenコマンドで確認できる。

$ acpi_listen

このコマンド実行中、ACアダプタを抜き挿しすると対応するイベントが表示される。

# ADアダプタを抜いた時
ac_adapter ACPI0003:00 00000081 00000000

# ADアダプタを挿した時
ac_adapter ACPI0003:00 00000081 00000001

それぞれのイベントに対するアクションを、/etc/acpi/events/以下のファイルに記述する。 後でフィルタしやすいよう、タグnotifyを付けてloggerする。 ファイル名は適当でOK。

# /etc/acpi/events/ac-unpluged
event=ac_adapter ACPI0003:00 00000081 00000000
action=logger -t notify 'AC unplugged'
# /etc/acpi/events/ac-pluged
event=ac_adapter ACPI0003:00 00000081 00000001
action=logger -t notify 'AC plugged'

そしてacpidを再起動。

$ sudo systemctl restart acpid.service

journalctlnotifyが付いているログを確認する。 この状態でACアダプタを抜き挿しするとログに表示されるはず。

$ journalctl --follow --identifier=notify
Jan 12 14:06:53 hostname notify[27738]: AC unplugged
Jan 12 14:07:00 hostname notify[27779]: AC plugged
Jan 12 14:15:44 hostname notify[28598]: AC unplugged
Jan 12 14:15:49 hostname notify[28637]: AC plugged

journalctlを監視して通知する

journalctl--followオプションを付けて、sedでメッセージを抜き出して、notify-sendでデスクトップ通知する。 .xinitrcにでも書いておき、バックグラウンドで実行しておこう。

journalctl --follow --identifier=notify --line=1 \
  | sed -u -e 's/.*: \(.*\)$/\1/g' \
  | while read -r line; do notify-send -t 2000 "$line"; done &

今回はACアダプタのみにイベントを書いたが、もちろんACPIがキャッチできるイベントなら、通知することができる。 例えばラップトップの開閉や、バッテリーの着脱など。 またACPI以外でも、journalにログを吐くサービスならデスクトップ通知できる。 例えばHDDの状態を監視するS.M.A.R.T.デーモンsmartdなど。