--[[ ●SYSLOG 監視スクリプト   SYSLOG を監視し、特定の文字列が含まれたログを検出したら、検出されたログを   管理者にLINEで通知するスクリプトです。 <説明> ・このファイルを RTFS か外部メモリに保存してください。 ・本項目の config の設定では schedule at コマンドでルーター起動時に Lua スク リプトが実行されるように設定しています。 ・スクリプトを停止するときは terminate lua コマンドを実行してください。 ・再度、Lua スクリプトを実行する場合は lua コマンドで実行してください。 ・★マークの付いた設定値は変更が可能です。 <ノート>  ・メールの送信失敗時に出力する SYSLOG レベルを指定可能です。   SYSLOG のレベルを指定するには、log_level を設定してください。   debug レベル、notice レベルの SYSLOG を出力するためには、それぞれ以下の設定   が必要です。    debug レベル ・・・ syslog debug on    notice レベル・・・ syslog notice on  ・本スクリプトファイルを編集する場合、文字コードは必ず Shift-JIS を使用してく   ださい。 ]] --------------------------## 設定値 ##-------------------------------- -- 検出する SYSLOG の文字列 ptn = string.regexp("SnapShot(.*): Status recovered|SnapShot(.*): Unknown|SnapShot(.*): Route difference|SnapShot(.*): Not found") -- LINE送信用リクエストテーブル req_tbl = { url = "https://api.line.me/v2/bot/message/broadcast", method = "POST", auth_type = "bearer", auth_token = "(LINE Developers で発行したアクセストークン)", -- ★ post_text = "", content_type = "application/json" } -- 出力する SYSLOG のレベル (info, debug, notice) log_level = "(SYSLOGレベル)" -- ★ ----------------------## 設定値ここまで ##---------------------------- ------------------------------------------------------------ -- LINEに通知するデータ -- ------------------------------------------------------------ -- POSTデータ post_data = '{"messages":[{"type":"text","text":"%s"}]}' ------------------------------------------------------------ -- SYSLOGメッセージをJSON用にエスケープする関数 -- ------------------------------------------------------------ function escape_json(str) str = string.gsub(str, "\\", "\\\\") str = string.gsub(str, "\"", "\\\"") str = string.gsub(str, "\/", "\\/") str = string.gsub(str, "\n", "\\n") str = string.gsub(str, "\r", "\\r") str = string.gsub(str, "\t", "\\t") return str end ------------------------------------------------------------ -- メインルーチン -- ------------------------------------------------------------ local rtn, str local res_tbl while (true) do rtn, str = rt.syslogwatch(ptn) req_tbl.post_text = "" if rtn > 0 then req_tbl.post_text = string.format(post_data, escape_json(str[1])) -- LINEで通知 res_tbl = rt.httprequest(req_tbl) if (res_tbl.rtn1) and (res_tbl.code) and (res_tbl.code == 200) then -- 送信成功 rt.syslog(log_level, "[Lua] success to send message.") else -- 送信失敗 rt.syslog(log_level, "[Lua] failed to send message.") end req_tbl.post_text = "" end end