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 ...

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です