先日、自宅サーバーのOSをFreeBSD13.5から14.4へ更新しました。
その時のトラブル内容はメモに残しましたが、今回は新規遭遇した症状の個別メモ。
FreeBSD14.x(正確にいつからかは把握していません)ではメールサービスが、sendmail から DragonFly Mail Agent に変更され、互換性を保つために /etc/mail/mailer.conf でsendmailラッパーが指定されている模様。
</etc/mail/mailer.conf>
# # mailer.conf for use with dma(8) # # If sendmail is configured, an example of mailer.conf that uses sendmail # instead can be found in /usr/share/examples/sendmail. sendmail /usr/libexec/dma mailq /usr/libexec/dma newaliases /usr/libexec/dma
システムレベルでメール自動転送しようとすると、通常は /etc/aliases (→ /etc/mail/aliases へのリンク)でコントロールします。以下は、/etc/aliases の一部ですが、ftp ユーザー宛のメールがroot へ自動転送されるようにデフォルト設定されている事がわかります。ネスティングも可能で、ftp-bugs 宛に送ると、ftp→root へと自動転送されるわけです。
# SUPPORT MAILBOX NAMES FOR SPECIFIC INTERNET SERVICES ftp: root ftp-bugs: ftp # hostmaster: root # webmaster: root # www: webmaster
aliases ファイルの中には、次の記述もあって、# が付けられていて無効行ですが、#を外すと、メールが msgs コマンドにパイプされるようになっています。
# NOTE: /var/msgs and /var/msgs/bounds must be owned by sendmail's
# DefaultUser (defaults to mailnull) for the msgs alias to work.
#
#msgs: "|/usr/bin/msgs -s"
# を外すだけでは有効にならず、newaliases コマンドを発行すると、aliases の中身が解析されて、実際の転送用データベースに反映される仕組み。
14.4へ更新後、なぜか maillog にエラーが発生していました。「aliases line 100: syntax error」100というのはエラーが検出された行ですけど、本番サーバーでの行番号。下記再現環境で、75行目の#を外して、newaliases を実行すると、、、、
72 # NOTE: /var/msgs and /var/msgs/bounds must be owned by sendmail's 73 # DefaultUser (defaults to mailnull) for the msgs alias to work. 74 # 75 msgs: "| /usr/bin/msgs -s" aliases: 79 lines, 1661 characters root:/etc/mail # newaliases aliases line 74: syntax error newaliases: could not parse aliases file `/etc/aliases': No error: 0
「|」の後ろのスペースがダメなのか?と”|/user….”と続けてみたもののダメ。コロンの後をスペースにしてみたり、互換性を保って出来そうな書式を何パターンか試したもののダメ。man dma でヘルプを見たり、検索してみたものの、syntax error は続く。ちなみに、表示されるエラー行と、該当行番号は1行ずれています。
パイプの記述に関しては互換性がないんじゃないの?
サーバー運用上、msgs コマンドへのパイプなんてどうでもよくて、問題は FreeBSDでメーリングリストを運用しているケース。”|”の記述が出来ないとDMAではメーリングリストを運用できないじゃない!どこかに説明書はないものか?
もう少し調査してみようかとは思っているものの、現状、sendmail ラッパー をやめて 13.x の状態に戻して運用をしているので、この方法での回避でいいと思うものの、また次回更新時に勝手に sendmail → dma に変えられると嫌だな~。
追記:
更に調べてみたところ、パイプ「|」と閉じるクォート「”」の間にスペースが無ければ、newaliases が通ることを発見。
msgs: "|/usr/bin/msgs"
と、-s を抜いてみたところ、エラーが出ませんでした。
解決か?そんなわけはない。コマンドにオプション指定するのは普通の話。おそらく、オプション付きコマンドをスクリプト化(バッチ化)して、それをコールするようにすれば、newaliases は通りそうな雰囲気。まだ試していないから結論は出せないけど、仮にそれでnewaliases が通るようになったとして、それで妥協すべき?
いや~、どうしてもDMAを使わざるを得ない状況なら回避策としては許容できるかもしれないけど、それが標準になるのは嫌だな~。