user icon

Dovecotのpush_notificationを使う前にソースからのビルドが必要だった話

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 reload
RoundCubeでフォルダの購読をオンオフ等してみて、/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を使ってイベントごとに取得出来るようにしたいです。
Facebooktwitterlinkedintumblrmail

タグ:

名前
E-mail
URL
コメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)