「Ipcheck」の版間の差分
提供: Wikinote
細 (→ipaddr コマンド) |
(→ipcheck コマンド) |
||
行76: | 行76: | ||
#!/bin/bash | #!/bin/bash | ||
− | echo " | + | echo -n "$(date) ipcheck: " |
BASEDIR=${0%/*} | BASEDIR=${0%/*} | ||
− | |||
− | |||
cd $BASEDIR | cd $BASEDIR | ||
− | if [ | + | IPADDR=$(/path/to/ipaddr) |
− | + | if [ $? -ne 0 ]; then | |
− | echo " | + | echo "Error: No IP address" |
− | exit | + | > prev_ip |
+ | exit 1 | ||
fi | fi | ||
− | PREV_IP=$( | + | PREV_IP='' |
+ | if [ -f prev_ip ]; then | ||
+ | PREV_IP=$(< prev_ip) | ||
+ | fi | ||
− | if [ $IPADDR | + | if [ $IPADDR == $PREV_IP ]; then |
+ | echo "No change: $IPADDR" | ||
+ | else | ||
+ | echo $IPADDR > prev_ip | ||
/path/to/update-domain | /path/to/update-domain | ||
− | |||
− | |||
fi | fi | ||
− | |||
− | |||
これを crontab に登録する。 | これを crontab に登録する。 | ||
[hagio@lab ~]$ crontab -e | [hagio@lab ~]$ crontab -e | ||
− | 0 * * * * /path/to/ipcheck >> /path/to/logfile 2> | + | 0 * * * * /path/to/ipcheck >> /path/to/logfile 2> /dev/null |
+ | |||
+ | <s>エラー処理をほとんど行っていないので、考える必要がある。</s> | ||
− | + | 待ちわびていたエラーが発生したので、エラー処理を施した。 |
2009年5月21日 (木) 21:17時点における版
hagio.org の IP アドレスを自動的に更新するツール。
概要
うちのネットワーク環境は、フレッツ光による PPPoE 接続+VALUE-DOMAIN によるドメインである。 たまに接続が切断されて IP アドレスが変わってしまうので、これを自動で更新できるようにする。 VALUE-DOMAIN は HTTP アクセスによる IP アドレスの更新が可能なので、これを利用する。
シェルスクリプトで実装し、cron で動かすことにする。
ipaddr コマンド
まずは、後々のために現在の IP アドレスを出力するコマンド ipaddr を作る。 ifconfig ppp0 から IP アドレスを切り出すことにしよう。
[hagio@lab ~]$ ifconfig ppp0 ppp0 Link encap:Point-to-Point Protocol inet addr:203.212.48.216★ P-t-P:202.224.37.130 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1454 Metric:1 RX packets:419348 errors:0 dropped:0 overruns:0 frame:0 TX packets:226329 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3 RX bytes:533010019 (508.3 MiB) TX bytes:25575899 (24.3 MiB)
これ(★)を切り出せばよい。
[hagio@lab ~]$ cat ipaddr #!/bin/bash # old version #addrs=$( /sbin/ifconfig eth0 | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}' | head -n 1 ) addrs=$( /sbin/ifconfig ppp0 | egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' ) if [ $? -eq 0 ]; then echo $( echo "$addrs" | head -n 1 ) exit 0 else exit 1 fi [hagio@lab ~]$ ./ipaddr 203.212.48.216
update-domain コマンド
次に、IP アドレスを更新するコマンド update-domain を作る。 先ほど作成した ipaddr コマンドの出力を利用する。
[hagio@lab ~]$ cat update-domain #!/bin/bash IPADDR=$(/path/to/ipaddr) echo "IP address: " $IPADDR /usr/bin/curl "http://dynamic.name-services.com/interface.asp?Command=SetDNSHost&HostName=ホスト名&Zone=ドメイン名&DomainPassword=パスワード&Address=$IPADDR"
実行してみる。curl の出力は /dev/null に捨てるべきか?
[hagio@lab ~]$ update-domain IP address: 203.212.48.216 ;URL Interface<br> ;Machine is Reseller7-SJL<br> IP=203.212.48.216 Command=SETDNSHOST Language=eng ErrCount=0 ResponseCount=0 MinPeriod=1 MaxPeriod=10 Server=Reseller7-SJL Site=eNom IsLockable=True IsRealTimeTLD=True TimeDifference=+07.00 ExecTime=0.047 Done=true
ipcheck コマンド
前回実行時と現在の IP アドレスが異なっていれば、DNS サーバの HTTP インタフェースに変更を伝えるようにする。
ipcheck コマンドと同じディレクトリに、前回実行時の IP アドレスを prev_ip というファイル名で書き込むことにしよう。
[hagio@lab ~]$ cat ipcheck #!/bin/bash echo -n "$(date) ipcheck: " BASEDIR=${0%/*} cd $BASEDIR IPADDR=$(/path/to/ipaddr) if [ $? -ne 0 ]; then echo "Error: No IP address" > prev_ip exit 1 fi PREV_IP= if [ -f prev_ip ]; then PREV_IP=$(< prev_ip) fi if [ $IPADDR == $PREV_IP ]; then echo "No change: $IPADDR" else echo $IPADDR > prev_ip /path/to/update-domain fi
これを crontab に登録する。
[hagio@lab ~]$ crontab -e 0 * * * * /path/to/ipcheck >> /path/to/logfile 2> /dev/null
エラー処理をほとんど行っていないので、考える必要がある。
待ちわびていたエラーが発生したので、エラー処理を施した。