YAMAHAルータの実機・検証 第18回 Luaスクリプト機能を利用しよう 3

2016/11/10 YAMAHA, 技術系 投稿者:

前回までのLuaスクリプト機能を利用した記事ではSYSLOGに履歴を出力したりルータの状態を把握するため定期的にメールを通知する機能を紹介しました。
今回は指定したIPアドレスをpingで応答監視し、異常が発生した場合は管理者へメールで通知する実践的なLuaスクリプトを紹介します。

ネットワーク構成

今回のネットワーク構成は下記になります。
host-monitoring-1監視対象のパソコンのIPアドレスは「192.168.0.10」になります。

ルータ設定内容

今回利用するRTX1200の設定内容です。

login password *
administrator password *
console character euc
ip route default gateway pp 1
ip filter source-route on
ip filter directed-broadcast on
ip lan1 address 192.168.0.1/24
pp select 1
 pp keepalive interval 30 retry-interval=30 count=12
 pp always-on on
 pppoe use lan2
 pppoe auto connect on
 pppoe auto disconnect off
 pp auth accept pap chap
 pp auth myname (ISPの接続アカウント) (ISPのパスワード)
 ppp lcp mru on 1454
 ppp ipcp ipaddress on
 ppp ipcp msext on
 ip pp mtu 1454
 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
 ip pp nat descriptor 1
 pp enable 1
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.0.0/24 *
ip filter 1030 pass * 192.168.0.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 * * netmeeting
ip filter dynamic 106 * * tcp
ip filter dynamic 107 * * udp
nat descriptor type 1 masquerade
tftp host any
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.0.101-192.168.0.200/24
dns server pp 1
dns private address spoof on

前回と同じインターネットに接続する一般的な設定になります。

パソコンの監視 スクリプト

今回もヤマハのサイトで公開されているLuaスクリプトを利用させて頂きます。

今回のLauスクリプトは定期的にルータから監視対象のパソコンにpingで応答確認を行います。応答がなくなった場合は管理者へ障害発生をメールで通知します。また、pingの応答が復旧した場合も管理者へ復旧したことをメールで通知するLuaスクリプトになります。
下記の内容をメモ帳にコピーして「host-monitoring.lua」のファイル名で保存します。

