| 設定値 |
-- 監視間隔 (1-864000 秒)
idle_time = (監視間隔)
-- 監視する相手先情報番号(1 - 30)
peer_num = (相手先情報番号)
-- 送信負荷率の閾値(1 - 99 %)
snd_th = (負荷率)
-- 受信負荷率の閾値(1 - 99 %)
rcv_th = (負荷率)
-- 連続で閾値を超えたら異常と判断する回数、または正常な状態に復帰したと判断する回数(1, 2 ..)
count = (回数)
-- 正常な状態に復帰した場合にもメールを送るか否か(送る:true / 送らない:false)
down_mail = (true / false)
-- メールの設定
mail_tbl = {
smtp_address = "(SMTPサーバーのアドレス)",
from = "(送信元メールアドレス)",
to = "(宛先メールアドレス)"
}
-- メールの送信に失敗した時に出力する SYSLOG のレベル(info, debug, notice)
log_level = "(SYSLOGレベル)"
|
| 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 make_ppmsg(tbl, val, th, down)
local rtn
local str = ""
if (val) then
rtn = count_proc(tbl, val, th)
if (rtn < 0) then
if (down) then
str = tbl.title .. "負荷率が閾値以下の値に下がりました。\r\n\r\n"
end
elseif (rtn > 0) then
str = tbl.title .. "負荷率が閾値を超えました。\r\n"
str = str .. string.format(" %s負荷率: %d%%\r\n 閾値: %d%%\r\n\r\n",
tbl.title, val, th)
end
end
return str
end
|
閾値を超えた(または下回った)
連続回数をカウントする関数 |
function count_proc(t, val, th)
local rtn = 0
if (val > th) then
if (not t.flag) then
t.over = t.over + 1
if (t.over == count) then
rtn = 1
t.flag = true
end
else
if (t.down > 0) then
t.down = 0
end
end
else
if (t.flag) then
t.down = t.down + 1
if (t.down == count) then
rtn = -1
t.flag = false
t.over = 0
t.down = 0
end
else
if (t.over > 0) then
t.over = 0
end
end
end
return rtn
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 snd_tbl = {over = 0, down = 0, flag = false, title = "送信"}
local rcv_tbl = {over = 0, down = 0, flag = false, title = "受信"}
while (true) do
mail_tbl.text = ""
rtn, rcv, snd, str = pp_load_info(peer_num)
if (rtn) then
mail_tbl.text = mail_tbl.text .. make_ppmsg(rcv_tbl, rcv, rcv_th, down_mail)
mail_tbl.text = mail_tbl.text .. make_ppmsg(snd_tbl, snd, snd_th, down_mail)
else
mail_tbl.text = str
end
if (mail_tbl.text:len() > 0) then
mail_tbl.subject = string.format("[PP %d] transmit/receive load watch (%s)", peer_num, 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
|