ieserverのDDNSを書き換えるPerl
DDNSサービスで、今年から使い始めた、ieserver。
Perlのサンプルを公開していたので、初めて使って見ることにした。
サンプルはこちら。
コマンドラインから実行したら、正常に動いていたので、cronに組み込んでおきました。
ある日外部からアクセス出来ないので気づいた。動作していない。書き込み権限の問題かなと思って、そのときはとりあえず手動で実行して、また放置しておいてました。やっぱり動作していない。
重い腰を上げて、原因調査することにした。
テスト用プログラムを作って、原因切り分けしたところ。
$NEW_IP = `wget -q -O - $REMOTE_ADDR_CHK`
この部分が動作していない。手動で実行すると動いていて、cronからだと、動作しないのである。
OSがFreeBSDだからなのか?
運営者は、追加モジュールが必要の無い、作りにしたかもしれないけど、FreeBSDはwgetは標準では無い。
つまり、OSの違いを考えるのなら、Perlモジュールで対応した方がいい。でもPerlモジュールをインストール出来ない人もいるから、難しいところだ
と言うことで、wgetではなく、PerlモジュールをLWP::Simpleを使用する事にした。
変更した箇所は色を変えてみる。
#!/usr/bin/perl
use LWP::Simple;
$CURRENT_IP_FILE = "/usr/local/ddns/db/current_ip";
$LOG_FILE = "/usr/local/ddns/db/ip_update.log";
$REMOTE_ADDR_CHK = "http://ieserver.net/ipcheck.shtml";
$DDNS_UPDATE = "http://ieserver.net/cgi-bin/dip.cgi";
$ACCOUNT = "アカウント";
$DOMAIN = "ドメイン";
$PASSWORD = "パスワード";
if(!open(FILE,"$CURRENT_IP_FILE")) {
$CURRENT_IP = '0.0.0.0';
} else {
$CURRENT_IP = <FILE>;
chomp $CURRENT_IP;
close FILE;
}
$NEW_IP = '0.0.0.0';
$NEW_IP = get("$REMOTE_ADDR_CHK");
if ($NEW_IP ne "0.0.0.0" and $CURRENT_IP ne $NEW_IP) {
$STATUS = get("$DDNS_UPDATE?username=$ACCOUNT&domain=$DOMAIN&password=$PASSWORD&updatehost=1");
if ($STATUS =~ m/\s$NEW_IP\s/) {
open (FILE ,">$CURRENT_IP_FILE");
print FILE $NEW_IP;
close FILE;
$TIME = localtime;
open (FILE ,">>$LOG_FILE");
print FILE "$TIME $ACCOUNT.$DOMAIN Updated $CURRENT_IP to $NEW_IP\n";
close FILE;
} else {
$TIME = localtime;
open (FILE ,">>$LOG_FILE");
print FILE "$TIME $ACCOUNT.$DOMAIN Update aborted $CURRENT_IP to $NEW_IP\n";
close FILE;
}
}
元々、m/$NEW_IP/ の記述があったところがあるが、これでは、動作不良が起きる可能性があった。
たとえば、192.168.1.100と、192.168.1.10が同じと解釈してしまう。
IPの変更画面を解析したところ、IPアドレスの前後に、スペースがあったので、『 192.168.1.100 』
m/\s$NEW_IP\s/
と言う風にしてみた。
IPの変更画面の作りに不備も見つかったけど、これは私では対処出来ないので、一応リストアップだけしておく。
タイトル部分 「GunDIP2」と書いているけど、GnuDIP2かな?
新しいIPアドレスの部分、『<b>192.168.1.100<b>に更新』とある。<b>を閉じていない。
ホントは、IPアドレスを取得するところを、
m/<b>$NEW_IP<\/b>/ という感じで取得したかった。まぁ、半角スペースでも良いけど。
DDNSの更新、Perlで自分で取得して反映できるのは、なんか安心だ。
普段は、Windowsクライアントで行っているから、裏で何をしているのかよく分からなくて・・・。