rtx1210は高価だけどネットワークの勉強をするにはいい教材。 業務でも稀に箱モノの設定することがあるから、頭の体操にもなる。
ブラウザでログインしてポチポチ設定することから初め、設定ファイルを入れ込めば複雑なことができることもわかった。
コマンドラインでいろいろできることがわかったとき、設定ファイルがその積み上げ結果というのもわかった。
ブラウザから設定保存するとconfig0.txtっていうファイルが作成できる。
ログ監視 この設定ファイルに以下の内容を追記して、ログ監視してみる。 やってることはembedded fileっていうのを定義しておき、この内容をルータ起動時から実行させる。
ヤマハのページにsyslog監視のサンプルがあった。他にもいくつかググって方法を探し、試しながら作成。
検出したい文字列は、いったんlinuxの監視処理で使ってたものをそのまま流用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 embedded file tmp.txt <<EOF --[[ ●SYSLOG 監視スクリプト-gvis SYSLOG を監視し、特定の文字列が含まれたログを検出したら、 指定したshow log コマンドの出力結果を管理者にメールで 送信するスクリプト。 メール本文には監視実施日の日付に検出された特定の文字列の履歴を含みます。 原本はyamahaさまの以下のページにあったものから改造作成し、 複数文字列を監視するようにしている。 https://network.yamaha.com/setting/router_firewall/monitor/lua_script/syslog ]] --------------------------## 設定値 ##-------------------------------- -- 検出したい SYSLOG の文字列パターン ptn_tbl = { -- ★ "error", "ERROR", "Error", "fail", "Fail", "FAIL", "panic", "Panic", "PANIC", "warn", "Warn", "WARN", "respond", "connect", "TUNNEL", "Login", "Logout", "Restarting router" } -- ptn の文字列パターンを検出したときに結果を通知する show コマンド cmd_whenFind = "show log reverse" -- ★ -- メールの設定 mail_tbl = { -- ★ smtp_address = "smtp.xxxx.jp", from = "xxxx@gavann-it.com", to = "xxxx@gavann-it.com" } -- メールの送信に失敗したときに出力する SYSLOG のレベル (info, debug, notice) log_level = "info" -- ★ ----------------------## 設定値ここまで ##---------------------------- ------------------------------------------------------------ -- コマンドを実行結果を出力する関数 -- ------------------------------------------------------------ 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 ------------------------------------------------------------ -- 現在の日時を取得する関数 -- ------------------------------------------------------------ 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 ------------------------------------------------------------ -- 今日の日付を取得する関数 -- ------------------------------------------------------------ function date_today() local today today = os.date("*t") return string.format("%d/%02d/%02d", today.year, today.month, today.day) end ------------------------------------------------------------ -- メインルーチン -- ------------------------------------------------------------ local rtn, logstr while (true) do -- SYSLOGから何か追加された文字列を格納するまで待つ rtn, logstr = rt.syslogwatch(".*") -- SYSLOG文字列が何か拾えたらマッチする文字列を探す if (rtn) and (logstr) then for i, str in ipairs(logstr) do for j, ptn in ipairs(ptn_tbl) do -- マッチする文字列があったらメールする if string.find(str, ptn) ~= nil then mail_tbl.text = string.format("ログに検索文字列が検出されました。\r\n検索文字列: \"%s\"\r\n\r\n", ptn) runCmd = cmd_whenFind .. " | grep " .. ptn .. " | grep " .. date_today() rtn, str = exec_command(runCmd) mail_tbl.text = mail_tbl.text .. str mail_tbl.subject = string.format("auto)alertReport-Netlog-rtx1210 (%s)", time_stamp()) rtn = rt.mail(mail_tbl) if (not rtn) then rt.syslog(log_level, "failed to send mail. (syslogWatch-rtx1210lua)") end end end end end end EOF embedded fileの定義を起動時から実行するように設定ファイルに書いておくと、SYSLOGを監視してくれる。
...