どさにっき IoT 〜2016年3月上旬〜

by やまや
<< = >>

2016年3月8日(火)

postqueue -j

_ postfix 3.1 でキューを JSON 形式で出力できるようになった件。もすこし詳しく。

_ 実際の出力はこんな感じ。jq をかませて読みやすくしてるけど、実際はキュー1個につき1行で出力される。

% postqueue -j | jq .
{
  "queue_name": "hold",
  "queue_id": "3qDrfV1xKRz3Ztt",
  "arrival_time": 1456819639,
  "message_size": 286,
  "sender": "MAILER-DAEMON",
  "recipients": [
    {
      "address": "foo@example.com"
    },
    {
      "address": "bar@example.net"
    }
  ]
}
この例では recipients の配列が冗長に見えるけど、これは強制的にキューから出ていかないようにしてるためで、通常の利用なら address のほかに delay_reason というキーも見えるはず。

_ 利用例いくつか。

_ postsuper(1) の man には、宛先が複数ではなく単独の user@example.com であるメールをキューを削除する例として、従来の mailq (postqueue -p) を用いた以下のようなコマンドが紹介されている。

              mailq | tail +2 | grep -v '^ *(' | awk  'BEGIN { RS = "" }
                  # $7=sender, $8=recipient1, $9=recipient2
                  { if ($8 == "user@example.com" && $9 == "")
                        print $1 }
              ' | tr -d '*!' | postsuper -d -
これは postqueue -j を使って書くと以下のようになる。
postqueue -j | jq -r 'select(.recipients | length==1) | select(.recipients[0].address=="user@example.com").queue_id' | postsuper -d -
うーん。可読性は上がった…かなぁ? 宛先がひとつだけのメールを選択し、そのアドレスが user@example.com であるものを選択し、という流れはわかることはわかるんだけど、なんかゴチャゴチャしてる感が。同じことを jq じゃなくて ruby でやると、
postqueue -j | ruby -rjson -ne 'q=JSON.load($_); puts q["queue_id"] if q["recipients"].size==1 && q["recipients"][0]["address"] == "user@example.com"' | postsuper -d -
長いけどこっちの方がわかりやすいかな?

_ なお、キュー全体として1個の JSON オブジェクトが出力されるのではなく、キュー1個に対して JSON オブジェクト1個が出力される。ので、キューに対して機械的に何か処理させるような場合は複数のオブジェクトが入力されることを想定して記述する必要がある。たとえば以下はコケる。

postqueue -j | ruby -rjson -e 'p JSON.load($<.read)'
以下のように1行(=キュー1個)ずつ処理するように書く。
postqueue -j | ruby -rjson -e '$<.each{|l| p JSON.load(l)}'
あるいは以下のように出力を自前で配列化すればよい。
postqueue -j | ruby -rjson -e 'p JSON.load("["+$<.readlines.join(",")+"]")'
配列化するにはいったん jq を間にはさむというのもアリ。上のいちばん古いキューを探す例でも使ってるけど、jq には複数の JSON オブジェクトを受けとってひとつの配列としてまとめてくれるオプション(-s)がある。
postqueue -j | jq -s . | ruby -rjson -e 'p JSON.load($<.read)'

_ これまではキューの滞留監視をするのに mailq の出力を parse するのがめんどくさくて、showq を改造して監視に必要な情報だけを返すデーモンというのを作って動かしてたんだけど、3.1 からは完全に用済みになることが確定。問題は、このバージョンにリプレースできるのがいつになるかだな。

_ で、そんなことより、ドキュメント読んでたら作者のクレジットがががが。

      Wietse Venema
      Google, Inc.
      111 8th Avenue
      New York, NY 10011, USA
えー??? いつのまにやら IBM 辞めて google に転職してるー!? どうやら 去年の3月だったようで。えー、ぜんぜん気付いてなかった。


<< = >>
やまや