自宅内のネットワークに繋がらない時があって悩んだら、外で使っていたモバイルルータがつけっぱなしで、自宅内ネットワークのサービスに接続できないのが原因だったりする。パケットも無駄に消費するので、自宅内でモバイルルータが動いていたら警告させるようにしたい。
wifi scan
メインサーバは有線だけなので、有線LAN接続で WiFi が空いている Raspberry-Pi で監視させてみた。
$ sudo iw dev wlan0 scan | grep "SSID: ルータのSSID"
最初は homebridge の homebridge-cmdswitch2 の state_cmd に仕込んでみたけど、モバイルルータが動いていたら警告してほしい。Siri のオートメーション経由で警告することもできるかもしれないけど、スマホに頼る形になるなぁ。
nagios で警告させたいけど、raspberry-pi に nagios を入れるのは資源のムダに思える。ということで、Raspberry-Pi には nagios の監視をリモートで呼び出す nagios-nrpe-server を 入れて、上記 iw コマンドを動かす check スクリプトを書いてみた。
check_iwscan
nagios-nrpe-server から呼出す際に、Raspberry-Pi で動かすのもあるし、OS 負荷が軽くなるように Lua で書いてみた。
#!/usr/bin/lua
-- 見つけるべきSSID
local check_list = {}
check_list[ "tsaitoh.net" ] = "ok"
check_list[ "tsaitoh.net_e5785" ] = "warning"
check_list[ "tsaitoh.net_hwd14" ] = "critical"
-- 見つけたSSID毎の数
local count = {}
count[ "ok" ] = 0
count[ "warning" ] = 0
count[ "critical" ] = 0
-- スキャン結果を処理
local handle = io.popen( "/usr/bin/sudo /sbin/iw dev wlan0 scan" , "r" )
if handle then
for line in handle:lines() do
-- SSID を抽出
ssid = string.match( line , "^%s*SSID: (.+)$" )
if ssid then
-- SSID のカウント
local lv = check_list[ssid]
if lv then
count[lv] = count[lv] + 1
end
-- print( ssid ) ;
end
end
handle:close()
end
-- カウント結果に応じたexit値を決める
local status = 0
local st_mess = "Ok"
if count["critical"] > 0 then
status = 2
st_mess = "Critical"
elseif count[ "warning" ] > 0 then
status = 1
st_mess = "Warning"
end
-- 結果の表示
print( string.format( "IWSCAN %s - ok:%d/warn:%d/critical:%d" ,
st_mess , count["ok"] , count["warning"] , count["critical"] ) )
os.exit( status )