--[[ ●ルーターリソース監視スクリプト 定期的にルーターのリソースを監視して、各リソースの使用状況をSORACOM Harvest へHTTPで送信するスクリプトです。監視するリソースは以下です。 ・CPU使用率 ・メモリ使用率 ・NATセッションの使用率 ・DHCP サーバー機能でのIPアドレスプールの使用率 <説明> ・このファイルを RTFS か外部メモリに保存してください。 ・本項目の config の設定では schedule at コマンドでルーター起動時に Lua スク リプトが実行されるように設定しています。 ・スクリプトを停止するときは terminate lua コマンドを実行してください。 ・再度、Lua スクリプトを実行する場合は lua コマンドで実行してください。 ・★マークの付いた設定値は変更が可能です。 <ノート> ・SORACOM Harvestへのデータ送信失敗時、または送信するデータの取得に失敗したと きに出力する SYSLOG レベルを指定可能です。 SYSLOG のレベルを指定するには、log_level を設定してください。 debug レベル、notice レベルの SYSLOG を出力するためには、それぞれ以下の設定 が必要です。 debug レベル ・・・ syslog debug on notice レベル・・・ syslog notice on ・本スクリプトファイルを編集する場合、文字コードは必ず Shift-JIS を使用してく ださい。 ]] --------------------------## 設定値 ##-------------------------------- -- 監視間隔(1 - 864000 秒) idle_time = (監視間隔) -- ★ -- 使用状況を取得する IP マスカレードの NAT ディスクリプター番号(1 - 2147483647) nat_descriptor = (NAT ディスクリプター番号) -- ★ -- 使用状況を取得する DHCPの スコープ番号(1 - 65535) dhcp_scope = (スコープ番号) -- ★ -- SORACOM Harvestへのデータ送信に失敗したときに出力する SYSLOG のレベル(info, debug, notice) log_level = "(SYSLOG レベル)" -- ★ ----------------------## 設定値ここまで ##---------------------------- ----------------------------------------------------------- -- 定数 -- ----------------------------------------------------------- -- NATセッション数 (NVR700W) nat_session = 65534 ----------------------------------------------------------- -- SORACOM Harvest用のリクエストテーブル -- ----------------------------------------------------------- req_tbl = { url = "http://harvest.soracom.io/", method = "POST", content_type = "application/json" } ------------------------------------------------------------ -- ルーターのハードウェアリソースの使用状況を取得する関数 -- ------------------------------------------------------------ function rt_res_status(t) local rtn, str local cmd = "show environment" rtn, str = rt.command(cmd) if (rtn) and (str) then for k, v in pairs(t) do v.val = str:match(v.ptn) if (v.val) then v.val = tostring(v.val) end end else rt.syslog(log_level, cmd .. " cannot be executed. (Luaスクリプトファイル名)") end return rtn end ------------------------------------------------------------ -- 使用中のNATセッション数を返す関数 -- ------------------------------------------------------------ function natmsq_use_status(id) local rtn, str, session local cmd = "show nat descriptor address " .. tostring(id) local ptn = "(%d+) セッション" local err = "NATディスクリプタは定義されていません" rtn, str = rt.command(cmd) if (rtn) and (str) then session = str:match(ptn) if (session) then session = tostring(session) else if (string.find(str, err) ~= nil) then rt.syslog(log_level, "NAT Descriptor is not defined. (Luaスクリプトファイル名)") rtn = false else session = 0 end end else rt.syslog(log_level, cmd .. " cannot be executed. (Luaスクリプトファイル名)") end return rtn, session end ------------------------------------------------------------ -- IPマスカレード同時セッション数の最大値を返す関数 -- ------------------------------------------------------------ function natmsq_limit_total(id) local rtn, str, limit local cmd = "show config | grep total" local ptn = "nat descriptor masquerade session limit total " .. tostring(id) .. " (%d+)" rtn, str = rt.command(cmd) if (rtn) then if (str) then limit = str:match(ptn) if (limit) then limit = tostring(limit) else limit = nat_session end else limit = nat_session end else rt.syslog(log_level, cmd .. " cannot be executed. (Luaスクリプトファイル名)") end return rtn, limit end ------------------------------------------------------------ -- DHCP サーバー機能で割当中、または利用可能な -- -- アドレスを返す関数 -- ------------------------------------------------------------ function dhcp_status(id) local rtn, str, leased, usable local cmd = "show status dhcp " .. tostring(id) rtn, str = rt.command(cmd) if (rtn) and (str) then leased = str:match("割り当て中アドレス数: (%d+)") if (leased) then leased = tostring(leased) end usable = str:match("利用可能アドレス数: (%d+)") if (usable) then usable = tostring(usable) end else rt.syslog(log_level, cmd .. " cannot be executed. (Luaスクリプトファイル名)") end return rtn, leased, usable end ------------------------------------------------------------ -- メインルーチン -- ------------------------------------------------------------ -- ハードウェアリソース情報テーブル local rt_res_tbl = { cpu_5sec = {ptn = "(%d+)%%%(5sec%)", val = 0 }, cpu_1min = {ptn = "(%d+)%%%(1min%)", val = 0 }, cpu_5min = {ptn = "(%d+)%%%(5min%)", val = 0 }, memory = {ptn = "(%d+)%% used", val = 0 } } local rtn, rtn2, str, session, limit, leased, usable, res_tbl while (true) do req_tbl.post_text = "" -- cpu, mem rtn = rt_res_status(rt_res_tbl) if (rtn) then str = string.format("\"cpu_5sec(%%)\":%d,\"cpu_1min(%%)\":%d,\"cpu_5min(%%)\":%d,\"memory(%%)\":%d,", rt_res_tbl.cpu_5sec.val, rt_res_tbl.cpu_1min.val, rt_res_tbl.cpu_5min.val, rt_res_tbl.memory.val) req_tbl.post_text = req_tbl.post_text .. str end -- nat rtn, session = natmsq_use_status(nat_descriptor) rtn2, limit = natmsq_limit_total(nat_descriptor) if (rtn) and (rtn2) then if (session) and (limit) then str = string.format("\"nat(%%)\":%d,", (session * 100) / limit) req_tbl.post_text = req_tbl.post_text .. str end end -- dhcp rtn, leased, usable = dhcp_status(dhcp_scope) if (rtn) then if (leased) and (usable) then str = string.format("\"dhcp(%%)\":%d,", (leased * 100) / usable) req_tbl.post_text = req_tbl.post_text .. str end end if (req_tbl.post_text:len() > 0) then -- JSON形式に変換 req_tbl.post_text = "{" .. string.sub(req_tbl.post_text, 1 , -2) .. "}" -- SORACOM HarvestへHTTPでデータを送信 res_tbl = rt.httprequest(req_tbl) if (res_tbl.rtn1) and (res_tbl.code) and (res_tbl.code == 201) then -- 送信成功 rt.syslog(log_level, "[LUA] success to send data. (Luaスクリプトファイル名)") else -- 送信失敗 rt.syslog(log_level, "[LUA] failed to send data. (Luaスクリプトファイル名)") end end rt.sleep(idle_time) end