前回の記事でLuaスクリプトのファイル作成・ルータへのコピー・実行までを紹介しました。
今回はTFTPを利用してルータにLuaスクリプトファイルをアップロードする方法とルータの状態を把握するためCPUやメモリの使用率などの状態をメールで通知するLuaスクリプトの紹介をします。
目次
ルータの設定内容
まずは今回利用するRTX1200の設定内容です。
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 |
login password * administrator password * console character euc ip route default gateway pp 1 ip filter source-route on ip filter directed-broadcast on ip lan1 address 192.168.0.1/24 pp select 1 pp keepalive interval 30 retry-interval=30 count=12 pp always-on on pppoe use lan2 pppoe auto connect on pppoe auto disconnect off pp auth accept pap chap pp auth myname (ISPの接続アカウント) (ISPのパスワード) ppp lcp mru on 1454 ppp ipcp ipaddress on ppp ipcp msext on ip pp mtu 1454 ip pp secure filter in 1020 1030 2000 ip pp secure filter out 1010 1011 1012 1013 1014 1015 3000 dynamic 100 101 102 103 104 105 106 107 ip pp nat descriptor 1 pp enable 1 ip filter 1010 reject * * udp,tcp 135 * ip filter 1011 reject * * udp,tcp * 135 ip filter 1012 reject * * udp,tcp netbios_ns-netbios_ssn * ip filter 1013 reject * * udp,tcp * netbios_ns-netbios_ssn ip filter 1014 reject * * udp,tcp 445 * ip filter 1015 reject * * udp,tcp * 445 ip filter 1020 reject 192.168.0.0/24 * ip filter 1030 pass * 192.168.0.0/24 icmp ip filter 2000 reject * * ip filter 3000 pass * * ip filter dynamic 100 * * ftp ip filter dynamic 101 * * www ip filter dynamic 102 * * domain ip filter dynamic 103 * * smtp ip filter dynamic 104 * * pop3 ip filter dynamic 105 * * netmeeting ip filter dynamic 106 * * tcp ip filter dynamic 107 * * udp nat descriptor type 1 masquerade tftp host any dhcp service server dhcp server rfc2131 compliant except remain-silent dhcp scope 1 192.168.0.101-192.168.0.200/24 dns server pp 1 dns private address spoof on |
上記はインターネット接続する一般的な設定内容になります。
ルータの状態をメール通知する
ヤマハのサイトで公開されているLuaスクリプトを利用させて頂きます。
今回のLuaスクリプトは
- CPU使用率
- メモリ使用率
- 筐体内温度
- IPマスカレードで使用中のポート数
- DHCPサーバー機能で割り当て中のIPアドレスの数と利用可能なIPアドレスの数
をメールで定期的に通知するスクリプトになります。
下記の内容をメモ帳にコピーして「rtx1200-info.lua」のファイル名で保存します。
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 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
--[[ ●ルーターリソース監視スクリプト 定期的にルーターのリソースを監視して、各リソースの使用状況を管理者にメール で送信するスクリプトです。監視するリソースは以下です。 ・CPU 使用率 ・メモリ使用率 ・筐体内温度(RTX1200, RTX3500, RTX5000, RTX1210) ・IP マスカレードの使用ポート数 ・DHCP サーバ機能での割り当て中と利用可能なアドレス数 <説明> ・このファイルを 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 - 864000 秒) idle_time = 300 -- ★ -- 使用状況を取得する IP マスカレードの NAT ディスクリプタ番号(1 - 2147483647) nat_descriptor = 1 -- ★ -- メールの設定 mail_tbl = { -- ★ smtp_address = "(SMTPサーバのアドレス)", smtp_port = "587", smtp_auth_protocol = "plain", smtp_auth_name = "(アカウント名)", smtp_auth_password = "(パスワード)", from = "(送信元メールアドレス)", to = "(送信先メールアドレス)" } -- メールの送信に失敗した時に出力する SYSLOG のレベル(info, debug, notice) log_level = "info" -- ★ ----------------------## 設定値ここまで ##---------------------------- ------------------------------------------------------------ -- ルーターのハードウェアリソースの使用状況を取得する関数 -- ------------------------------------------------------------ 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 str = cmd .. "コマンド実行失敗\r\n\r\n" end return rtn, str end ------------------------------------------------------------ -- IP マスカレードの使用ポート数を返す関数 -- ------------------------------------------------------------ function natmsq_use_status(id) local rtn, str, num local cmd = "show nat descriptor address " .. tostring(id) local ptn = "(%d+)個使用中" local err = "NATディスクリプタは定義されていません" rtn, str = rt.command(cmd) if (rtn) and (str) then num = str:match(ptn) if (num) then num = tostring(num) else if (str ~= err) then str = "マスカレードテーブルは現在使用されていません\r\n" end rtn = false end else str = cmd .. "コマンド実行失敗\r\n" end return rtn, num, str end ------------------------------------------------------------ -- DHCP サーバー機能で割当中、または利用可能な -- -- アドレスを返す関数 -- ------------------------------------------------------------ function dhcp_status(t) local rtn, str, n, id, asn, avl local cmd = "show status dhcp" rtn, str = rt.command(cmd) if (rtn) then if (str) then s = 1 n = 1 while (true) do s, e, id = string.find(str, "番号: (%d+)", s) if (s) then s, e, asn = str:find("割り当て中アドレス数: (%d+)", e) s, e, avl = str:find("利用可能アドレス数: (%d+)", e) t[n] = {id = id, asn = asn, avl = avl} else break end end else str = " 有効なDHCPスコープがありません\r\n\r\n" rtn = false end end return rtn, 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 ------------------------------------------------------------ -- メインルーチン -- ------------------------------------------------------------ -- ハードウェアリソース情報テーブル 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 }, temp = {ptn = "筐体内温度%(℃%): (%d+)", val = 0 } } local rtn, str, num local scope_tbl = {} local rt_name = string.match(_RT_FIRM_REVISION, "(%w+)") while (true) do mail_tbl.text = "" -- cpu, mem (,temp -- RTX1200, RTX3500, RTX5000, RTX1210) rtn, str = rt_res_status(rt_res_tbl) if (rtn) then str = string.format("[CPU負荷率]\r\n %d%%(5sec)\t%d%%(1min)\t%d%%(5min)\r\n[メモリ使用率]\r\n %d%%\r\n", rt_res_tbl.cpu_5sec.val, rt_res_tbl.cpu_1min.val, rt_res_tbl.cpu_5min.val, rt_res_tbl.memory.val) if ((rt_name == "RTX1200") or (rt_name == "RTX3500") or (rt_name == "RTX5000") or (rt_name == "RTX1210")) then str = str .. string.format("[筐体内温度]\r\n %d℃\r\n", rt_res_tbl.temp.val) end else if ((rt_name == "RTX1200") or (rt_name == "RTX3500") or (rt_name == "RTX5000") or (rt_name == "RTX1210")) then str = "[CPU使用率]\r\n[メモリ使用率]\r\n[筐体内温度]\r\n " .. str else str = "[CPU使用率]\r\n[メモリ使用率]\r\n " .. str end end mail_tbl.text = mail_tbl.text .. str .. "\r\n" -- nat mail_tbl.text = mail_tbl.text .. string.format("[NATディスクリプタ : %d]\r\n ", nat_descriptor) rtn, num, str = natmsq_use_status(nat_descriptor) if (rtn) then if (num) then str = string.format("使用中のポート数: %d個\r\n", num) end end mail_tbl.text = mail_tbl.text .. str .. "\r\n" -- dhcp mail_tbl.text = mail_tbl.text .. "[DHCP]\r\n" rtn, str = dhcp_status(scope_tbl) if (rtn) then str = "" for i, v in ipairs(scope_tbl) do str = str .. string.format(" DHCPスコープ番号: %d\r\n", v.id) str = str .. string.format(" 割り当て可能アドレス: %d\r\n", v.asn) str = str .. string.format(" 利用可能アドレス: %d\r\n", v.avl) end end mail_tbl.text = mail_tbl.text .. str .. "\r\n" if (mail_tbl.text:len() > 0) then mail_tbl.subject = string.format("watch router resources (%s)", time_stamp()) rtn = rt.mail(mail_tbl) if (not rtn) then rt.syslog(log_level, "failed to send mail. (Lua スクリプトファイル名)") end end rt.sleep(idle_time) end |
修正が必要な箇所は下記になります。
36行目
1 |
idle_time = 300 |
上記では5分に1回メールで通知するようにしています。
設定値は秒で設定します。1時間ごとにメール通知する場合は
1 |
idle_time = 3600 |
とします。
39行目
1 |
nat_descriptor = 1 |
IP マスカレードの使用ポート数を通知させるための設定になりNATディスクリプタ番号を設定します。今回の設定ではRTX1200の設定内容42行目に記載されている
1 |
nat descriptor type 1 masquerade |
のNAT ディスクリプタ番号が「1」になっているので「1」を設定しました。
43行目から49行目
1 2 3 4 5 6 7 |
smtp_address = "(SMTPサーバのアドレス)", smtp_port = "587", smtp_auth_protocol = "plain", smtp_auth_name = "(アカウント名)", smtp_auth_password = "(パスワード)", from = "(送信元メールアドレス)", to = "(送信先メールアドレス)" |
SubmissionポートやSMTP認証が必要な場合は上記設定が必須になります。
TFTPでLuaスクリプトをルータへアップロード
前回はUSBメモリを使ってLuaスクリプトをルータへコピーしましたが、今回はTFTPを利用してルータへファイルをアップロードしたいと思います。まずはWindowsでTFTPコマンドを利用できるようにする必要があります。
TFTPクライアントの利用設定
1.コントロールパネルから「プログラム」をクリックします。
2.「Windowsの機能の有効化または無効化」をクリックします。
3.「Telnetクライアント」と「TFTPクライアント」にチェックを付け「OK」をクリックします。
これでWindowsでTFTPコマンドが利用できるようになります。
TFTPの接続許可
ルータにTFTP接続の許可設定を行います。
1 |
tftp host any |
上記はすべてのホストからTFTPで接続できるのでアップロードが終ったら下記コマンドで接続できないようにしましょう。
1 |
tftp host none |
TFTPコマンドでファイルをアップロード
Windowsの「コマンドプロンプト」を利用してルータにファイルをアップロードします。
Luaスクリプトファイル「rtx1200-info.lua」は「C:\lua」に保存しました。
下記コマンドでファイルをアップロードします。
1 2 |
cd c:\lua tftp 192.168.0.1 put rtx1200-info.lua /rtx1200-info.lua/(Administratorパスワード) |
実行結果は下記になります。
ルータのコンソールからファイルがアップロードされているか下記コマンドで確認します。
1 |
show file list / |
上記からルータへファイルがアップロードされているのが確認できました。
Luaスクリプトの実行
ルータへアップロードされたファイルをスケジュールで実行させます。
■ルータ起動時に実行
1 |
schedule at 1 startup * lua /rtx1200-info.lua |
上記の設定はルータの起動時にLauスクリプトが実行されるのでルータの再起動が必要になります。ルータの再起動を回避する為に一時的に時間指定で実行させます。
■時間指定で実行
1 |
schedule at 1 17:00:00 * lua /rtx1200-info.lua |
上記は17時にLuaスクリプトが実行されるので一度実行されたあとは削除します。
また、通知メールを一時的に止めたい場合は下記コマンドで強制終了させます。
■Lua スクリプトの強制終了
1 |
terminate lua file /rtx1200-info.lua |
ルータからのメール
上記設定でルータから定期的にルータの状態が通知されるようになりました。下記がルータからのメール内容になります。
CPUの使用率・メモリ使用率・筐体内温度などLuaスクリプトで作成した内容のメールがちゃんと届きました。
まとめ
今回はLuaスクリプトをTFTPでルータにアップロードする方法を紹介しました。前回のUSBでファイルをコピーする方法ではルータが手元にあれば良いのですが、拠点などに設置している場合では現地に行く必要があります。TFTPでアップロードする方法は通信が確立できていれば手元になくてもLuaスクリプトを設置することができます。次回は実践的なLuaスクリプトを紹介します。