--[[

  ●ping 応答監視スクリプト
  指定したアドレスに宛に ping を実行してその応答を監視し、応答がなかった場合
  に管理者にメールを送信して知らせるスクリプトです。

  指定した回数連続して ping に対する応答がなかった場合には、管理者にメールを
  送信して知らせます。その後、指定した回数連続して応答があった場合には、応答
  が回復したと判断します。設定値 down_mail を true に設定している場合には、応
  答が回復した際にもメールを送信します。

  <説明>
  ・このファイルを 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 = 30			-- ★

-- ping を実行する宛先 IP アドレス
dst = "192.168.0.10" 		-- ★

-- ping への応答がない、または応答が回復したと判断する連続回数(1, 2 ..)
count = 1				-- ★

-- 応答が回復したときにもメールを送るかどうか(送る: true / 送らない: false)
down_mail = true		-- ★

-- メールの設定
mail_tbl = {				-- ★
	smtp_address = "(SMTPサーバのアドレス)",
	smtp_port = "587",
	smtp_auth_protocol = "plain",
	smtp_auth_name = "(アカウント名)",
	smtp_auth_password = "(パスワード)",
	from = "(送信元メールアドレス)",
	to = "(送信先メールアドレス)"
}

-- メールの送信に失敗した時に出力する SYSLOG のレベル(info, debug, notice)
log_level = "info"		-- ★

----------------------##  設定値ここまで  ##----------------------------

------------------------------------------------------------
-- ping を実行し、到達したかどうかを返す関数              --
------------------------------------------------------------
function ping_reach(adr)
	local rtn, str, loss
	local reach = false
	local cmd = "ping " .. adr
	local ptn = "(%d+)%.%d+%%"

	rtn, str = rt.command(cmd)
	if (rtn) and (str) then
		loss = str:match(ptn)
		if (loss) then
			loss = tonumber(loss)
			if (loss == 0) then
        			reach = true
      			end
    		end
  	end

	return rtn, reach, str
end

------------------------------------------------------------
-- 連続何回 ping に応答がないかを示すカウンタの処理関数   --
------------------------------------------------------------
function count_proc(t, reach, th)
	local rtn = 0

	if (not reach) then
		if (not t.flag) then
			t.ng = t.ng + 1
			if (t.ng == th) then
				rtn = 1
				t.flag = true
			end
		else
			if (t.ok > 0) then
				t.ok = 0
			end
		end
	else
		if (t.flag) then
			t.ok = t.ok + 1
			if (t.ok == th) then
				rtn = -1
				t.flag = false
				t.ng = 0
				t.ok = 0
			end
		else
			if (t.ng > 0) then
				t.ng = 0
			end
		end
	end

	return rtn
end

------------------------------------------------------------
-- メール本文を作成する関数                               --
------------------------------------------------------------
function make_pingmsg(tbl, reach, adr, cnt, sec, down)
	local rtn
	local str = ""

	rtn = count_proc(tbl, reach, cnt)
	if (rtn < 0) then
		if (down) then
			str = "pingの応答が回復しました。\r\n"
			str = str .. string.format("  送信先: %s\r\n  監視間隔: %d(秒)\r\n\r\n",adr, sec)
		end
	elseif (rtn > 0) then
		str = "pingの応答がありません。\r\n"
		str = str .. string.format("  送信先: %s\r\n  応答がなかった回数: %d回\r\n  監視間隔: %d(秒)\r\n\r\n",
		 		adr, cnt, sec)
	end

	return 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, reach, str
local reach_tbl = {ng = 0, ok = 0, flag = false}

while (true) do
	mail_tbl.text = ""

	rtn, reach, str = ping_reach(dst)
	if (rtn) then
		mail_tbl.text = mail_tbl.text .. make_pingmsg(reach_tbl, reach, dst,
								count, idle_time, down_mail)
	else
		mail_tbl.text = string.format("%s (ping送信先: %s\r\n\r\n)", str, dst)
	end

	if (mail_tbl.text:len() > 0) then
		mail_tbl.subject = string.format("watch ping : %s (%s)", dst, 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

必要な修正箇所は下記になります。

36行目

idle_time = 30

ここではpingで応答確認を行う監視間隔を設定します。設定値は秒で設定します。上記は30秒に1回pingの応答確認を行います。

39行目

dst = "192.168.0.10"

pingで応答確認を行う宛先IPアドレスを指定します。

42行目

count = 1

pingの応答がなかったり、応答が復旧したと判断する連続回数を設定します。ここの設定は36行目の監視間隔と関わりがあります。
例えば・・・
■設定例1 監視間隔=30、連続回数=1
30秒に1回pingで応答確認を行い1回でも応答がなかったらメールで通知します。
■設定例2 監視間隔=60、連続回数=2
60秒に1回pingで応答確認を行い2回連続で応答がなかったらメールで通知します。

45行目

down_mail = true

pingの応答が復旧した時にメールを通知するかしないかの設定になります。
「true」はping応答が復旧した時に復旧メールを通知します。
「false」はping応答が復旧しても復旧メールは通知しません。

49行目から55行目

smtp_address = "(SMTPサーバのアドレス)",
smtp_port = "587",
smtp_auth_protocol = "plain",
smtp_auth_name = "(アカウント名)",
smtp_auth_password = "(パスワード)",
from = "(送信元メールアドレス)",
to = "(送信先メールアドレス)"

メールを送信するための設定になります。
SubmissionポートやSMTP認証が必要な場合は上記設定が必須になります。

ファイルのアップロードから実行まで

ファイルアップロード

ファイルのアップロードは前回紹介したTFTPコマンドを利用してファイルをルータへアップロードしました。

アップロードコマンド

cd c:\lua
tftp 192.168.0.1 put host-monitoring.lua /host-monitoring.lua/(Administratorパスワード)

結果
host-monitoring-2
ルータのコンソールからファイルがアップロードされているか確認します。

確認コマンド

show file list /

host-monitoring-3

Luaスクリプトの実行

今回も前回と同様に時間指定で15時25分にスクリプトが実行されるように設定します。

schedule at 1 15:25:00 * lua /host-monitoring.lua

これで監視対象パソコンに対してping応答監視が始まります。

ルータからのメール

■監視対象パソコンのLANケーブルを抜いてping応答がなくなった時のメール通知内容
host-monitoring-4
■抜いたLANケーブルを監視対象パソコンに接続しping応答が復旧した時のメール通知
host-monitoring-5
ルータから監視対象パソコンへの通信断、復旧時のメールがちゃんと届きました。

まとめ

今回のLuaスクリプトを利用することで社内に設置してあるNASや業務システムがインストールされているパソコン・サーバなどに対して、いち早く障害や異常を検知することができます。復旧した時にもメールが届くので一時的な通信不通でも復旧したことが確認できるので管理者としてはとても助かるスクリプトになります。

カレンダー

    123
45678910
11121314151617
18192021222324
25262728293031
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
      1
2345678
9101112131415
16171819202122
23242526272829
30      
   1234
567891011
12131415161718
19202122232425
262728293031 
       
 123456
78910111213
14151617181920
21222324252627
282930    
       
     12
3456789
10111213141516
17181920212223
24252627282930
31      
     12
3456789
10111213141516
17181920212223
2425262728  
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
    123
45678910
11121314151617
18192021222324
252627282930 
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
      1
2345678
9101112131415
16171819202122
23242526272829
30      
   1234
567891011
12131415161718
19202122232425
262728293031 
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
     12
3456789
10111213141516
17181920212223
24252627282930
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
1234567
891011121314
15161718192021
22232425262728
2930     
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
   1234
567891011
12131415161718
19202122232425
26272829   
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
  12345
6789101112
13141516171819
20212223242526
27282930   
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
    123
45678910
11121314151617
18192021222324
252627282930 
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
     12
3456789
10111213141516
17181920212223
24252627282930
31      
   1234
567891011
12131415161718
19202122232425
2627282930  
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
     12
3456789
10111213141516
17181920212223
24252627282930
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
  12345
6789101112
13141516171819
20212223242526
2728     
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
   1234
567891011
12131415161718
19202122232425
262728293031 
       
 123456
78910111213
14151617181920
21222324252627
282930    
       
     12
3456789
10111213141516
17181920212223
24252627282930
31      
   1234
567891011
12131415161718
19202122232425
2627282930  
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
  12345
6789101112
13141516171819
20212223242526
27282930   
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
    123
45678910
11121314151617
18192021222324
252627282930 
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
1234567
891011121314
15161718192021
22232425262728
2930     
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
  12345
6789101112
13141516171819
20212223242526
27282930   
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
   1234
567891011
12131415161718
19202122232425
262728293031 
       
 123456
78910111213
14151617181920
21222324252627
282930    
       
     12
3456789
10111213141516
17181920212223
24252627282930
31      
   1234
567891011
12131415161718
19202122232425
2627282930  
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
1234567
891011121314
15161718192021
22232425262728
       
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
      1
2345678
9101112131415
16171819202122
23242526272829
30      
     12
3456789
10111213141516
17181920212223
24252627282930
31      
1234567
891011121314
15161718192021
22232425262728
2930     
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
  12345
6789101112
13141516171819
20212223242526
27282930   
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
     12
3456789
10111213141516
17181920212223
242526272829 
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
    123
45678910
11121314151617
18192021222324
252627282930 
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
      1
2345678
9101112131415
16171819202122
23242526272829
30      
   1234
567891011
12131415161718
19202122232425
262728293031 
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
     12
3456789
10111213141516
17181920212223
24252627282930
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
1234567
891011121314
15161718192021
22232425262728
2930     
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
    123
45678910
11121314151617
18192021222324
25262728   
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
     12
3456789
10111213141516
17181920212223
24252627282930
31      
   1234
567891011
12131415161718
19202122232425
2627282930  
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
     12
3456789
10111213141516
17181920212223
24252627282930
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
    123
45678910
11121314151617
18192021222324
252627282930 
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
      1
2345678
9101112131415
16171819202122
23242526272829
30      
   1234
567891011
12131415161718
19202122232425
262728293031 
       
   1234
567891011
12131415161718
19202122232425
262728    
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
  12345
6789101112
13141516171819
20212223242526
27282930   
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
    123
45678910
11121314151617
18192021222324
252627282930 
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
     12
3456789
10111213141516
17181920212223
24252627282930
31      
   1234
567891011
12131415161718
19202122232425
2627282930  
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
     12
3456789
10111213141516
17181920212223
24252627282930
       
  12345
6789101112
13141516171819
20212223242526
2728     
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
   1234
567891011
12131415161718
19202122232425
262728293031 
       
 123456
78910111213
14151617181920
21222324252627
282930    
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
  12345
6789101112
13141516171819
20212223242526
27282930   
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
    123
45678910
11121314151617
18192021222324
252627282930 
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
1234567
891011121314
15161718192021
22232425262728
29      
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
      1
2345678
9101112131415
16171819202122
23242526272829
30      
   1234
567891011
12131415161718
19202122232425
262728293031 
       
 123456
78910111213
14151617181920
21222324252627
282930    
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
  12345
6789101112
13141516171819
20212223242526
27282930   
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
      1
2345678
9101112131415
16171819202122
232425262728 
       
   1234
567891011
12131415161718
19202122232425
262728293031 
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
     12
3456789
10111213141516
17181920212223
24252627282930
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
1234567
891011121314
15161718192021
22232425262728
2930     
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
      1
2345678
9101112131415
16171819202122
23242526272829
30      
   1234
567891011
12131415161718
19202122232425
262728293031 
       
 123456
78910111213
14151617181920
21222324252627
282930    
       
     12
3456789
10111213141516
17181920212223
2425262728  
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
    123
45678910
11121314151617
18192021222324
252627282930 
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
      1
2345678
9101112131415
16171819202122
23242526272829
30      
   1234
567891011
12131415161718
19202122232425
262728293031 
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
U・Iターン転職しませんか?
群馬データセンター
群馬の法人ITサポートサービス Wide Net[ワイドネット]
Wide Netのクラウドバックアップ
クラウド型ファイル共有サービスRushDrive
ワイドオフィス
ネディアのSDGsへの取り組み
健康経営優良法人
IT-commons(ITコモンズ)