Ubuntuでは元々入っていたsyslogを入れ替えてsyslog-ngというsyslogを使いリアルタイムにログから決めたワードに従ってスクリプトを走らせるように作り込んでいました。
今回は、元々入っているrsyslogで上記と同じように設定をします。ただ、ログに対してスクリプトを走らせるのは簡単なのですが、ヒットしたログの値(引数)を貰ってスクリプトに引き継ぐのが結構メンドクサイです。
多数のスクリプトを使い複雑な処理をさせると処理に多少時間がかかって処理が遅れるのでハッキング情報の取得対処に応用した時にラグが生じてしまうため、それは避けたいと思いました。
NVR510ルータは光電話に契約して使用していればSIPのログを吐き出すので、それを用いて電話を発信したり受信した際にログからメールやLINEを投げるように作りこみをします。
まず、NVR510ルータのログをサーバ側で受け取れるように設定をします。
シェル(sh)のスクリプトを作成
適当なフォルダに作成します。当然そこがスクリプトの位置となるのでビッタと決まった位置に作成します。
下スクリプトの各ログファイルとかのファイルパスは、絶対パスがいいと思います。
下スクリプトの各ログファイルとかは、空ファイルを作成してあげましょう
address_log.txtはTAB区切りで名前をいれるとメール受信時にスマホで誰から電話があったか?分かるようになります。
素人作りですが、こんな感じで作りました。もっと精通している人はカッコよく書けるんだろうな~
.txtは以下のコマンドで作ります。
touch ***.txt
***@raspberrpi: vi telmail.sh
#!/bin/sh
## Phone Mail Program
#Mail Path
export PATH=$PATH:/usr/sbin
case $@ in
*"SIP Call from"*) callf=`echo $1 | cut -d " " -f 9 | cut -c 6-16` ;;
*"SIP Call to"*) callt=`echo $1 | cut -d " " -f 9 | cut -c 6-16` ;;
esac
##NOT MAIL
if [ "$callt" = "*********" ]; then
exit 0
fi
#MAIL ADD
MAIL_TO="****@**.***.***"
MAIL_FROM="****@**.***.***"
#LOG WRITE
echo $@ >> phone_log.txt
#ADRESS WRITE
sear="address_log.txt"
#TEL FROM TOUROKUZUMI
if [ "$callf" != "" ]; then
if [ "`grep $callf $sear`" ]; then
# TAB 2
DATA_FST=$(grep $callf $sear | cut -f 2)
SUBJECT="家に電話がありました"
DATA=$callf
DATA_CNT="さんより電話がありました"
else
#TEL FROM MITOUROKU
echo $callf >> address_log.txt
SUBJECT="家に電話がありました"
DATA=$callf
DATA_CNT="名前が未登録の方より電話がありました"
DATA_DAI="名前登録は以下のアドレスから"
DATA_ADD="iphone.cgi?syu=$calltf";
fi
fi
#TEL TO TOUROKUZUMI
if [ "$callt" != "" ]; then
if [ "`grep $callt $sear`" ]; then
DATA_FST=$(grep $callt $sear | cut -f 2)
SUBJECT="家から電話を掛けました"
DATA=$callt
DATA_CNT="さんへ電話を掛けました"
else
#TEL TO MITOUROKU
echo $callt >> address_log.txt
SUBJECT="家から電話を掛けました"
DATA=$callt
DATA_CNT="名前が未登録の方へ電話を掛けました"
DATA_DAI="名前登録は以下のアドレスから"
DATA_ADD="iphone.cgi?syu=$callt";
fi
fi
# NAIYOU ERROR SHORI
if [ "$SUBJECT" = "" ]; then
exit 0
fi
# Mail Transfer
mail_send () {
cat << EOD | nkf -j -m0 | sendmail -t
From: ${MAIL_FROM}
To: ${MAIL_TO}
Subject: ${SUBJECT}
MIME-Version: 1.0
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit
${DATA_FST}${DATA_CNT}
電話番号:${DATA}
${DATA_DAI}
${DATA_ADD}
EOD
}
mail_send
exit 0
rsyslogの設定
スクリプトはできたものの、Syslogとスクリプトの要で必要なのがrsyslog.confの設定です。
Webを徘徊していると、/etc/rsyslog.d/***.confと適当に作ったファイルをぶっこんで、実施するやり方とかありましたが、結局、認識されないというか?rsyslog.confにIncludeの記述があるのですが動きませんでした。
Syslog-ngの時は色々な文献があったのですが、rsyslogはそれらしいものがなかなかないので苦労しました。ほぼ、トライアンドエラーです。
結構な時間を費やし、それなら、と/etc/rsyslog.confに直接、書き込んだらみごと動きました。
vi /etc/rasyslog.conf
もともとファシリティのlocal0のみ取れればよかったのですが、rsyslogは全部のSyslogを見てイベントをフックしているようです。
以下をrsyslog.confへ追記します。
# Phone GET LOG
$template telmail_msg, “%timegenerated% %hostname% %msg%\r\n”
if $msg contains ‘ntt-****.ne.jp] connected.’ then ^phone.sh;telmail_msg
omprogとかありましたが、そんなモジュール宣言しなくてもできました。
rsyslogのバージョンが古いやつはいるのかも知れません。(汗
一番、参考になったサイトはこちらです。
https://knowledge.sakura.ad.jp/8975/
Syslogをスクリプトへ引数付きで受け渡す時にrsyslogはテンプレート形式で記述します。
実際の記述方法です。
$templateの後は、変数みたいなもの(telmail_msg)で何でもOKです。
その後に続くのが、.shに渡す引数になるログです。
受け渡すメッセージタイプはrsyslogでは決まっています。(定型です)
「msg」は「メッセージ本体」です。時間とかホストとかの情報はこの中にはありません。
「hostname」は文字通り「出力元のホスト名」です。
「timegenerated」は「メッセージを受け取った時刻」です。
この3つを使うと、元々吐き出されているSyslogと同じになります。
最後に改行がないと、txtに落とした時におかしな内容になるので改行しておきます。
if $msg contains ‘ntt-****.ne.jp] connected.’ then ^telmai.sh;telmail_msg
ここの用語(ntt-****.ne.jp] connected.)がフックになって、この用語にヒットするとSyslogからtelmail.shへtelmail_msgの変数付きで受け渡されます。
ntt-***.ne.jpのログは3ウェイハンドシェークみたいにconnected含めて1回で3つくらいあるので、3つのうちメール送信に必要なログのみ取るようにしてあります。
今回、使用した「contains」は「指定した値を含む」です。
他に使えそうなものは
「startswith」は「指定した値で始まる」
「regex」は「指定した値を正規表現とし、それにマッチする」
などは使えそうですね。
正しく、動くか確認する間は、phone.shの最後、「mail_send」はコメントアウトして置きましょう。
記述後、rsyslogを再起動します。
/etc/init.d/rsyslog restart
電話を掛けるとtelmail_log.txtへSyslogが書き込まれます。
うまく動作確認がとれたら先ほど、コメントアウトしたものを元に戻しましょう。
なぜかしら?直接、スマホにphone.shでSendmailすると届きません。何かしら?スマホ側に合わないコードがあるようです。その時はprocmailなどで経由させると送れます。(誰か?教えて!
という事で無事、不在時でも自宅電話に着信したらスマホにメールでお知らせしてくれる。機能が実装できました。
これ!?留守番電話機能!?