PoEスイッチの給電停止を通知する

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

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

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

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

図 PoEスイッチの給電停止を通知する

PoEスイッチが給電を停止した際にメールで通知するLuaスクリプトです。
PoEスイッチでは、内部温度の上昇や冷却ファンの停止などの異常を検知すると給電を停止します。本設定例では、給電が停止したときに出力されるログを監視し、管理者にメールで通知します。

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

技術情報:PoE給電制御機能

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

機種 掲載内容 備考
ルーター RTX1210 RTX1200 RTX830 RTX810 NVR700W NVR510 NVR500 コマンド設定例
Luaスクリプト例
L2MSマスター機能、
Luaスクリプト機能
L2スイッチ SWX2200-8PoE SWX2100-5PoE SWX2100-10PoE 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スクリプトのスケジュール設定 schedule at 1 startup * lua (Luaスクリプトファイル名)

Luaスクリプト例

設定値

-- メールで通知する 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 = "(宛先メールアドレス)"
}

-- メールの送信失敗および switch selectコマンドに失敗時に出力する
-- SYSLOG のレベル (info, debug, notice)
log_level = "(SYSLOG レベル)"

給電停止のログであるかを確認する関数

function check_poe_supply(str)
  local rtn
  -- 給電停止のログパターン
  local check_ptn_tbl = {
    ".*%[SWCTL%].+PORT%d+ poe state %(terminate%)",
    ".*%[SWCTL%].+PORT%d+ poe state %(class%-failure%)",
    ".*%[SWCTL%].+PORT%d+ poe state %(forced%-terminate%)",
    ".*%[SWCTL%].+PORT%d+ poe state %(overcurrent%)",
    ".*%[SWCTL%].+PORT%d+ poe state %(over%-supply%)",
    ".*%[SWCTL%].+PORT%d+ poe state %(over%-temperature%)",
    ".*%[SWCTL%].+PORT%d+ poe state %(fanlock%)",
    ".*%[SWCTL%].+PORT%d+ poe state %(power%-failure%)"
  }

  -- 給電停止のログパターンにマッチするか検索する
  for i, check_ptn in ipairs(check_ptn_tbl) do
    rtn = string.match(str, check_ptn)
    -- 給電停止のログパターンにマッチした
    if rtn ~= nil then
     return rtn
   end
  end

  return rtn
end

PoEスイッチの経路とポート、停止原因を取得する関数

function get_switch_info(str)
  local route, sw_port, cause
  route = nil
  sw_port = nil
  cause = nil

  -- 1番目のキャプチャーは lan1:1 といった経路
  -- 2番目のキャプチャーは PoEスイッチのポート
  -- 3番目のキャプチャーは 停止原因
  -- 出力されるログの例
  -- [SWCTL] lan1:1(xx:xx:xx:xx:xx:xx):PORT2 poe state (terminate)
  route, sw_port, cause = string.match(str, ".*%[SWCTL%] (.+)%(.+(PORT%d+) poe state %((.+)%)")

  if route == nil then
   route = "スイッチの経路情報が取得できませんでした"
  end
  if sw_port == nil then
   sw_port = "スイッチのポートが取得できませんでした"
  end
  if cause == nil then
   cause = "給電停止原因が取得できませんでした"
  end

  return route, sw_port, cause
end

接続されているPoEスイッチの機器の名前を取得する関数

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

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

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, sw_port, cause)
  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 .. sw_port .. "\r\n"
  mail_tbl.text = mail_tbl.text .. "停止原因: "
  mail_tbl.text = mail_tbl.text .. cause .. "\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("stop poe supply (%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, array, sw_name, log_ptn, route, sw_port, cause

-- 監視するログパターン
local log_ptn = ".*%[SWCTL%].+PORT%d+ poe state %("

while (true) do
  rtn, array = rt.syslogwatch(log_ptn)
  if (rtn) and (array) then
   -- 給電停止のログであるかを確認する
   rtn = check_poe_supply(array[1])

   -- 給電停止のログであった場合
   if (rtn) then
     -- スイッチが接続されている経路と、ポート、停止原因を取得
     route, sw_port, cause = get_switch_info(array[1])

     -- 経路を選択する
     rtn, str = rt.command("switch select " .. route)
     if (not rtn) then
      rt.syslog(log_level, "failed to switch select")
     end

     -- スイッチの機器名の取得
     sw_name = get_switch_name()

     -- メールの設定、送信
     rtn = send_mail(sw_name, sw_port, cause)
     if (not rtn) then
      rt.syslog(log_level, "failed to send mail. (Lua スクリプトファイル名)")
     end
   end
  end
end

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

メール

ご相談・お問い合わせ