--[[ ●PP 回線負荷制御スクリプト   一定の監視間隔毎に PP1 インタフェースの受信負荷率を監視し、回線負荷制御を行   うスクリプトです。  <スクリプトを使用する環境と動作の概要>  ・WAN 回線を 2 回線使用し、負荷を分散させる。  ・LAN 側端末は IP アドレスによって、通常時に pp1 を使用するグループ 1, 2 と、   pp2 を使用するグループ 3 に分かれている。  ・グループ 1 が最優先で pp1 を使用する。pp1 の受信側が高負荷となり一定の閾値   を超えた場合、グループ 2 は pp2 を使用するよう経路を変更する。  ・グループ 2 の経路変更後、pp1 の受信側の負荷が一定の閾値以下に下がった場合、   経路を元に戻し、グループ 2 は再び pp1 を使用する。 <説明> ・このファイルを 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 = (監視間隔) -- ★ -- PP1 の受信方向の回線負荷が上がった状態と判断する閾値(1 - 99 %) th_high = (上限閾値) -- ★ -- PP1 の受信方向の回線負荷が下がった状態と判断する閾値(1 - 99 %) th_low = (下限閾値) -- ★ -- 出力する SYSLOG のレベル (info, debug, notice) log_level = "(SYSLOG レベル)" -- ★ ----------------------## 設定値ここまで ##---------------------------- ------------------------------------------------------------ -- show status pp コマンドの実行結果から受信負荷率を -- -- 求める関数 -- ------------------------------------------------------------ function pp_load_info(num) local rtn, snd, rcv, str, n local t = {} local cmd = "show status pp " .. tostring(num) local ptn = "負荷%:%s+(%d+)%.%d+%%" rtn, str = rt.command(cmd) if (rtn) and (str) then n = 1 for w in string.gmatch(str, ptn) do t[n] = w n = n + 1 end if (t[1]) then rcv = tonumber(t[1]) end if (t[2]) then snd = tonumber(t[2]) end end return rtn, rcv, snd, 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 rtn, rcv, snd, str local high = false local cmd_high = "ip route default gateway pp 1 filter 11 gateway pp 2 filter 12 13" local cmd_low = "ip route default gateway pp 1 filter 11 12 gateway pp 2 filter 13" while (true) do while (not high) do rtn, rcv, snd, str = pp_load_info(1) if (rtn) and (rcv) then if (rcv > th_high) then rtn, str = rt.command(cmd_high) if (rtn) then high = true rt.syslog(log_level, "route changed. (Lua スクリプトファイル名)") else rt.syslog(log_level, "change route failed. (Lua スクリプトファイル名)") end end end rt.sleep(idle_time) end while (high) do rtn, rcv, snd, str = pp_load_info(1) if (rtn) and (rcv) then if (rcv < th_low) then rtn, str = rt.command(cmd_low) if (rtn) then high = false rt.syslog(log_level, "route restored. (Lua スクリプトファイル名)") else rt.syslog(log_level, "restore route failed. (Lua スクリプトファイル名)") end end end rt.sleep(idle_time) end end