プログラミング・システム

2013年9月18日 (水)

./configure && make && make install

久しぶりに諸々ソースからインストール。
確かに面倒っちくはあるけれど、
「あぁ、俺、今インストールしてるなぁ」
的な満足感(?)も得られてグッド。

| | コメント (0) | トラックバック (0)

2013年2月 5日 (火)

qmail_log2csv.php: qmailのログをcsvに変換する

お客さんとこのメール配信状況を確認することになったんだけど、今さらqmailanalogとか入れるのも何だし作った方が早いやと思ってサクッと書いてみた。しかもPHPで。美しくはないけどまぁ動きゃいいや、ってことでwink

<?php

/*

  qmail_log2csv.php

  usage: tai64nlocal < /var/log/qmail/current | php qmail_log2csv.php

  rev: 0.1
  Copyright (C) 2013 Satoshi Yamada http://www.dotAster.com/

*/

$fp = fopen('php://stdin', 'r');
while ($line = fgets($fp)) {
  list($date, $time, $msg) = explode(' ', chop($line), 3);
  $cmd = explode(' ', $msg);
  if ($cmd[0] == 'new' && $cmd[1] == 'msg') {
    $alt_id = $msg_id = $cmd[2];
    while (@is_array($log[$alt_id])) {
      $alt_id = "{$alt_id}_";
    }
    if ($msg_id != $alt_id) $log[$alt_id] = $log[$msg_id];
    $log[$msg_id] = array();
    $log[$msg_id]['new msg'] = "$date $time";
  } else if ($cmd[0] == 'info' && $cmd[1] == 'msg') {
    $msg_id = $cmd[2] - 0;    // 余分な':'を削除
    $log[$msg_id]['info msg'] = "$date $time";
    $log[$msg_id]['from'] = $cmd[6];
  } else if ($cmd[0] == 'starting' && $cmd[1] == 'delivery') {
    $msg_id = $cmd[4];
    $dlv_id = $cmd[2] - 0;    // 余分な':'を削除
    $log[$msg_id]['starting delivery'] = "$date $time";
    $log[$msg_id]['dlv_id'] = $dlv_id;
    $log[$msg_id]['to'] = $cmd[7];
  } else if ($cmd[0] == 'delivery') {
    $dlv_id = $cmd[1] - 0;        // 余分な':'を削除
    $delivery[$dlv_id]['delivery'] = "$date $time";
    $delivery[$dlv_id]['msg'] = implode(' ', array_slice($cmd, 2));
  } else if ($cmd[0] == 'end' && $cmd[1] == 'msg') {
    $msg_id = $cmd[2];
    $log[$msg_id]['end msg'] = "$date $time";
  }
}

$row = array(
  "msg_id",
  "new msg",
  "info msg",
  "from",
  "starting delivery",
  "dlv_id",
  "to",
  "delivery",
  "msg",
  "end msg",
);
echo implode(',', $row). "\r\n";
foreach ($log AS $msg_id => $data) {
  $dlv_id = $data['dlv_id'];
  $row = array(
    $msg_id,
    $data['new msg'],
    $data['info msg'],
    $data['from'],
    $data['starting delivery'],
    $data['dlv_id'],
    $data['to'],
    $delivery[$dlv_id]['delivery'],
    '"'. str_replace('"', '""', $delivery[$dlv_id]['msg']). '"',
    $data['end msg'],
  );
  echo implode(',', $row). "\r\n";
}

// vi:ts=8 sw=2

以下、注意点。

  • tai64nlocalの結果を流し込むことを想定してます
  • 配列にためていくのでメモリ食います
  • 再送の判断はしてません

色々と足りない部分はあるとは思うけど、とりあえずはこれで充分だったので…

「qmail_log2csv.php」をダウンロード

| | コメント (0) | トラックバック (0)