高頻度IPチェックスクリプト

前書き

巷にはIPの変化を観察して変更時にDDNSを更新するスクリプトは結構あります。
しかし、そのほとんどはPerlなど純正玄箱では使えないor使えなさそうなものが多いです。
でも、IPの変化を追うスクリプトがないと最長20-30分もアクセスできない時間が発生する・・・

メール鯖だと致命的な問題だよ?
どうする?どうする?どうする?どうする?どうする?どうする?
作るか・・・orz

使用上の注意をよく読み、用法・用量を守って正しくお使いください。

効能・効果
成分
用法・用量
取り扱い上の注意



効能・効果

このスクリプトはDDNS更新スクリプトのサブスクリプトです。
グローバルIPの変化をチェックし、変更時にDDNS更新スクリプトを呼び出し実行します。
負荷分散機能を搭載していますので、外部鯖の負担を減らすことができます。

成分

高頻度IPチェックスクリプトver100626、他(ip.tar.gz) md5sum crc32:14A722F1
  ip.sh
  ip.cgi
  getip.sh
  mn8300.sh
  mr504dv.sh
  bhr-4rv.sh
  readme.txt
  readme_linux.txt
  omake.tar.gz
  omake.tar.gz.md5
・root権限
・cron
・wget
・DDNS更新スクリプト
・CGIが動作する外部アカウント(ip.cgi利用時)

用法・用量

0.事前準備
wgetをインストールします。
IP取得スクリプト(getip.sh/mn8300.sh)などを置く場所を作成します。

	# mkdir /root/dat
DDNS更新スクリプトを作成し、[/root/]にアップロードします。
上記スクリプトがエラーなく実行できることを確認します。
サンプルスクリプト集を入手し、解凍します。

1.グローバルIPの取得する。
1-1)ip.cgiを使う場合
CGIが使用できるWEBスペースを確保(アカウントを入手)します。
所定の場所にip.cgiをアップロードし、ip.cgiが実行できることを確認します。
getip.shを[/root/dat/]にアップロードし、アクセス権を変更します。
	# chmod 700 /root/dat/getip.sh
設定を変更し、グローバルIPを取得できることを確認します。
getip.shの設定項目(デフォルト)
	・wgetの場所(/usr/bin/wget)
	# /root/dat/getip.sh http://hoge.fugafuga.com.jp/cgi-bin/ip.cgi
1-2)mn8300.shを使う場合
mn8300.shを[/root/dat/]にアップロード(または、移動)し、アクセス権を変更します。
	# chmod 700 /root/dat/mn8300.sh
設定を変更し、グローバルIPを取得できることを確認します。
mn8300.shの設定項目(デフォルト)
	・ログインユーザー名(admin)
	・ログインパスワード(admin)
	・mn8300のローカルIP(192.168.1.1)
	・wgetの場所(/usr/bin/wget)
1-3)自分でスクリプトを書く場合
グローバルIPアドレスが標準出力に表示されるものを作成してください。

必ず診断くんなどとスクリプトで取得したグローバルIPが一致することを確認してください。

2.ip.sh設定
ip.shの設定を変更し、[/root/]にアップロードします。
ip.shの設定項目(デフォルト)
	・グローバルIP取得スクリプト(/root/dat/mn8300.sh)
		注:自分で取得したWEBスペースを利用すること
		  getip0から使用し、使用する場合は行頭の#を削除すること
		  getip0〜getip9までの最大10個
		  getip.shを利用する場合は'(シングルクォート)でコマンドを括る
		  使わない場合は行頭に#を追加する
	・DDNS更新スクリプトの場所(/root/ddns.sh)
	・DDNS更新スクリプト確認キーワード(keyword)
		注:この機能はサンプルスクリプトでは無効にしてあります
	・IPアドレスのキャッシュファイルの場所(/root/dat/ip.db)
	・ログファイルの場所(/var/log/ip.log)
	・ロックファイルの場所(/tmp/ip.lock)
IPアドレスのキャッシュファイル、ログファイルを作成します。
	# echo -n test >/root/dat/ip.db
	# touch /var/log/ip.log
手動で実行し、エラーなく実行されアドレスが変更されているか確認します。
	# /root/ip.sh
	# cat /root/dat/ip.db
	# cat /var/log/ip.log
3.cronに登録し、自動で実行されるようにします。
	# crontab -e
		┃3-59/5 * *   *   *  /root/ip.sh
		┃02   6   *   *   *  /root/ddns.sh
			注:ip.shを3-59分の間、5分ごとに実行する
			  1日1回、6時2分にddns.shを実行する
