「Ipcheck」の版間の差分

提供: Wikinote
移動: 案内検索
(ipaddr コマンド)
(ipcheck コマンド)
行76: 行76:
 
  #!/bin/bash
 
  #!/bin/bash
 
   
 
   
  echo "ipcheck $(date)"
+
  echo -n "$(date) ipcheck: "
 
  BASEDIR=${0%/*}
 
  BASEDIR=${0%/*}
IPADDR=$(/path/to/ipaddr)
 
 
 
  cd $BASEDIR
 
  cd $BASEDIR
 
   
 
   
  if [ ! -s prev_ip ]; then
+
IPADDR=$(/path/to/ipaddr)
    echo $IPADDR > prev_ip
+
  if [ $? -ne 0 ]; then
     echo "Save current IP address: $IPADDR"
+
     echo "Error: No IP address"
     exit 0
+
    > prev_ip
 +
     exit 1
 
  fi
 
  fi
 
   
 
   
  PREV_IP=$(cat prev_ip)
+
  PREV_IP=''
 +
if [ -f prev_ip ]; then
 +
    PREV_IP=$(< prev_ip)
 +
fi
 
   
 
   
  if [ $IPADDR != $PREV_IP ]; then
+
  if [ $IPADDR == $PREV_IP ]; then
 +
    echo "No change: $IPADDR"
 +
else
 +
    echo $IPADDR > prev_ip
 
     /path/to/update-domain
 
     /path/to/update-domain
    echo $IPADDR > prev_ip
 
    echo "Send new IP address: $IPADDR"
 
 
  fi
 
  fi
 
exit 0
 
  
 
これを crontab に登録する。
 
これを crontab に登録する。
  
 
  [hagio@lab ~]$ crontab -e
 
  [hagio@lab ~]$ crontab -e
  0 * * * * /path/to/ipcheck >> /path/to/logfile 2>&1
+
  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

エラー処理をほとんど行っていないので、考える必要がある。

待ちわびていたエラーが発生したので、エラー処理を施した。