swatchコマンドでログの文字監視を行う、見つけたらdhcpを再起動しちゃう

シェアする

Pocket

60爺は、ここ2日ほど、dhcpサーバが何故か落ちまくり、家のLANが全滅するなど、散々な状況になってました。

何とか回復しましたが、再び落ちた時のために有効な手を打ちたいと思っていました。師匠50オヤジに相談すると、ログの文字監視を行う swatch コマンドなるものがあるとのこと、早々取り入れてみます。

1.Swatch のインストール

mizutan@raspbian:~ $ sudo aptitude install swatch

以下の新規パッケージがインストールされます:

libbit-vector-perl{a} libcarp-clan-perl{a} libdate-calc-perl{a} 


libdate-manip-perl (6.47-1) を設定しています ...
libfile-tail-perl (0.99.3-5) を設定しています ...
swatch (3.2.3-1) を設定しています ...

パッケージのファイル一覧

mizutan@raspbian:~ $ dpkg -L swatch 
/.
/usr /usr/bin


/usr/share/doc/swatch/changelog.Debian.gz
/usr/share/doc/swatch/changelog.gz
/usr/share/doc/swatch/README.gz
mizutan@raspbian:~ $

2.swatchによるログ監視

swatchコマンドの大まかな書式は以下の通りです。

swatch -c 設定ファイル -t 監視するログファイル

今回は、syslogを監視します。
設定ファイルには、以下を記述します。複数記述することも可能です。

watchfor /正規表現によるパターン/
  アクション
...

見つけたい文字は、下記のdncpがdownする時のメッセージです。ですので、「正規表現によるパターン」にはNetwork is downを設定することになります。

【dncpがdownする時のメッセージ】

Jul 25 06:25:10 raspbian dhcpd: receive_packet failed on eth0: Network is down

アクションは次の3つです。

  1. 自分のLINEにメッセージを飛ばす
  2. dhcpをrestartさせる
  3. 文字監視を継続する

3. なんですが、いろいろ見ていたら、swatchは文字監視して、アクションを実行すると止まってしまうと書いてあるため、その後も監視を継続するようにしたいためにアクションを入れてます。

こうなります。

watchfor /Network is down/ 
exec LINEにメッセージを送付するシェル 1.
exec service ipc-dhcp-server restart 2.
continue 3.

テストして、OKが取れたらリリースします。

3.swatchの動作テスト

まずは、swatchがログの文字列を監視して、それに見合った動きをするかテストします。

下記記事の「Swatchの基本的な使い方」に従って始めました。但し、この記事は環境がCentOSですので、一部RaspberryPiと合わない部分があります。

たとえば、ログファイル/var/log/secureがありません。

仕方がないので、対象ファイルを/var/log/auth.logに変更して行いました。そのため、設定ファイル名を「swatchrc.secure」から「swatchrc.auth」に変更しました。

当然、検索文字も変更を余儀なくされ、Accepted password forを検索することにしました。

サーバのログを監視するSwatchの導入方法と使い方を解説

さて、それでは実験開始。

設定ファイルを作成します。隠しファイルとして作成していますね。

# vi ~/.swatchrc.auth

ログイン成功時にログの一部に「Accepted password for」と出力されるのでこれをパターンに登録します。
合わせて、LINE Notify 宛にメッセージを送付します。

watchfor /Accepted password for/ 
echo
exec ./LINE.sh 緊急 Network_is_Down

execにある LINE.sh は、以前紹介したLINE Notify 宛メッセージ送付のシェルです。

すぐさま、起動してみました。

swatch -c ~/.swatchrc.auth -t /var/log/auth.log &

すると、下記の表示がなされました。どうやら、プロセス名と思われます。

[1] 5442

起動ができたようですので、別の端末からログインしてみました。

root@raspbian:~# Use of uninitialized value $attr in concatenation (.) or string at /usr/share/perl/5.20/Term/ANSIColor.pm line 486, line 25. Jul 27 15:28:22 raspbian sshd[5463]: Accepted password for mizutan from 150.39.72.1 port 18064 ssh2 
{"status":200,"message":"ok"}

すると上記のようなログがコンソールに表示されました。

2行目はログインがあったとのメッセージで echo 文が出しています。
3行目は LINE へのメッセージ送付のものと思います。LINE Notify 宛にきちんとメッセージが届いておりました。

そこで、気になるのが1行目のログです。これって、Perlのワーニングみたいですね。参考記事には、こんなことは記載されていませんでした。消せないのかな・・・・。

ちょっと気になるワーニングはさておき、テストが出来たので、本来の目的であるネットワークダウンの対策にかかりたいと思います。

4.dhcp:Networkダウンの対策

swatchが動くことが分かったので、dncpでネットワーク・ダウンが発生したときの対策を取ります。2.で述べたアクションを3つ設定します。
① exec LINEにメッセージを送付するシェル
② exec service ipc-dhcp-server restart
③ continue
の3つですね。

①は、exec ./LINE.sh 緊急 Network_is_Downとなります。②はそのまま 採用。テストしてわかったんですが、③を指定しなくてもswatchは動き続けてくれるようです。ですので③採用は見送り=削除します。

.swatchrc.syslog 

watchfor /Network is down/
exec ./LINE.sh 緊急 Network_is_Down
exec service ipc-dhcp-server restart

これで save した後、実行します。監視するログが syslog になりますので、swatch実行は、こうなります。

root@raspbian:~# swatch -c ~/.swatchrc.syslog -t /var/log/syslog & 
[1] 9870
root@raspbian:~#
*** swatch version 3.2.3 (pid:9870) started at 2017年 7月 27日 木曜日 16:48:01 JST

9870で動き始めました。

これで、万が一、dhcpが落ちても、再起動がかかるはずです。また、LINEに連絡が来ますので、60爺がぼけてなければ、すぐさま対応がとれる状態になりました(なったはずです^^;)。さあ、どんと来いですね。

5.kernelのメッセージも拾っちゃおう

あと、syslogでERROR表示がなされたら、警告が来るよう、ログ監視に追加しました。

root@raspbian:~# cat .swatchrc.ERROR 
watchfor /ERROR/
exec ./LINE.sh 警告 ERRORメッセージが表示

さっそく駆動します。

root@raspbian:~# swatch -c ~/.swatchrc.ERROR -t /var/log/syslog &  
[1] 3224
root@raspbian:~#
*** swatch version 3.2.3 (pid:3224) started at 2017年 7月 28日 金曜日 12:44:11 JST

これで、サーバ192.168.XXX.XXXに、ネットワークダウンが発生したときと、syslogにERRORが表示された際、60爺の LINE Notify にメッセージが送付されることになります。

うん、何か、IoTみたいなことをやったような気がします。

スポンサーリンク

シェアする

フォローする