スポンサードリンク
Categories: ネット

NVR500のLUAスクリプトを使って電話着信をメール通知するようにしてみた

自分の場合、月イチくらいでNVR500のSyslogを見て、かかってきた電話番号を迷惑電話チェックサイトを使って調べ、着信拒否するという作業をしているんですが、最近は特にフリーダイアルである0120からの電話が多く、チェックするだけでも面倒になってきたので、電話着信の都度メールさせることでチェック漏れを減らし、変な時間帯にかけてくる業者をあぶり出そうかなということで、そういうスクリプトを設定してみました。

といっても、YAMAHA様のサイトに掲載されているサンプルスクリプト にちょっと手を入れただけなので、たいした事はやってませんが……。

本当は、NVR500の着信拒否リストと比較して0120からはじまる番号は自動で拒否リストに追加、という感じのことをやりたかったものの、ゼロからそういうコード書くのは時間かかりそうだったので、サンプル流用でお茶を濁しました。(一番は analog arrive restrict で 0120* みたいなワイルドカード使った一括拒否ができれば最高なんですが……)

ということで、同じようなことをしたい方の参考になれば幸いです。

 

使用する環境

自分のテストした環境としては、ナンバーディスプレイ契約をしていて、電話回線はNVR500にひかり電話を直収していない(ホームゲートウェイからLINE経由で接続) 環境となります。

メール送信元はYahoo! JAPANのメールアドレスとし、SMTP-AUTH で認証しています。GMailだとSMTP-AUTHにSSL接続が必須のようで、SMTP-AUTHのSSL接続に対応していない(らしい) NVR500ではうまくメール送信できませんでした。

 

スクリプト内容

--[[

  ●SYSLOG 監視スクリプト
  SYSLOG を監視し、特定の文字列が含まれたログを検出したら、指定した show コ
  マンドおよび show log コマンドの出力結果を管理者にメールで送信するスクリプ
  トです。

  <説明>
  ・このファイルを 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 を使用してく
  ださい。

]]


--------------------------##  設定値  ##--------------------------------

-- 検出したい SYSLOG の文字列パターン

ptn = "InComing Call from"			-- ★

-- ptn の文字列パターンを検出した時に結果を通知する show コマンドをカンマで区切って列挙する
-- 例えばルーターの設定を通知する場合には、"show config" を、
-- ログを通知したい場合には "show log" を記述する
cmd_tbl = {				-- ★
	"show history | grep TEL | grep 通信中"
}

-- メールの設定
mail_tbl = {				-- ★
	smtp_address = "smtp.mail.yahoo.co.jp",
	smtp_port = "587",
	smtp_auth_protocol = "plain",
	smtp_auth_name = "USER-ID",
	smtp_auth_password = "PASSWORD",
	from = "USER-ID@yahoo.co.jp",
	to = "mail-address@example.com"
}

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

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


------------------------------------------------------------
-- コマンドを実行結果を出力する関数                       --
------------------------------------------------------------
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 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

while (true) do
	rtn, str = rt.syslogwatch(ptn)
	if (rtn) and (str) then
		mail_tbl.text = string.format("ログに検索文字列が検出されました。\r\n検索文字列: \"%s\"\r\n\r\n", ptn)

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

		mail_tbl.subject = string.format("電話の着信を検知しました (%s)", time_stamp())
		rtn = rt.mail(mail_tbl)
		if (not rtn) then
			rt.syslog(log_level, "failed to send mail. sd1:/local/call.lua")
		end
	end
end

 

2015/04/23 追記

過去の着信電話番号もメールで送られることがあったため(同一電話番号で複数回コールテストを行った場合には発生しなかったのですが)、現在着信中の電話番号のみ通知するよう、「show history | grep TEL」コマンドを「show history | grep TEL | grep 通信中」に修正しました。

 

設定とか

まず、mail_tbl の内容を使用する環境にあわせて設定します。Yahoo! JAPANのメールアドレスを使用するなら、smtp_auth_name(メールアドレスの@以前を指定)、smtp_auth_password(メールアドレスのパスワード)、from、to を設定するだけでOKです。他のメールサービスを利用する場合は、追加で smtp_address(SMTPサーバー名)、smtp_port(SMTPポート番号)、smtp_auth_protocol(SMTP-AUTHの認証プロトコル) についても、各サービスにあわせて設定します。

また、このスクリプトでは設置位置を rt.syslog(log_level, “failed to send mail. sd1:/local/call.lua”) と指定しています。これは、MicroSDの local ディレクトリ(ファイル共有機能でアクセス可能なディレクトリ)に、call.lua というファイル名で保存することを想定していますので、別の場所・ファイル名で使用する場合は、適宜変更してください。(エラー発生時にSyslog出力する際、スクリプトの場所を出力しているだけの部分なので、特に変更しなくても実害はないと思いますが)

スクリプト内容の修正が終わったら、起動時に自動実行されるように、以下のようなコマンドをコンソールまたはWebのコマンド実行画面から入力します。

schedule at スケジュール番号 startup * lua スクリプト名

 

今回の例では、以下のようにしました。スケジュール番号は、重複しなければ適当な数字を入れればOKです。また、 save コマンドを入力して、再起動しても設定が消去されないようにしておきます。

schedule at 99 startup * lua sd1:/local/call.lua
save

 

ここまで設定できたら restart コマンドを入力して再起動し、電話をかけてみましょう。以下のようなメールが届けば正常に動作しています。(電話番号などは例です)

Subject : 電話の着信を検知しました (2015/04/15 14:00:00)

Model: NVR500
Revision: Rev.11.00.25
Time: 2015/04/15 14:00:02

ログに検索文字列が検出されました。
検索文字列: "InComing Call from"

# show history | grep TEL | grep 通信中
2015/04/15  14:00:00  TEL*    [着信] 00:00:00    通信中   0120123456789

 

あとがき

これでセールスの電話がかかってきても即チェックできるなーと思いつつ、設定してから数日、そういう時に限って電話はかかってこないという、マーフィーの法則を地で行っている今日この頃ですが、目先の話はさておいても、月イチのSyslogチェックの手間は多少なりとも軽減されるかなーということで。

YAMAHA様のサイトには、他にも スクリプト例 が掲載されているので、いろいろ試してみるのも面白いかと思います。

……さて、そろそろNVR500だけでなく、購入してから4ヶ月くらい開封してないRTX1210の導入および、家庭内ネットワーク環境の変更にも手を付けないと……。

スポンサードリンク
GUILZ.ORG

View Comments

  • > 同じようなことをしたい方の参考になれば
    たんにメールの設定で詰まっていた者です。
    本記事を参考にYahooの送信サーバーを使うと送信できました。
    情報共有ありがとうございます。

    • コメントいただいていたのに気づいておらず、ご返信が遅くなりまして申し訳ございません。
      古い記事ですが、参考になったようでしたら幸いです。私の環境でも、この記事の設定のままで現在もメール通知がうまく動いておりますので、当面の間は使い続けられるのではないかと思います。

Share
Published by
GUILZ.ORG
スポンサードリンク