syslog mail通知(デフォルトターゲット:snort)

■syslogメール通知
 各オプション指定時間前(1日前/1時間前/10分前)のsyslogのデーモンのログをシステムメールで飛ばします。

 gihub
 https://raw.github.com/labunix/snort_log/master/syslog2mail.sh

$ w3m -dump https://raw.github.com/labunix/snort_log/master/syslog2mail.sh > syslog2mail.sh
$ chmod +x syslog2mail.sh
$ sudo ./syslog2mail
Usage: ./syslog2mail.sh [d|h|m]

$ sudo ./syslog2mail d

$ sudo grep -A 10 ^Subject /var/spool/mail/`whoami` | grep -v "Message-Id" | sed s/"\. "/"&\n"/g
Subject: snort 1 days ago report
Date: Wed,  8 Aug 2012 01:48:58 +0900 (JST)
From: root@vmsqueeze.labunix.net (root)

Aug  7 15:19:33 vmsqueeze snort[8033]: S5: Pruned session from cache that was using 1058160 bytes (new data/timedout).
172.16.56.22 15878 --> 192.168.188.33 48385 (0) : LWstate 0x40e LWFlags 0x216007

$ env EDITOR=vim crontab -l
MAILTO=""
*/10 * * * * /usr/local/bin/myscripts/syslog2mail.sh m

■10分前のロジックが面倒なので、補足します。
 デバッグの行のコメントアウトを外すと以下のように出ます。

$ sudo ./syslog2mail.sh m;date '+%T'
DEBUG
Aug *8 02\:5[0-9]\:[0-9][0-9]
03:01:15

※ 繰り下がりはdateコマンドの出力が正確さに依存します。
  スクリプト中の加減算を無くしたので、5059分に実行しても、0009分に実行しても心配ありません。
  考えられる組み合わせは、次の6通り。0[0-9]1[0-9]2[0-9]3[0-9]4[0-9]5[0-9]

 上記理由から、n日前とかn時間前とかn分前もやろうかと思いましたが、
 「〜どこまで」をサポートするのが大変なので止めました。

■ソースは以下でも。

$ cat syslog2mail.sh
#!/bin/bash
# Last Update   :       2012/08/08
# Author        :       labunix
# Description   :       syslog to mail
#               :       default target : snort
#               :       Usage : ./syslog2mail [d|h|m]
#               :       d       1 days ago
#               :       h       1 hour ago
#               :       m       10 min ago
# License       :       GNU General Public License

function varclean() {
  unset MAILTO MYMSG MYLOG SYSLOG MYOPT MYLOG TARGET USAGE
  unset MYMINMSG MYMIN MYHOURMSG MYHOUR MYDAYMSG MYDAY
}

USAGE="Usage: $0 [d|h|m]"
# arg check
if [ "$#" -lt "1" ];then
  echo "$USAGE"
  varclean
  exit 1
fi

TARGET="snort"
MYLOG="/var/log/trapmail.log"
SYSLOG="/var/log/syslog"
MAILTO="root@`hostname -f`"

# you must be root
if [ `id -u` -ne "0" ] ;then
  echo "Sorry,Not Permit User!"
  varclean
  exit 1
fi

# 1 days ago
MYDAYMSG='1 days ago'
MYDAY=`env LANG=C date -d "${MYDAYMSG}" '+%b %d' | \
   awk '{print $1" *"$2+0" [0-9][0-9]\\\:[0-9][09]\\\:[0-9][0-9]"}'`

# 1 hour ago
MYHOURMSG='1 hour ago'
MYHOUR=`env LANG=C date -d "${MYHOURMSG}" '+%b:%d:%T' | \
   awk -F\: '{print $1" *"$2+0" "$3"\\\:[0-9][09]\\\:[0-9][0-9]"}'`

# 10 min ago -> 0-9min
MYMINMSG='10 min ago'
MYMIN=`env LANG=C date -d "${MYMINMSG}" '+%b:%d:%T' | \
   awk -F\: '{print $1" *"$2+0" "$3"\\\:"($4-($4%10))/10"[0-9]\\\:[0-9][0-9]"}'`

case $@ in
d)
  MYOPT=$MYDAY;
  MYMSG="${MYDAYMSG}";
  # echo -e "DEBUG\n$MYOPT";exit 0
  ;;
h)
  MYOPT=$MYHOUR;
  MYMSG="${MYHOURMSG}"
  # echo -e "DEBUG\n$MYOPT";exit 0
  ;;
m)
  MYOPT=$MYMIN;
  MYMSG="${MYMINMSG}"
  # echo -e "DEBUG\n$MYOPT";exit 0
  ;;
*)
  echo "$USAGE"
  varclean
  exit 1
esac
# line not 0 check
if [ `wc -l < $SYSLOG` -eq "0" ];then
  varclean
  exit 1
fi

test -r ${SYSLOG} && \
  grep "^${MYOPT} `hostname -s` ${TARGET}" ${SYSLOG} > ${MYLOG}

# line not 0 check
test -r ${MYLOG} || exit 1
if [ `wc -l < ${MYLOG}` -eq "0" ];then
  varclean
  exit 1
fi

cat "$MYLOG" | mail -s "$TARGET $MYMSG report" "$MAILTO"
test -f "$MYLOG" && rm -f "$MYLOG"
varclean
exit 0