NagiosでのAPCのUPSのバッテリ監視

今朝、徹夜作業があって建物のEPSに設置されているネットワーク機器のメンテナンスをやった。
で、Nagiosでバッテリを監視していたにもかかわらずバッテリ警告のランプが点いていたのにNagiosからの警告は来ていなかった。
バッテリは交換するにしてもNagios上のバッテリ監視の設定がミスっているのは明らかなので設定を変更することにする。
この設定を書いたのは大昔でいろいろその当時は調べたんだけどSNMPのいろはが良くわかっていない状態で力技で書いた。(いまでもわかっていない)
で、間違えていたのはservices.cfgのバッテリチェック用の定義の部分のcheck_commandのところ

:
define service{
  name generic-check-APCUPS-battery-replacementindicator-service
:
  check_command                   check_snmp!public!.1.3.6.1.4.1.318.1.1.1.2.2.4.0!2!3
}

のcheck_commandの最後の!2!3の部分。
ここのところはcheckcommand.cfgでは

define command{
        command_name    check_snmp
        command_line    $USER1$/check_snmp -H $HOSTADDRESS$ -P 1 -C $ARG1$ -o $ARG2$ -w $ARG3$ -c $ARG4$
        }

のように定義されている。
一方、APCUPSでバッテリチェックを指示するupsAdvBatteryReplaceIndicatorはBatteryNeedsReplacingが1でbatteryNeedsReplacingが2と定義されていた。(APCのNetwork Management CardのCDについてきたSNMPのマニュアルとMIBの定義より)
!2!3で!2はわかるんだけど!3とはなんですか?と突込みを自分にいれつつ作業を継続した。
正解は

:
  check_command                   check_snmp!public!.1.3.6.1.4.1.318.1.1.1.2.2.4.0!1!2
}

check_commandの-w $ARG3$ -c $ARG4$の部分だけど、warningをNagiosの認識させるために$ARG3$に設定する値は本来warningとして認識させる値より1少ない数値になる。$ARG3$より大きな数値の場合check_snmpはwarningと認識するようです。criticalを意味する$ARG4$の場合も同様。

また、バッテリ交換をcriticalでほしいときにはcheckcommand.cfgで

define command{
        command_name    check_snmp2
        command_line    $USER1$/check_snmp -H $HOSTADDRESS$ -P 1 -C $ARG1$ -o $ARG2$ -c $ARG3$
        }

とやり、services.cfgで

:
  check_command                   check_snmp2!public!.1.3.6.1.4.1.318.1.1.1.2.2.4.0!1
}

とすれば動くみたい。

MIBの値で.1.3.6.1.4.1.318.1.1.1.2.2.4.0の部分も本来はもっと賢いやり方があるんだろうなと思う。たぶん、net-snmpコンパイルするときか何かに定義するんかなーとは思うが、とりあえず動いちまったからこれでいいやと思う。

また、これ以上難しいこと(例えば値が小さくなるとwarningやらcriticalになるようなこと)を考えるときはcheck_snmp.cを読まなきゃならないんだろうな。

感想
①いっぱい売ってるんだからAPCはマニュアルを日本語化しましょう。
UPSのバッテリは2年を目処に交換しましょう。(機器によってはもっと短いかもしれないし、長いかもしれない)