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クライアントで行っているから、裏で何をしているのかよく分からなくて・・・。

参考になった方、誤りを見つけた等、コメントを残してくれるとうれしいです。

Loading Facebook Comments ...

コメントする

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

No Trackbacks.