←前
目次
次→

Luaスクリプト機能

$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_uptunnel_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.matchPATTERNで調べます。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
    

←前 目次
次→