←前 | ↑ 目次 |
次→ |
$Date: 2009/10/13 02:58:59 $
ルーターで、何からのイベントが発生したときに処理を行う、イベント駆動のLuaスクリプトを作成してみましょう。
Luaスクリプト機能では、ログに特定の文字列が出力するまでスクリプトの実行を一時停止して待つことができるライブラリ関数、rt.syslogwatchが用意されています。これを使ってイベント駆動を実現します。
トンネルインタフェースのアップ、ダウンで経路を切り替えるスクリプトを作成してみましょう。
トンネルインタフェースのアップ、ダウンが発生すると、ログには以下のようなログが記録されます。
IP Tunnel[1] Up IP Tunnel[1] Down
このログをrt.syslogwatchで捕まえて、そのときに経路を切り替えます。
[event1.lua] ダウンロード
function tunnel_up (route, tnum) rt.command("ip route " .. route .. " gateway tunnel " .. tnum) end function tunnel_down (route, tnum) rt.command("ip route " .. route .. " gateway null") end route = "192.168.20.0/24" PATTERN = "IP Tunnel%[(%d+)%] ([UD][po]w?n?)" while true do rtn, str = rt.syslogwatch(PATTERN) if rtn > 0 then tnum, up_or_down = string.match(str[1], PATTERN) if tnum then if up_or_down == "Up" then tunnel_up(route, tnum) else tunnel_down(route, tnum) end end end end
関数tunnel_up、tunnel_downはそれぞれトンネルインタフェースがアップ、ダウンしたときにrt.commandを使って経路を切り替えています。
変数PATTERNには、待ち受けるログのパターンを設定します。
PATTERN = "IP Tunnel %[(%d+)%] ([UD][po]w?n?)"
このパターンを用いて、無限ループのwhile文の中で、以下の行でログにトンネルのアップ、ダウンが記録されるのを待ちます。rt.syslogwatchの引数には捕まえたいログをパターンで記述します。戻り値は、ログが見つかった回数と、実際に捕まえたログの文字列の配列になります。この例では、rt.syslogwatchで検出回数や監視時間を指定する引数を省略しているため、変数rtnには必ず1が入ります。
rtn, str = rt.syslogwatch(PATTERN)
次に、トンネルアップなのかダウンなのかと、トンネル番号を、string.matchとPATTERNで調べます。PATTERNには二つのキャプチャがあり、それぞれ、トンネル番号と"Up"/"Down"の文字列に対応しています。そして、トンネルアップであればtunnel_upを、そうでなければtunnel_downを呼び出します。
tnum, up_or_down = string.match(str[1], PATTERN) if tnum then if up_or_down == "Up" then tunnel_up(route, tnum) else tunnel_down(route, tnum) end end
←前 | 目次 ↓ |
次→ |