tmux のステータスバーに nagios アラートの内容を表示

アラートが発砲した際に、tmux のステータスバーに内容を表示するようにした話。

監視は nagios でやっており、アラートメールの内容は以下の感じ。

Subject: *** PROBLEM (blog.kteru.net) HTTP is CRITICAL ***

***** TERU Nagios *****

PROBLEM

Service : HTTP
Host    : blog.kteru.net
Client  : blog.kteru.net
Address : 219.94.233.178
State   : CRITICAL
Time    : Mon May 6 17:55:44 JST 2013
Info    : CRITICAL - Socket timeout after 10 seconds

このアラートメールを tmux を起動しているホストに転送するようにし、.forward でシェルスクリプトに渡す。

/home/teru/.forward

"| /home/teru/bin/tmux_pat.sh"

/home/teru/bin/tmux_pat.sh

#!/bin/sh
#
#
#
#
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/sbin:/usr/sbin
export PATH
DIR_BASE=$(cd $(dirname ${0}); pwd)


# get params
MAIL_BODY=`cat`
SUBJECT=`echo "${MAIL_BODY}" | grep -m 1 -A 1 "^Subject:" | tr -d '\r\n'`


# メール内容からステータスバーの内容を変更
_tmux_alert() {
  _host=`echo "${MAIL_BODY}" | grep -m 1 "^Host" | sed -e 's/^Host\s*:\s*\(.*\)$/\1/'`
  _client=`echo "${MAIL_BODY}" | grep -m 1 "^Client" | sed -e 's/^Client\s*:\s*\(.*\)$/\1/'`
  _address=`echo "${MAIL_BODY}" | grep -m 1 "^Address" | sed -e 's/^Address\s*:\s*\(.*\)$/\1/'`
  _service=`echo "${MAIL_BODY}" | grep -m 1 "^Service" | sed -e 's/^Service\s*:\s*\(.*\)$/\1/'`
  _state=`echo "${MAIL_BODY}" | grep -m 1 "^State" | sed -e 's/^State\s*:\s*\(.*\)$/\1/'`

  tmux set-option -g status-right-bg red > /dev/null 2>&1 || :
  tmux set-option -g status-right-length 200 > /dev/null 2>&1 || :
  tmux set-option -g status-right "|${_service}|${_state}|${_host}|${_client}|${_address}|" > /dev/null 2>&1 || :
}

# 戻す (コンフィグを再読み込み)
_tmux_recovery() {
  tmux source-file /home/teru/.tmux.conf > /dev/null 2>&1 || :
}


# Subject によって分岐
if   echo "${SUBJECT}" | egrep -q 'is OK|is UP|Re:'; then
  _tmux_recovery
elif echo "${SUBJECT}" | egrep -q 'is WARNING|is UNKNOWN'; then
  _tmux_alert
elif echo "${SUBJECT}" | egrep -q 'is CRITICAL'; then
  _tmux_alert
elif echo "${SUBJECT}" | egrep -q 'is DOWN'; then
  _tmux_alert
else
  exit 0
fi

通常状態。

アラートが発砲されると、下記のようにステータスバーが変わる。

携帯にメールが届くより早く気づけるし、対象のサーバの IP をすぐにクリップボードにコピーして、即ログインできます。