■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コマンドの出力が正確さに依存します。
スクリプト中の加減算を無くしたので、50〜59分に実行しても、00〜09分に実行しても心配ありません。
考えられる組み合わせは、次の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
function varclean() {
unset MAILTO MYMSG MYLOG SYSLOG MYOPT MYLOG TARGET USAGE
unset MYMINMSG MYMIN MYHOURMSG MYHOUR MYDAYMSG MYDAY
}
USAGE="Usage: $0 [d|h|m]"
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`"
if [ `id -u` -ne "0" ] ;then
echo "Sorry,Not Permit User!"
varclean
exit 1
fi
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]"}'`
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]"}'`
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}";
;;
h)
MYOPT=$MYHOUR;
MYMSG="${MYHOURMSG}"
;;
m)
MYOPT=$MYMIN;
MYMSG="${MYMINMSG}"
;;
*)
echo "$USAGE"
varclean
exit 1
esac
if [ `wc -l < $SYSLOG` -eq "0" ];then
varclean
exit 1
fi
test -r ${SYSLOG} && \
grep "^${MYOPT} `hostname -s` ${TARGET}" ${SYSLOG} > ${MYLOG}
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