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

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

前回の記事でLuaスクリプトのファイル作成・ルータへのコピー・実行までを紹介しました。
今回はTFTPを利用してルータにLuaスクリプトファイルをアップロードする方法とルータの状態を把握するためCPUやメモリの使用率などの状態をメールで通知するLuaスクリプトの紹介をします。

ルータの設定内容

まずは今回利用する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スクリプトを利用させて頂きます。
今回のLuaスクリプトは

  • CPU使用率
  • メモリ使用率
  • 筐体内温度
  • IPマスカレードで使用中のポート数
  • DHCPサーバー機能で割り当て中のIPアドレスの数と利用可能なIPアドレスの数

をメールで定期的に通知するスクリプトになります。
下記の内容をメモ帳にコピーして「rtx1200-info.lua」のファイル名で保存します。

--[[

  ●ルーターリソース監視スクリプト
  定期的にルーターのリソースを監視して、各リソースの使用状況を管理者にメール
  で送信するスクリプトです。監視するリソースは以下です。
  ・CPU 使用率
  ・メモリ使用率
  ・筐体内温度(RTX1200, RTX3500, RTX5000, RTX1210)
  ・IP マスカレードの使用ポート数
  ・DHCP サーバ機能での割り当て中と利用可能なアドレス数

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

-- 使用状況を取得する IP マスカレードの NAT ディスクリプタ番号(1 - 2147483647)
nat_descriptor = 1	-- ★

-- メールの設定
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"			-- ★

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

------------------------------------------------------------
-- ルーターのハードウェアリソースの使用状況を取得する関数 --
------------------------------------------------------------
function rt_res_status(t)
	local rtn, str
	local cmd = "show environment"

	rtn, str = rt.command(cmd)
	if (rtn) and (str) then
		for k, v in pairs(t) do
			v.val = str:match(v.ptn)
			if (v.val) then
				v.val = tostring(v.val)
			end
		end
	else
		str = cmd .. "コマンド実行失敗\r\n\r\n"
	end

	return rtn, str
end

------------------------------------------------------------
-- IP マスカレードの使用ポート数を返す関数                --
------------------------------------------------------------
function natmsq_use_status(id)
	local rtn, str, num
	local cmd = "show nat descriptor address " .. tostring(id)
	local ptn = "(%d+)個使用中"
	local err = "NATディスクリプタは定義されていません"

	rtn, str = rt.command(cmd)
	if (rtn) and (str) then
		num = str:match(ptn)
		if (num) then
			num = tostring(num)
		else
			if (str ~= err) then
				str = "マスカレードテーブルは現在使用されていません\r\n"
			end
			rtn = false
		end
	else
		str = cmd .. "コマンド実行失敗\r\n"
	end

	return rtn, num, str
end

------------------------------------------------------------
-- DHCP サーバー機能で割当中、または利用可能な            --
-- アドレスを返す関数                                     --
------------------------------------------------------------
function dhcp_status(t)
	local rtn, str, n, id, asn, avl
	local cmd = "show status dhcp"

	rtn, str = rt.command(cmd)
	if (rtn) then
		if (str) then
			s = 1
			n = 1
			while (true) do
				s, e, id = string.find(str, "番号: (%d+)", s)
				if (s) then
					s, e, asn = str:find("割り当て中アドレス数: (%d+)", e)
					s, e, avl = str:find("利用可能アドレス数: (%d+)", e)
					t[n] = {id = id, asn = asn, avl = avl}
				else
					break
				end
			end
		else
			str = " 有効なDHCPスコープがありません\r\n\r\n"
			rtn = false
		end
	end

	return rtn, 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 rt_res_tbl = {
	cpu_5sec = {ptn = "(%d+)%%%(5sec%)", val = 0 },
	cpu_1min = {ptn = "(%d+)%%%(1min%)", val = 0 },
	cpu_5min = {ptn = "(%d+)%%%(5min%)", val = 0 },
	memory = {ptn = "(%d+)%% used", val = 0 },
	temp = {ptn = "筐体内温度%(℃%): (%d+)", val = 0 }
}

local rtn, str, num
local scope_tbl = {}
local rt_name = string.match(_RT_FIRM_REVISION, "(%w+)")

while (true) do
	mail_tbl.text = ""

	-- cpu, mem (,temp -- RTX1200, RTX3500, RTX5000, RTX1210)
	rtn, str = rt_res_status(rt_res_tbl)
	if (rtn) then
		str = string.format("[CPU負荷率]\r\n %d%%(5sec)\t%d%%(1min)\t%d%%(5min)\r\n[メモリ使用率]\r\n %d%%\r\n",
			rt_res_tbl.cpu_5sec.val, rt_res_tbl.cpu_1min.val,
			rt_res_tbl.cpu_5min.val, rt_res_tbl.memory.val)
		if ((rt_name == "RTX1200") or (rt_name == "RTX3500") or (rt_name == "RTX5000") or (rt_name == "RTX1210")) then
			str = str .. string.format("[筐体内温度]\r\n %d℃\r\n", rt_res_tbl.temp.val)
		end
	else
		if ((rt_name == "RTX1200") or (rt_name == "RTX3500") or (rt_name == "RTX5000") or (rt_name == "RTX1210")) then
			str = "[CPU使用率]\r\n[メモリ使用率]\r\n[筐体内温度]\r\n " .. str
		else
			str = "[CPU使用率]\r\n[メモリ使用率]\r\n " .. str
		end
	end
	mail_tbl.text = mail_tbl.text .. str .. "\r\n"

	-- nat
	mail_tbl.text = mail_tbl.text .. string.format("[NATディスクリプタ : %d]\r\n ", nat_descriptor)
	rtn, num, str = natmsq_use_status(nat_descriptor)
	if (rtn) then
		if (num) then
			str = string.format("使用中のポート数: %d個\r\n", num)
		end
	end
	mail_tbl.text = mail_tbl.text .. str .. "\r\n"

	-- dhcp
	mail_tbl.text = mail_tbl.text .. "[DHCP]\r\n"
	rtn, str = dhcp_status(scope_tbl)
	if (rtn) then
		str = ""
		for i, v in ipairs(scope_tbl) do
			str = str .. string.format(" DHCPスコープ番号: %d\r\n", v.id)
			str = str .. string.format("  割り当て可能アドレス: %d\r\n", v.asn)
			str = str .. string.format("  利用可能アドレス: %d\r\n", v.avl)
		end
	end
	mail_tbl.text = mail_tbl.text .. str .. "\r\n"

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

上記では5分に1回メールで通知するようにしています。
設定値は秒で設定します。1時間ごとにメール通知する場合は

idle_time = 3600

とします。

39行目

nat_descriptor = 1

IP マスカレードの使用ポート数を通知させるための設定になりNATディスクリプタ番号を設定します。今回の設定ではRTX1200の設定内容42行目に記載されている

nat descriptor type 1 masquerade

のNAT ディスクリプタ番号が「1」になっているので「1」を設定しました。

43行目から49行目

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

SubmissionポートやSMTP認証が必要な場合は上記設定が必須になります。

TFTPでLuaスクリプトをルータへアップロード

前回はUSBメモリを使ってLuaスクリプトをルータへコピーしましたが、今回はTFTPを利用してルータへファイルをアップロードしたいと思います。まずはWindowsでTFTPコマンドを利用できるようにする必要があります。

TFTPクライアントの利用設定

1.コントロールパネルから「プログラム」をクリックします。

tftp1

2.「Windowsの機能の有効化または無効化」をクリックします。

tftp2

3.「Telnetクライアント」と「TFTPクライアント」にチェックを付け「OK」をクリックします。

tftp3

これでWindowsでTFTPコマンドが利用できるようになります。

TFTPの接続許可

ルータにTFTP接続の許可設定を行います。

tftp host any

上記はすべてのホストからTFTPで接続できるのでアップロードが終ったら下記コマンドで接続できないようにしましょう。

tftp host none

TFTPコマンドでファイルをアップロード

Windowsの「コマンドプロンプト」を利用してルータにファイルをアップロードします。
Luaスクリプトファイル「rtx1200-info.lua」は「C:\lua」に保存しました。

下記コマンドでファイルをアップロードします。

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

実行結果は下記になります。

tftp4

ルータのコンソールからファイルがアップロードされているか下記コマンドで確認します。

show file list /

tftp5

上記からルータへファイルがアップロードされているのが確認できました。

Luaスクリプトの実行

ルータへアップロードされたファイルをスケジュールで実行させます。
■ルータ起動時に実行

schedule at 1 startup * lua /rtx1200-info.lua

上記の設定はルータの起動時にLauスクリプトが実行されるのでルータの再起動が必要になります。ルータの再起動を回避する為に一時的に時間指定で実行させます。

■時間指定で実行

schedule at 1 17:00:00 * lua /rtx1200-info.lua

上記は17時にLuaスクリプトが実行されるので一度実行されたあとは削除します。
また、通知メールを一時的に止めたい場合は下記コマンドで強制終了させます。

■Lua スクリプトの強制終了

terminate lua file /rtx1200-info.lua

 

ルータからのメール

上記設定でルータから定期的にルータの状態が通知されるようになりました。下記がルータからのメール内容になります。

tftp6

CPUの使用率・メモリ使用率・筐体内温度などLuaスクリプトで作成した内容のメールがちゃんと届きました。

まとめ

今回はLuaスクリプトをTFTPでルータにアップロードする方法を紹介しました。前回のUSBでファイルをコピーする方法ではルータが手元にあれば良いのですが、拠点などに設置している場合では現地に行く必要があります。TFTPでアップロードする方法は通信が確立できていれば手元になくてもLuaスクリプトを設置することができます。次回は実践的なLuaスクリプトを紹介します。

 

 

カレンダー

    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コモンズ)