DiCEによってIPアドレスが更新された時にメールが欲しい・・・・と思い始めた。 思い立ったら即行動
・・・・ということで、どうやればいいか考える、まぁ~perlとかシェルスクリプトだよね・・・ なんて書いていますが、まったく知識なし!!!まずはPerlをやってみたいということで・・・ ググルンで独学開始!!
・・・・ということで、どうやればいいか考える、まぁ~perlとかシェルスクリプトだよね・・・ なんて書いていますが、まったく知識なし!!!まずはPerlをやってみたいということで・・・ ググルンで独学開始!!
なるほどね~~・・・・・・わからん!!! う~~ん、ヤフオクでそれ関係の本を探したが・・・無い っていうか、見て買わないとわからんでしょってことで、本屋へGO・・・ う~~ん、多少かじっているC言語(独学超初級レベル)に似てるから何とかなるようなならないような・・・ C言語はコマンドの違いに悩まされたなぁ~~・・・・
まぁ~実際にやりたいことを書き出す
1. IP更新があったか確認する
2. 変化ない場合は特に何もしない・・・logくらいとるか?・・・動作確認のため1日1回くらいはメール送信?
3. IPが更新されたらメールを送信・・・せっかくだから出来るだけ詳しく送りたい
・・・ こんなところか・・・最初は先頭の部分だけだったのだが、やってるうちに後ろのおまけが増えていきました・・・(^∀^2)、
で、Perlですがネットで調べたりフリーのフォームやメルマガのCGIなどのを参考にがんばってみましたが・・・IP更新があったか確認のところがどうも出来ない・・・CPANのFile::Compareでやろうとしたのだが・・・どうやってもインストールできない・・・Linuxで使えないのかな?ネットで検索するもほとんど出ない・・・・(検索が下手??) そこで仕方ないので、Perl覚えたかったけど、シェルスクリプトに変更
・・・w( ̄o ̄)w オオー! 結構ネット上にあるではないですか~~~これはいけるかも!! C言語でもそうだったが自分がしたいことは大体、条件分岐のあたりを覚えればやりたいことはほぼ出来るはず・・・・
まずは、IP更新があったか確認する方法はDiCEのlogがわかりやすいかな?? で、コマンドは?・・・やっといいのが探せたよ~!!その名は diff 2個のファイルの差を表示してくれるなんてステキだ!!これなら起動時にまずDiCEのlogをどっかにコピーしてからはじめれば・・・・(゜゜)(。。)(゜゜)(。。)ウンウン それで条件分岐してメール送信・・・それがまた問題だ・・・・・・・・ で、あ~でもない、こ~でもない・・・ネットを検索し実際にやってみての繰り返し・・・・試行錯誤でがんばること、ほぼ丸1日・・・・出来たのはのはこんな感じ
-----------------------------------------------------------------------------------------------------------------
#!/bin/sh
######### DiCE IPアドレス更新自動メールスクリプト #########
LOG='/var/log/DiCE/renw.log'
#これが、シェルスクリプトのログ
RENW='/backup/log/DiCE_renw.log'
#こっちが、更新された時のログの差、そしてメール本文になる
declare -i CNT
declare -i CNT24
declare -i ERROR
#declare -i で、これは数値ですよ~と教えてあげるそうです。探すの苦労したよ・・・
CNT='1'
CNT24='1'
ERROR='1'
rm -f /usr/local/bin/DiCE/log/renw.log
#サイズが大きくならないように再起動したとき古いログを削除
rm -f /backup/log/DiCE_renw.log
#メール本文が長いと(`×´)丿ウザイ!!ので再起動時毎回削除
echo `date` 再起動 >> $RENW 2>&1
#再起動しました表示を保存・・・これで、メール送信時BODY無いよERROR回避 #なるほど >> $RENW 2>&1 こう書くと上書きされないのね・・・・ヽd´ι`bノ Oh・・・
#`date`こんなステキなものが!!これでいつ何時にがすべてわかる!!
rm -f /backup/log/DiCE.log
#再起動したときに再コピーしないと正しい差が取れないので、古いログを毎回削除
cp -f /usr/local/bin/DiCE/log/events.log /backup/log/DiCE.log
#そして、すぐにDiCEのログと比較するための初期状態のログを適当な所にコピー #なぜか強制上書きコピーが出来ないので削除してからコピーにしてみた・・・なんで?
echo `date` 再起動 >> $LOG 2>&1
#シェルスクリプトのログにも再起動した時間を記入
until [ "$ERROR" -eq '0' ];
#ココからメイン until は条件が偽である間処理を繰り返す(do~done間) ここでは、diff でエラーが出たときに終了する
do sleep 600
#これのおかげで600秒(5分)に1度の実行になる その間CPUはお休み・・・・( - _ゞ ゴシゴシ (´0`)ゞファー
#最初はcronで実行しようとしていたが、それだと代入?した数値が毎回戻ってしまうので困りました・・・・/(-_-)ヽ が、これで解決!!CPUにも負担もかからんし (⌒^⌒)b うん
diff /usr/local/bin/DiCE/log/events.log /backup/log/DiCE.log >> $RENW 2>&1
#ついに出ました主役の登場!!これで、DiCEのログと再起動した時コピーした初期のログを比較させ差があったら保存!!
case "$?" in
#条件分岐 最初は if でやったが case の方がよさそうなので?こっちにした
#ここで重要なのが"$?" この子です!!これは最後に実行したコマンドの終了ステータスらしいです・・・ってことで直前は diff なので diff の返り値は・・・
#0 全く変更がなかった。
#1 変更があった。
#2 何らかのエラーが起こった。
#なので下記になる・・・・・(笑)
0)
#返り値が0の時 つまりIP変化なし・・・・
if [ "$CNT" -ge '12' ];
#せっかくだから if も使ってみたかった・・・・これで、5分×12回=1時間に1回ログを取る(まぁ~ちゃんと動作してるかの確認のため)
then
echo `date` IPアドレス変化なし >> $LOG 2>&1
CNT='1'
#CNTを1にリセット
if [ "$CNT24" -ge '24' ];
#さらに、ここで5分×12回×24回=24時間変化無しだったら・・・・
then
echo `date` IPアドレス24時間変化なし >> $LOG 2>&1
#ログ記録
cat $RENW|mail -s "DiCE IPアドレス24時間変化なしでした。" root
#メール送信・・・・ホントいらないんだけどIPあまり変わらないので寂しいので送信!! σ(^◇^;)ヒヤアセ
CNT24='1'
#CNT24を1にリセット
else CNT24=$(expr $CNT24 + 1)
#ココはちょっとつまずいた、ネットで探したのが count=`expr $count + 1` だったので最初これでやったらどうもうまくいかない、で他を探して成功・・・・ count=`expr $count + 1`の方がいっぱいあったのに・・・なんで?
fi else CNT=$(expr $CNT + 1)
#これは上もそうだが if の偽の方に来たら+1づつ加算・・・インクリメント・・・っていうんだっけ??( ̄ー ̄; ヒヤリ
fi
;;
1)
#返り値が1の時 つまり更新された時ですよぉ~~!!メインじゃないですかぁ~!!!・・・・
cat $RENW|mail -s "DiCE IPアドレス更新されました。" root
#これが今回1番のメイン!! ログの差の部分をrootにメールする う~ん見つけたときは嬉しかった (o^v^o)えへ
rm -f /backup/log/DiCE.log cp -f /usr/local/bin/DiCE/log/events.log /backup/log/DiCE.log
#これを忘れちゃいかん! 次回のためにDiCEログを再コピー
echo `date` DiCE.log更新しました >> $LOG 2>&1 echo `date` IPアドレス更新されました >> $LOG 2>&1
#ログ記録
CNT='1'
#CNTを1にリセット
CNT24='1'
#CNT24を1にリセット と言うことで更新があったら全て0からのスタート
;;
*)
#返り値がその他の時 つまり・・・・ diff エラーが出たときです 怖いですね~出て欲しくないですね~・・・
cat $RENW 0000|mail -s "DiCE diff エラーです・・・" root
#rootにメール送信
echo `date` diff エラーです・・・ >> $LOG 2>&1
#ログ記録
CNT='1'
#CNTを1にリセット
CNT24='1'
#CNT24を1にリセット
ERROR='0'
# ・・・・・・・・・・ERROR を0にする つまりスクリプト終了・・・・
;;
esac
done
-----------------------------------------------------------------------------------------------------------------
※Windowsパソコンで作成したのですが、保存文字コード&改行コードも注意ですね。 文字化けで色々試しましたがEUCが良いみたい・・・・(゚゚;)\(--;)オイオイ
後はこれを適当な所において、/etc/rc.d/rc.local に記入して自動起動させれば完成!!
まぁ~初の作品なのでスマートではないです・・・・・(^∀^2)、 もっと知識があれば、もっとステキに出来るはずなのに・・・・(TOT)
ちゃんとした知識のある人が見たら笑われそうですが、ど素人と言うことで笑って許してください。 アドバイスがあったら是非教えてください~~~ ペコリ(o_ _)o))
とりあえず、テストは成功!!・・・・しかし、実際にはまだ更新された時がない・・・・ルーターの電源切ってみようかな~~  ̄m ̄ ふふ
素人意見としては、ネットで検索していて説明が少なかったので細かく書いて見たが・・・・・(`×´)丿ウザイ!! (( ( (ヽ(;^^)/逃げろ~・・・・・・(o_ _)oドテッ!
うざくないやつはこちら → DiCE更新確認スクリプト
・・・う~~ん、作り終わって思ったのだが、ココまですればDiCEやめて全て出来るような気がする・・・検索中に自分の使っているDNSの更新方法もIPアドレスの確認方法も見つけたし・・・・ま~いっか~~ (; ̄ー ̄川 アセアセ
追記・・・・その後、しばらくして久々にサーバー本体から、いじろうとしたら(普段はTeraTerm)問題発覚!!・・・なんと、スクリプト実行中のため何も入力できないじゃん!! TeraTermからは普段どおり使えてたので気づきませんでした・・・さて、こういう場合どうすればいいのでしょうか?・・・・・・・(゜_゜i)タラー・・・
追記・・・上記の問題解決・・・特に問題ないので、放って置いたのだが σ(^◇^;)ヒヤアセ 調べてみると非常に簡単でした。解決法は /etc/rc.d/rc.local に記入する時、下記のように・・・・
読み込ませるスクリプト名の後に「&」を付けると、バックグランドで起動するんだって~ ひとつ賢くなったよぉ~・・・・皆さん知っているのだろうけどね・・・σ(^◇^;)ヒヤアセ




(1 投票, 平均値/最大値: 2 / 5)
まぁ~実際にやりたいことを書き出す
1. IP更新があったか確認する
2. 変化ない場合は特に何もしない・・・logくらいとるか?・・・動作確認のため1日1回くらいはメール送信?
3. IPが更新されたらメールを送信・・・せっかくだから出来るだけ詳しく送りたい
・・・ こんなところか・・・最初は先頭の部分だけだったのだが、やってるうちに後ろのおまけが増えていきました・・・(^∀^2)、
で、Perlですがネットで調べたりフリーのフォームやメルマガのCGIなどのを参考にがんばってみましたが・・・IP更新があったか確認のところがどうも出来ない・・・CPANのFile::Compareでやろうとしたのだが・・・どうやってもインストールできない・・・Linuxで使えないのかな?ネットで検索するもほとんど出ない・・・・(検索が下手??) そこで仕方ないので、Perl覚えたかったけど、シェルスクリプトに変更
・・・w( ̄o ̄)w オオー! 結構ネット上にあるではないですか~~~これはいけるかも!! C言語でもそうだったが自分がしたいことは大体、条件分岐のあたりを覚えればやりたいことはほぼ出来るはず・・・・
まずは、IP更新があったか確認する方法はDiCEのlogがわかりやすいかな?? で、コマンドは?・・・やっといいのが探せたよ~!!その名は diff 2個のファイルの差を表示してくれるなんてステキだ!!これなら起動時にまずDiCEのlogをどっかにコピーしてからはじめれば・・・・(゜゜)(。。)(゜゜)(。。)ウンウン それで条件分岐してメール送信・・・それがまた問題だ・・・・・・・・ で、あ~でもない、こ~でもない・・・ネットを検索し実際にやってみての繰り返し・・・・試行錯誤でがんばること、ほぼ丸1日・・・・出来たのはのはこんな感じ
-----------------------------------------------------------------------------------------------------------------
#!/bin/sh
######### DiCE IPアドレス更新自動メールスクリプト #########
LOG='/var/log/DiCE/renw.log'
#これが、シェルスクリプトのログ
RENW='/backup/log/DiCE_renw.log'
#こっちが、更新された時のログの差、そしてメール本文になる
declare -i CNT
declare -i CNT24
declare -i ERROR
#declare -i で、これは数値ですよ~と教えてあげるそうです。探すの苦労したよ・・・
CNT='1'
CNT24='1'
ERROR='1'
rm -f /usr/local/bin/DiCE/log/renw.log
#サイズが大きくならないように再起動したとき古いログを削除
rm -f /backup/log/DiCE_renw.log
#メール本文が長いと(`×´)丿ウザイ!!ので再起動時毎回削除
echo `date` 再起動 >> $RENW 2>&1
#再起動しました表示を保存・・・これで、メール送信時BODY無いよERROR回避 #なるほど >> $RENW 2>&1 こう書くと上書きされないのね・・・・ヽd´ι`bノ Oh・・・
#`date`こんなステキなものが!!これでいつ何時にがすべてわかる!!
rm -f /backup/log/DiCE.log
#再起動したときに再コピーしないと正しい差が取れないので、古いログを毎回削除
cp -f /usr/local/bin/DiCE/log/events.log /backup/log/DiCE.log
#そして、すぐにDiCEのログと比較するための初期状態のログを適当な所にコピー #なぜか強制上書きコピーが出来ないので削除してからコピーにしてみた・・・なんで?
echo `date` 再起動 >> $LOG 2>&1
#シェルスクリプトのログにも再起動した時間を記入
until [ "$ERROR" -eq '0' ];
#ココからメイン until は条件が偽である間処理を繰り返す(do~done間) ここでは、diff でエラーが出たときに終了する
do sleep 600
#これのおかげで600秒(5分)に1度の実行になる その間CPUはお休み・・・・( - _ゞ ゴシゴシ (´0`)ゞファー
#最初はcronで実行しようとしていたが、それだと代入?した数値が毎回戻ってしまうので困りました・・・・/(-_-)ヽ が、これで解決!!CPUにも負担もかからんし (⌒^⌒)b うん
diff /usr/local/bin/DiCE/log/events.log /backup/log/DiCE.log >> $RENW 2>&1
#ついに出ました主役の登場!!これで、DiCEのログと再起動した時コピーした初期のログを比較させ差があったら保存!!
case "$?" in
#条件分岐 最初は if でやったが case の方がよさそうなので?こっちにした
#ここで重要なのが"$?" この子です!!これは最後に実行したコマンドの終了ステータスらしいです・・・ってことで直前は diff なので diff の返り値は・・・
#0 全く変更がなかった。
#1 変更があった。
#2 何らかのエラーが起こった。
#なので下記になる・・・・・(笑)
0)
#返り値が0の時 つまりIP変化なし・・・・
if [ "$CNT" -ge '12' ];
#せっかくだから if も使ってみたかった・・・・これで、5分×12回=1時間に1回ログを取る(まぁ~ちゃんと動作してるかの確認のため)
then
echo `date` IPアドレス変化なし >> $LOG 2>&1
CNT='1'
#CNTを1にリセット
if [ "$CNT24" -ge '24' ];
#さらに、ここで5分×12回×24回=24時間変化無しだったら・・・・
then
echo `date` IPアドレス24時間変化なし >> $LOG 2>&1
#ログ記録
cat $RENW|mail -s "DiCE IPアドレス24時間変化なしでした。" root
#メール送信・・・・ホントいらないんだけどIPあまり変わらないので寂しいので送信!! σ(^◇^;)ヒヤアセ
CNT24='1'
#CNT24を1にリセット
else CNT24=$(expr $CNT24 + 1)
#ココはちょっとつまずいた、ネットで探したのが count=`expr $count + 1` だったので最初これでやったらどうもうまくいかない、で他を探して成功・・・・ count=`expr $count + 1`の方がいっぱいあったのに・・・なんで?
fi else CNT=$(expr $CNT + 1)
#これは上もそうだが if の偽の方に来たら+1づつ加算・・・インクリメント・・・っていうんだっけ??( ̄ー ̄; ヒヤリ
fi
;;
1)
#返り値が1の時 つまり更新された時ですよぉ~~!!メインじゃないですかぁ~!!!・・・・
cat $RENW|mail -s "DiCE IPアドレス更新されました。" root
#これが今回1番のメイン!! ログの差の部分をrootにメールする う~ん見つけたときは嬉しかった (o^v^o)えへ
rm -f /backup/log/DiCE.log cp -f /usr/local/bin/DiCE/log/events.log /backup/log/DiCE.log
#これを忘れちゃいかん! 次回のためにDiCEログを再コピー
echo `date` DiCE.log更新しました >> $LOG 2>&1 echo `date` IPアドレス更新されました >> $LOG 2>&1
#ログ記録
CNT='1'
#CNTを1にリセット
CNT24='1'
#CNT24を1にリセット と言うことで更新があったら全て0からのスタート
;;
*)
#返り値がその他の時 つまり・・・・ diff エラーが出たときです 怖いですね~出て欲しくないですね~・・・
cat $RENW 0000|mail -s "DiCE diff エラーです・・・" root
#rootにメール送信
echo `date` diff エラーです・・・ >> $LOG 2>&1
#ログ記録
CNT='1'
#CNTを1にリセット
CNT24='1'
#CNT24を1にリセット
ERROR='0'
# ・・・・・・・・・・ERROR を0にする つまりスクリプト終了・・・・
;;
esac
done
-----------------------------------------------------------------------------------------------------------------
※Windowsパソコンで作成したのですが、保存文字コード&改行コードも注意ですね。 文字化けで色々試しましたがEUCが良いみたい・・・・(゚゚;)\(--;)オイオイ
後はこれを適当な所において、/etc/rc.d/rc.local に記入して自動起動させれば完成!!
まぁ~初の作品なのでスマートではないです・・・・・(^∀^2)、 もっと知識があれば、もっとステキに出来るはずなのに・・・・(TOT)
ちゃんとした知識のある人が見たら笑われそうですが、ど素人と言うことで笑って許してください。 アドバイスがあったら是非教えてください~~~ ペコリ(o_ _)o))
とりあえず、テストは成功!!・・・・しかし、実際にはまだ更新された時がない・・・・ルーターの電源切ってみようかな~~  ̄m ̄ ふふ
素人意見としては、ネットで検索していて説明が少なかったので細かく書いて見たが・・・・・(`×´)丿ウザイ!! (( ( (ヽ(;^^)/逃げろ~・・・・・・(o_ _)oドテッ!
うざくないやつはこちら → DiCE更新確認スクリプト
・・・う~~ん、作り終わって思ったのだが、ココまですればDiCEやめて全て出来るような気がする・・・検索中に自分の使っているDNSの更新方法もIPアドレスの確認方法も見つけたし・・・・ま~いっか~~ (; ̄ー ̄川 アセアセ
追記・・・・その後、しばらくして久々にサーバー本体から、いじろうとしたら(普段はTeraTerm)問題発覚!!・・・なんと、スクリプト実行中のため何も入力できないじゃん!! TeraTermからは普段どおり使えてたので気づきませんでした・・・さて、こういう場合どうすればいいのでしょうか?・・・・・・・(゜_゜i)タラー・・・
追記・・・上記の問題解決・・・特に問題ないので、放って置いたのだが σ(^◇^;)ヒヤアセ 調べてみると非常に簡単でした。解決法は /etc/rc.d/rc.local に記入する時、下記のように・・・・
/root/DiCE_mail.sh &




(1 投票, 平均値/最大値: 2 / 5)人気度 : 10 %