DDNS更新スクリプトは1-3日に1回は実行するように設定します。
これは、アカウントを削除されないようにするためです(特に無料サービスを利用している場合)

取り扱い上の注意

外部の鯖を利用する場合、高頻度のグローバルIPの参照は迷惑になります。
cronとip.shの負荷分散設定で1サイト平均30分以上間隔をあけてアクセスするようにしてください。
計算式:[cronの実行間隔]=30/[有効なgetipの数]

まぁ、できるだけ自分のルーターを参照しろってことだね♪

関連ページ
	・wgetDDNS更新スクリプト独自ドメインの取得(VALUE DOMAINの場合)mydns.jpの場合ddo.jpの場合cronについて

あとがき

かなり時間をかけて温めてきたスクリプトですね。
負荷分散とか汎用化とかいろいろ勉強させてもらいました。
そのおかげでスクリプトの公開が遅れたわけですがw
まぁ、それはいいものを出すためってことで、許してやってください_( (_´Д`)_


負荷分散に関する情報

データ収集期間
	05/10/19-16:50から05/11/24-00:45まで

結果
	# ./count.sh
	all count is 10178
	cgi0 is 1032 : 10%
	cgi1 is 991 : 9%
	cgi2 is 1026 : 10%
	cgi3 is 1022 : 10%
	cgi4 is 936 : 9%
	cgi5 is 1040 : 10%
	cgi6 is 1006 : 9%
	cgi7 is 1017 : 9%
	cgi8 is 1040 : 10%
	cgi9 is 1068 : 10%

データ収集コード(負荷分散コードの最後に記載)
 		   echo "WARN : There are 11 scripts or more."
 		   exit 32;;
 	esac

+	#debug : load-balancing
+	echo "[$(date +%m/%d-%H:%M)] $num" >>/root/chk.txt
+	#end of debug

 	#check $ip
 	ea=`echo $ip | awk -F "." '{print $1$2$3$4}'`


計算用スクリプト(count.sh)
	#!/bin/sh
	cgi=`cat chk.txt | wc -l`

	cgi0=`cat chk.txt | awk '{print $2}' | grep "0" | wc -l`
	cgi1=`cat chk.txt | awk '{print $2}' | grep "1" | wc -l`
	cgi2=`cat chk.txt | awk '{print $2}' | grep "2" | wc -l`
	cgi3=`cat chk.txt | awk '{print $2}' | grep "3" | wc -l`
	cgi4=`cat chk.txt | awk '{print $2}' | grep "4" | wc -l`
	cgi5=`cat chk.txt | awk '{print $2}' | grep "5" | wc -l`
	cgi6=`cat chk.txt | awk '{print $2}' | grep "6" | wc -l`
	cgi7=`cat chk.txt | awk '{print $2}' | grep "7" | wc -l`
	cgi8=`cat chk.txt | awk '{print $2}' | grep "8" | wc -l`
	cgi9=`cat chk.txt | awk '{print $2}' | grep "9" | wc -l`

	echo "all count is ${cgi}"
	hoge0=`expr ${cgi0} \* 100`
	echo "cgi0 is ${cgi0} : `expr ${hoge0} / ${cgi}`%"
	hoge1=`expr ${cgi1} \* 100`
	echo "cgi1 is ${cgi1} : `expr ${hoge1} / ${cgi}`%"
	hoge2=`expr ${cgi2} \* 100`
	echo "cgi2 is ${cgi2} : `expr ${hoge2} / ${cgi}`%"
	hoge3=`expr ${cgi3} \* 100`
	echo "cgi3 is ${cgi3} : `expr ${hoge3} / ${cgi}`%"
	hoge4=`expr ${cgi4} \* 100`
	echo "cgi4 is ${cgi4} : `expr ${hoge4} / ${cgi}`%"
	hoge5=`expr ${cgi5} \* 100`
	echo "cgi5 is ${cgi5} : `expr ${hoge5} / ${cgi}`%"
	hoge6=`expr ${cgi6} \* 100`
	echo "cgi6 is ${cgi6} : `expr ${hoge6} / ${cgi}`%"
	hoge7=`expr ${cgi7} \* 100`
	echo "cgi7 is ${cgi7} : `expr ${hoge7} / ${cgi}`%"
	hoge8=`expr ${cgi8} \* 100`
	echo "cgi8 is ${cgi8} : `expr ${hoge8} / ${cgi}`%"
	hoge9=`expr ${cgi9} \* 100`
	echo "cgi9 is ${cgi9} : `expr ${hoge9} / ${cgi}`%"

	exit 0


戻るなら押せ!