SWX2200-8PoEの温度上昇を監視する

本設定例では、ルーターのL2MSマスター機能・Luaスクリプト機能と、L2スイッチのL2MSスレーブ機能・PoE給電制御機能を使用しています。

ルーターの対応機種は、RTX1210RTX1200(Rev.10.01.16以降)、RTX830RTX810NVR700WNVR510NVR500FWX120です。

L2スイッチの対応機種は、SWX2200-8PoESWX2100-5PoESWX2100-10PoEです。

L2MSマスター(ルーター)とL2MSスレーブ(L2スイッチ)の対応リビジョンは、技術資料「L2MS」でご確認ください。

図 SWX2200-8PoEの温度上昇を監視する

SWX2200-8PoEの温度上昇を監視し、閾値を超えたらメールで通知するLuaスクリプトです。
SWX2200-8PoEは、内部温度が60℃を超えると自動的に給電を停止します。閾値を50~55℃程度に設定することで、給電停止前に機器の内部温度異常を検知しメールで通知します。

Luaスクリプトは、luaコマンドを使用して実行してください。
実行例:lua /lua-swx-heating-rtx1200.lua

光回線に接続するためには、別途ONUが必要です。
NVR700WとNVR510は、本体のONUポートに小型ONUを装着することで、光回線に接続できます。

対応機種のうち、設定例を掲載している機種は、以下のとおりです。

機種 掲載内容 備考
ルーター RTX1210 RTX1200 RTX830 RTX810 NVR700W NVR510 NVR500 コマンド設定例
Luaスクリプト例
L2MSマスター機能、
Luaスクリプト機能
L2スイッチ SWX2200-8PoE L2MSスレーブ機能

ルーターの設定例

LANインターフェースの設定
(LAN1ポートを使用)
ip lan1 address 192.168.100.1/24
WANインターフェースの設定
(LAN2ポートを使用)
pp select 1
pp always-on on
pppoe use lan2
pp auth accept pap chap
pp auth myname (ISPに接続するID) (ISPに接続するパスワード)
ppp lcp mru on 1454
ppp ipcp ipaddress on
ppp ipcp msext on
ip pp mtu 1454
ip pp nat descriptor 1
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
pp enable 1
ip route default gateway pp 1
NATの設定 nat descriptor type 1 masquerade
DHCPの設定 dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.2-192.168.100.191/24
DNSの設定 dns server (ISPより指定されたDNSサーバーのIPアドレス)
dns private address spoof on
フィルターの設定 ip filter source-route on
ip filter directed-broadcast on
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.100.0/24 *
ip filter 1030 pass * 192.168.100.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 * * submission
ip filter dynamic 106 * * tcp
ip filter dynamic 107 * * udp
L2MSの設定 switch control use lan1 on

Luaスクリプト例

設定値

-- 温度の閾値。この値以上の温度となった場合にメールで通知する(1, 2, ..)
temperature_threshold = (温度の閾値)

-- switch control function get status-poe-temperature コマンドを実行する間隔
-- 単位は秒 (1, 2, ..)
interval_sec = (実行間隔)

--[[
監視対象のスイッチをカンマで区切って列挙する
複数のスイッチを指定可能
MACアドレスまたは、ルーターからスイッチまでの接続ポートの経路情報で指定する

  ・MACアドレス指定
   sw_list = {"00:a0:de:xx:xx:xx"}
  ・経路指定
   sw_list = {
     "lan1:1",
     "lan1:2-5-13"(スイッチを複数つなげている場合)
   }
]]
sw_list = {
  -- "(対象となるスイッチ)"
}

-- メールで通知する switch control function get function コマンドを
-- カンマで区切って列挙する
cmd_switch_tbl = {
  -- "(switch control function get function コマンド1)"
  -- "(switch control function get function コマンド2)"
}

-- メールの設定
mail_tbl = {
  smtp_address = "(SMTP サーバーのアドレス)",
  from = "(送信元メールアドレス)",
  to = "(宛先メールアドレス)"
}

-- メールの送信失敗および温度取得に失敗時に出力する
-- SYSLOG のレベル (info, debug, notice)
log_level = "(SYSLOG レベル)"

接続されているSWX2200-8PoEの機器の名前を取得する関数

function get_switch_name()
  local cmd = "switch control function get system-name"
  local rtn, str, name

  name = "スイッチ名の取得に失敗しました"
  rtn, str = rt.command(cmd)
  if (rtn) and (str) then
    name = str
  end

  return name
end

指定された経路にあるSWX2200-8PoEの温度を計測する関数

function get_switch_temperature()
  local cmd = "switch control function get status-poe-temperature"
  local rtn, str, temperature

  temperature = nil
  rtn, str = rt.command(cmd)
  if (rtn) and (str) then
    temperature = str
  end

  return temperature
end

メールで送信するコマンドの実行結果を出力する関数

function exec_command(cmd)
  local rtn, str

  rtn, str = rt.command(cmd)
  if (not rtn) or (not str) then
    str = "実行失敗\r\n"
  end

  return rtn, string.format("# %s\r\n%s\r\n", cmd, str)
end

メールの設定、送信を実行する関数

function send_mail(sw_name, temperature)
  local rtn, str

  mail_tbl.text = "スイッチの温度が閾値以上となりました。\r\n\r\n\スイッチの識別名: "
  mail_tbl.text = mail_tbl.text .. sw_name .. "\r\n"
  mail_tbl.text = mail_tbl.text .. "計測された温度: "
  mail_tbl.text = mail_tbl.text .. temperature .. "\r\n\r\n"

  for i, cmd in ipairs(cmd_switch_tbl) do
   rtn, str = exec_command(cmd)
   mail_tbl.text = mail_tbl.text .. str
  end

  mail_tbl.subject = string.format("temperature over threshold (%s)", time_stamp())
  rtn = rt.mail(mail_tbl)

  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, str, sw_name, route, temperature

if temperature_threshold < 1 then
  error("温度の閾値が不正です。")
end

if interval_sec < 1 then
  error("温度測定間隔の値が不正です。")
end

while (true) do
  -- 設定値で登録されているすべての経路で温度を計測する
  for i, route in ipairs(sw_list) do
   assert(route, "スイッチの経路情報が取得できませんでした")

   -- 経路を選択する
   rtn, str = rt.command("switch select " .. route)
   assert(rtn, "スイッチの経路選択に失敗しました")

   -- 温度の計測
   temperature = get_switch_temperature()
   assert(temperature, "温度の計測に失敗しました")
   temperature = tonumber(temperature)

   -- 閾値以上となっていた場合、メールを送信する
   if (temperature >= temperature_threshold) then
    -- スイッチの機器名の取得
    sw_name = get_switch_name()
    -- メールの設定、送信
    rtn = send_mail(sw_name, tostring(temperature))
    if (not rtn) then
     rt.syslog(log_level, "failed to send mail. (Lua スクリプトファイル名)")
    end
   end
  end

  -- 設定値で指定された秒数待機する
  rt.sleep(interval_sec)
end

【ご注意】
本設定例は、設定の参考例を示したもので、動作を保証するものではございません。
ご利用いただく際には、十分に評価・検証を実施してください。

メール

ご相談・お問い合わせ