--[[ ●回線バックアップ通知スクリプト   メインとバックアップの2回線を持つをルーターを監視し、メインからバックアッ   プに切り替わったとき、およびバックアップからメインに戻ったときに管理者に   メールを送信して知らせるスクリプトです。   メイン/バックアップの切り替えのログを検出できるバックアップ機能として、ト   ンネルバックアップとネットワークバックアップが使用可能です。   送信メールには、任意の show のコマンドの出力結果を記載することができます。   バックアップに切り替わったときに実行するコマンドは設定値 cmd_swtich_tbl に、   メインに戻ったときに実行するコマンドは設定値 cmd_recover_tbl に、実行したい   順に列挙してください。   本スクリプトは2つのトンネルが正しく動作している状態で実行してください。 <説明> ・このファイルを 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 を使用してく   ださい。 ]] --------------------------## 設定値 ##-------------------------------- -- バックアップに切り替え/切り戻りを検出するパターンを選択(1 - 3) -- 1 ... トンネルバックアップで出力されるログ -- 2 ... ip keepalive コマンドの実行結果ログ -- 3 ... ip route change log=on で出力されるログ log_ptn = (ログパターン) -- ★ -- バックアップに切り替わった時に通知する show コマンドをカンマで区切って列挙する cmd_switch_tbl = { -- ★ "(show コマンド1)", "(show コマンド2)" } -- メインに復帰した時に通知する show コマンドをカンマで区切って列挙する cmd_recover_tbl = { -- ★ "(show コマンド1)", "(show コマンド2)" } -- メールの設定 mail_tbl = { -- ★ smtp_address = "(SMTP サーバのアドレス)", from = "(送信元メールアドレス)", to = "(宛先メールアドレス)" } -- メールの送信に失敗した時に出力する SYSLOG のレベル (info, debug, notice) log_level = "(SYSLOG レベル)" -- ★ ----------------------## 設定値ここまで ##---------------------------- ------------------------------------------------------------ -- コマンドの実行結果を出力する関数 -- ------------------------------------------------------------ function exec_command(cmd) local rtn, str rtn, str = rt.command(cmd) if (not rtn) or (not str) then str = "実行失敗\r\n" end return rtn, string.format("# %s\r\n%s\r\n", cmd, str) end ------------------------------------------------------------ -- 設定された環境変数 "ROUTER_NAME" を取得する関数 -- ------------------------------------------------------------ function router_name() local cmd = "show config" local ptn = "ROUTER_NAME=(%w+)" local rtn, str, name rtn, str = rt.command(cmd) if (rtn) and (str) then name = str:match(ptn) end return name end ------------------------------------------------------------ -- 現在の日時を取得する関数 -- ------------------------------------------------------------ function time_stamp() local t t = os.date("*t") return string.format("%d/%02d/%02d %02d:%02d:%02d", t.year, t.month, t.day, t.hour, t.min, t.sec) end ------------------------------------------------------------ -- メインルーチン -- ------------------------------------------------------------ local rtn, str, rt_name -- ログの中で検出したい文字列 -- バックアップに切り替わったログ local ptn_switch_tbl = { "TUNNEL%[1%]%: switched to backup", "%[KEEPALIVE%]%s+1%: unreachable", "Change IP route 172%.16%.1%.0/24 via TUNNEL%[2%] by Static" } -- メインに戻ったログ local ptn_recover_tbl = { "TUNNEL%[1%]%: recovered from backup", "%[KEEPALIVE%]%s+1%: reachable", "Change IP route 172%.16%.1%.0/24 via TUNNEL%[1%] TUNNEL%[2%] by Static" } rt_name = router_name() assert(rt_name, "環境変数 \"ROUTER_NAME\" を設定してください。") while (true) do rtn, str = rt.syslogwatch(ptn_switch_tbl[log_ptn]) if (rtn) and (str) then mail_tbl.text = "回線をバックアップに切り替えました。\r\n\r\nルーターの識別名: " mail_tbl.text = mail_tbl.text .. rt_name .. "\r\n\r\n" for i, cmd in ipairs(cmd_switch_tbl) do rtn, str = exec_command(cmd) mail_tbl.text = mail_tbl.text .. str end mail_tbl.subject = string.format("switched to backup (%s)", time_stamp()) rtn = rt.mail(mail_tbl) if (not rtn) then rt.syslog(log_level, "failed to send mail. (Lua スクリプトファイル名)") end end rtn, str = rt.syslogwatch(ptn_recover_tbl[log_ptn]) if (rtn) and (str) then mail_tbl.text = "回線をメインに戻しました。\r\n\r\nルーターの識別名: " mail_tbl.text = mail_tbl.text .. rt_name .. "\r\n\r\n" for i, cmd in ipairs(cmd_recover_tbl) do rtn, str = exec_command(cmd) mail_tbl.text = mail_tbl.text .. str end mail_tbl.subject = string.format("recovered from backup (%s)", time_stamp()) rtn = rt.mail(mail_tbl) if (not rtn) then rt.syslog(log_level, "failed to send mail. (Lua スクリプトファイル名)") end end end