Dovecotのpush_notificationを使う前にソースからのビルドが必要だった話
- 2023/01/20
- aikawa
Dovecotのイベントごとにプッシュ通知をするpush_notificationという機能が有ったので、やってみようと思ったら、CentOS Stream 9 の Dovecot(rpm)はLuaをサポートしていないため、mail-luaプラグインを使おうとするとエラーになりました。
OXもchronosもDovecot Pro用なので動かず、dlogはdebug_logに出力するだけなので、ちょっと動かす意味が薄そうです。
そこで、ソースからビルドする事になりました。
因みにどんなイベントをキャッチできるかというと、以下のようです。
使い道がぱっとは考え付かないですが、統計取ったりするのに役立つかも知れません。
- フラグクリア
- フラグセット
- メールボックス作成
- メールボックス削除
- メールボックスの名前変更
- メールボックス購読
- メールボックス購読解除
- メッセージ追加
- MessageExpunge
- メッセージNew
- メッセージ読み取り
- メッセージゴミ箱
ビルド
こちらからソースファイルをダウンロードします(現時点では2.3.20)。
luaは使うのでオプションに含むのですが、他にも主だったものは入れておきたいので、configureは以下のようにしました。
./configure --with-ldap --with-pam --with-sql --with-solr --with-pgsql --with-sqlite --with-mysql --with-luaそこで依存関係をdnfでインストールします。Luaはオプションもいずれ使うだろうし、lua-*で全部入れておきます。
dnf install openldap-devel pam-devel expat-devel libpq-devel mariadb-connector-c-devel sqlite-devel lua lua-*早速 ./configureをしてみた所エラーが。
configureに必要な肝心のlua-develが無いっぽいです。
EPELにLua5.1版が有ったので試したんですが、Dovecot 2.3.15でLua5.2までのサポートを切っているのでconfigureまでは通るんですが、makeでエラーが出てしまいました。
さてどうしようと思ったところ、CRBリポジトリに有るという話が。早速入れてみます。
dnf install lua-devel --enablerepo=crbここでmakeしても同じエラーが出て、あれっと思い暫く色々とやった結果、再度configureが必要なだけのようでした。Lua5.1版のファイルを見てたんですね。
で、makeが長い。VirtualBoxでやった所30分くらい掛かっていました。make installもそこそこ長いです。
tar xzf dovecot-2.3.20.tar.gz
cd dovecot-2.3.20/
./configure --with-ldap --with-pam --with-sql --with-solr --with-pgsql --with-sqlite --with-mysql --with-lua
make
make installこれで/usr/localにインストールされます。でもsystemctlの設定は上書きしてしまうようなので、dovecotは停止しておきましょう。
設定
設定ファイルを置く/usr/local/etc/dovecot/ は当初空なので、サンプルが有るのでそちらをコピーするか、使っていた設定をコピーします。
# サンプルをコピーするなら
cp -r /usr/local/share/doc/dovecot/example-config/* /usr/local/etc/dovecot/
# すでに動いている/etc/dovecotからコピーするなら
cp -r /etc/dovecot/* /usr/local/etc/dovecot/- /usr/local/etc/dovecot/conf.d/10-mail.conf
mail_plugins = $mail_plugins quota mail_lua notify push_notification push_notification_lua- /usr/local/etc/dovecot/conf.d/90-plugin.conf
plugin {
push_notification_driver = lua:file=/home/vmb/dovecot-push.lua
push_notification_driver2 = dlog
}virtualドメインのユーザはvmbで動かしているので、/home/vmbに取り合えずluaファイルを(実行権限を付けて)置きます。
- /home/vmb/dovecot-push.lua
#!/usr/bin/lua
os.execute("/usr/bin/php /home/vmb/dovecot-push.php");Luaの使えない私は、PHPを呼び出して動くかどうかを見ます。
- /home/vmb/dovecot-push.php
<?php
$str = print_r($_SERVER, 1);
file_put_contents(__DIR__."/push.log", $str, LOCK_EX);
echo $str;ここでdovecotを起動・またはリロードします。
# 起動
/usr/local/sbin/dovecot
# リロード
/usr/local/sbin/dovecot reloadRoundCubeでフォルダの購読をオンオフ等してみて、/home/vmb/push.logが出来れば取り合えず動いている事が確認出来ます。出力は以下のようになりました。
Array
(
[PROCESS_MIN_AVAIL] => 0
[DOVECOT_CHILD_PROCESS] => 1
[SOCKET0_SETTINGS] => imap
[SOCKET_COUNT] => 2
[LOG_DEBUG] =>
[STATS_WRITER_SOCKET_PATH] => /usr/local/var/run/dovecot/stats-writer
[CONFIG_FILE] => /usr/local/var/run/dovecot/config
[PWD] => /var/spool/mail/vhosts/virtual.localdomain/aikawa
[LOG_SERVICE] => 1
[SERVICE_COUNT] => 1
[GENERATION] => 35
[PROCESS_LIMIT] => 1024
[SERVICE_NAME] => imap
[DOVECOT_HOSTDOMAIN] => localhost
[CLIENT_LIMIT] => 1
[IDLE_KILL] => 60
[RESTRICT_SETEXTRAGROUPS] => 97
[DOVECOT_HOSTNAME] => localhost.localdomain
[SHLVL] => 0
[DOVECOT_VERSION] => 2.3.20
[SOCKET1_SETTINGS] => imap-master
[DOVECOT_PRESERVE_ENVS] => TZ CORE_OUTOFMEM CORE_ERROR
[_] => /usr/bin/php
[PHP_SELF] => /home/vmb/dovecot-push.php
[SCRIPT_NAME] => /home/vmb/dovecot-push.php
[SCRIPT_FILENAME] => /home/vmb/dovecot-push.php
[PATH_TRANSLATED] => /home/vmb/dovecot-push.php
[DOCUMENT_ROOT] =>
[REQUEST_TIME_FLOAT] => 1674196790.2264
[REQUEST_TIME] => 1674196790
[argv] => Array
(
[0] => /home/vmb/dovecot-push.php
)
[argc] => 1
)pwdからユーザくらいは特定出来そうですが、何のイベントかまでは分からないようなので、次回はluaを使ってイベントごとに取得出来るようにしたいです。