#!/bin/bash # 実行時刻 inow=$(date +%s) now=$(date --date "@${inow}" -u '+%Y-%m-%d %H:%M:%S UTC') # 出力ディレクトリ OUTDIR="/var/www/html/rrd" RRD="$OUTDIR/wis.rrd" # 自スクリプトのディレクトリ BASEDIR="$(cd "$(dirname "$0")" && pwd)" # Rubyスクリプト WNM="$BASEDIR/wis-wnmtime.rb" TOP="$BASEDIR/wis-toppage.rb" BRW="$BASEDIR/wis-browse.rb" # 値取得 v_wnm=$(ruby "$WNM") v_top=$(ruby "$TOP") v_brw=$(ruby "$BRW") # 空なら欠損を示すUに変える : ${v_wnm:=U} : ${v_top:=U} : ${v_brw:=U} # 異常値しきい値 set -- $(cat ${OUTDIR}/wis-thr.txt || echo 13.0 4.0 310) T_WNM=${1:?} T_TOP=${2:?} T_BRW=${3:?} # ------------------------ # RRD作成(初回のみ) # ------------------------ if [ ! -f "$RRD" ]; then rrdtool create "$RRD" \ --step 300 \ DS:wis_wnmtime:GAUGE:600:0:U \ DS:wis_toppage:GAUGE:600:0:U \ DS:wis_browse:GAUGE:600:0:U \ RRA:AVERAGE:0.5:1:288 \ RRA:MAX:0.5:1:288 \ RRA:MAX:0.5:12:2400 fi # ------------------------ # 更新 # ------------------------ rrdtool update "$RRD" "N:${v_wnm}:${v_top}:${v_brw}" # ------------------------ # グラフ(24時間) # ------------------------ rrdtool graph "$OUTDIR/wis.png" \ --start -86400 \ --title "WIS Status (24h)" \ --vertical-label "seconds (log)" \ --logarithmic \ DEF:wnm="$RRD":wis_wnmtime:AVERAGE \ DEF:top="$RRD":wis_toppage:AVERAGE \ DEF:brw="$RRD":wis_browse:AVERAGE \ LINE2:wnm#FF0000:"wnmtime" \ LINE2:top#0000FF:"toppage" \ LINE2:brw#00AA00:"browse" \ GPRINT:wnm:MAX:"wnm.max=%6.1lf" \ GPRINT:brw:MAX:"brw.max=%6.1lf" \ > /dev/null # ------------------------ # グラフ(10日 = 864000秒) # ------------------------ rrdtool graph "$OUTDIR/wisd10.png" \ --start -864000 \ --title "WIS Status (10 days)" \ --vertical-label "seconds" \ DEF:wnm="$RRD":wis_wnmtime:MAX \ DEF:top="$RRD":wis_toppage:MAX \ DEF:brw="$RRD":wis_browse:MAX \ LINE2:wnm#FF0000:"wnmtime" \ LINE2:top#0000FF:"toppage" \ LINE2:brw#00AA00:"browse" \ GPRINT:wnm:MAX:"wnm.max=%6.1lf" \ GPRINT:brw:MAX:"brw.max=%6.1lf" \ > /dev/null # ------------------------ # 異常値判定 # ------------------------ # 状態ファイル STATE_FILE=${OUTDIR}/wis_state.txt cur_state=OK c_wnm=ok c_top=ok c_brw=ok if [[ "$v_wnm" != "U" ]] && (( $(echo "$v_wnm > $T_WNM" | bc -l) )) then cur_state=ALERT c_wnm=alert fi if [[ "$v_top" != "U" ]] && (( $(echo "$v_top > $T_TOP" | bc -l) )) then cur_state=ALERT c_top=alert fi if [[ "$v_brw" != "U" ]] && (( $(echo "$v_brw > $T_BRW" | bc -l) )) then cur_state=ALERT c_brw=alert fi # 前回実行結果の状態を取得 prev=$(cat "$STATE_FILE" 2>/dev/null || echo OK) subj='' headline='' if [ "$cur_state" != "$prev" ]; then if [ "$cur_state" = "ALERT" ]; then subj="[Alert]WIS監視閾値超過" headline="WIS監視で閾値を超過しました。" else subj="[Recovery]WIS監視正常化" headline="WIS監視で閾値超過が解消しました。" fi echo "$cur_state" > "$STATE_FILE" { echo "Subject: ${subj}" echo "To: news" echo "From: news (WISmon/$(hostname --short))" echo "" echo "$headline" echo "" echo "wnm=$v_wnm ($c_wnm)" echo "top=$v_top ($c_top)" echo "brw=$v_brw ($c_brw)" echo "閾値: wnm=$T_WNM top=$T_TOP brw=$T_BRW" echo "Time: $now" echo "Monitor: $(hostname)" } | /usr/sbin/sendmail -t fi # ------------------------ # HTMLレポート # ------------------------ cat > "$OUTDIR/wis.html" < WIS Monitoring

JMA WIS の状態

更新: $now

現在値 (秒)

閾値: wnm=$T_WNM top=$T_TOP brw=$T_BRW

グラフ

直近24時間 (縦軸対数)

直近10日間


EOF