#!/usr/bin/perl -w
# -w ワーニングを出す
# /usr/local/bin/ddns4nifty/ddns4nifty-090302.pl
# nifty ddns 2008/12/3 のリニューアルに対応
# new ip 読み込み他をサブルーチン化する 2009/02/26--->2009/03/01
# wgetで正しく更新されたことを確認した後、その旨を書き出す 2009/02/26--->2009/03/01
# マッチパターンにマッチしなかった場合にif文での判断を修正(2009/03/03)
#
# 完成 2009/03/03
use strict; # 宣言した変数以外を使えなくする
my $niftyid="NIFTYID";
my $niftypass="NIFTYPASSWORD";
my $file="/usr/local/bin/ddns4nifty/ipaddr.txt";
my $update="/usr/local/bin/ddns4nifty/update.log";
my $no_update="/usr/local/bin/ddns4nifty/no_update.log";
my $ip_change_log="/usr/local/bin/ddns4nifty/ip_change_log.txt";
my $ip_change_log_temp="/usr/local/bin/ddns4nifty/ip_change_log_tmp";
my $wget;
my $ipaddr ;
my $oldipaddr;
my $i ;
my $ok_pattern = "0K .......... ";
my $ok_update="";
my $line ;
my $null="";
$| = 1; # ゼロ以外が代入されると出力をバッファリングしなくなる。
# ########################### メインプログラム ###############################
open FH, "<",$file || die "Error: ipaddr.txt $!\n" ; #ファイルを入力で開く
$oldipaddr = <FH> # 記録されているIPアドレスを入力
close FH;
LABEL1: for($i=1 ; $i<4 ; $i++ ) { ; # 最大3回IPアドレスを求める
$ipaddr=&newip(); # 新しいipアドレスに変更されているかチェック
# print "Debug 1\n";
last LABEL1 if($ipaddr ne $null ) ; # 新しいIPアドレスが正しく得られていればループを抜ける
}
# print "Debug 2\n";
if( $ipaddr eq $null ) { ; # 正しくIPアドレスが得られたか?
&no_new_ip( $no_update ) ; # 3回トライしました。でもipアドレスが得られません。新しいIPアドレスが得られないエラー
# print "Debug 3\n";
}
elsif ( $ipaddr eq $oldipaddr ) {
&noipchange( $no_update ); # IPアドレスに変更なし ---------------------------------------------------------------
# print "Debug 4\n";
}
else {
for ( $i=1 ; $i<4 ; $i++ ) { ; # 最大3回IPアドレスの更新を試みる
# print "Debug 5\n";
$wget=`wget --secure-protocol=auto --no-check-certificate -O- -v -o $ip_change_log_temp --http-user=$niftyid --http-passwd=$niftypass https://domain.nifty.com/cp/ddns/DdnsIpChangeAdd.do?change_type=ip` ; # 2008/12/3 のniftyのddnsリニューアルに伴い変更
sleep(1) ; # 1秒待つ
open IN,"<",$ip_change_log_temp;# 記録されているサーバーの更新ログを読み込む
LABEL3: while ($line = <IN>) { ;# ok パターンを探す
if ( $line =~/0K .......... / ) {; # ok パターンにマッチ
# print "Debug 11 ok_pattern_\n" ;
$ok_update ="0K .......... ";
last LABEL3 ;
}
}
close IN ;
# print "Debug 12 $ok_update\n" ;
if ( $ok_update eq $ok_pattern ) { ; # 正しくIPアドレスが更新された場合 ----------------
# print "Debug 6\n";
open FH,">",$file|| die "Error: ipaddr.txt $!\n" ;
print FH "$ipaddr" ; # 変更された新しいIPアドレスをfileに書き出す
close FH;
&time_prt($ip_change_log); # 時刻の呼び出しとプリント
open IN,"<",$ip_change_log_temp;# 記録されているサーバーの更新ログを読み込む
open (OUT,">> $ip_change_log"); # $ip_change_log.txtにサーバーログを書き込む
print OUT "\n"; # 時刻を記述しただけなのでその後に「改行コード」を加える
while ($line = <IN>) { ; # 1行づつ読み込む
print OUT "$line" ; # 1行づつ書き出す(append)、元の行に「改行コード」があるため、改行は記述せず
}
print OUT "New IP ADDRESS=$ipaddr\n\n" ; # 変更された新しいIPアドレスをfileに書き出す
close IN ;
close (OUT) ;
&time_prt($update); # 時刻の呼び出しとプリント
open (OUT,">> $update"); # update.log fileに更新記録を書き込む
print OUT "ip addres is changed:$ipaddr\n" ; # IPアドレスが更新された旨を書き出す
close(OUT);
exit ; # ループを抜けて、終了する。
}
# print "Debug 7\n";
}
# 正しくIPアドレスが更新されなかった場合 ------------------------------------------------------
&time_prt($update); # 時刻の呼び出しとプリント
open (OUT,">> $update");
print OUT "3回試みましたが正しくIPアドレスが更新されませんでした\n" ; # IPアドレスが正しく更新されなかった。
close(OUT);
# print "Debug 8\n";
}
exit(0) ;
# ################################## メインプログラム エンド #####################
# ------------------------------- 新しいipアドレスを求める ----------------------------
sub newip {
my $ip;
my $wget_s = `wget --no-check-certificate -O- -q http://domain.nifty.com/domain/DdnsIpChangeConfirm.do?DDNS_CHANGE_IP=IP%95%CF%8DX%83y%81%5B%83W%82%D6` ; # 2008/12/3 niftyのddnsリニューアルに伴い変更
$wget_s =~/[0-9]+(\.[0-9]+){3}/; # IPアドレスとのマッチパターン
$ip = $&; # マッチしたIPアドレスを入力
# print "Debug newip=:$ip\n";
return $ip ;
}
# ----------------------------- 新しいIPアドレスが得られなかった --------------------------
sub no_new_ip {
my $no_up=$_[0];
&time_prt($no_up); # 時刻の呼び出しとプリント
open (OUT,">>$no_up");
print OUT "3回トライしました。でもipアドレスが得られません。\n" ; # 新しいIPアドレスが得られないエラー
close(OUT);
}
# ----------------------------- IPアドレスに変更なし ---------------------------------------
sub noipchange {
my $no_up=$_[0];
# print "Debug no_update file :$no_up\n";
&time_prt($no_up); # 時刻の呼び出しとプリント
open (OUT,">>$no_up");
print OUT "ip address is not changed:$ipaddr\n" ; #IPアドレスに変更無し
print OUT "" ;
close(OUT);
}
# ----------------------------- 時刻のプリント ----------------------------------------------
sub time_prt {
my $no_up2=$_[0]; # 引数が一つの場合は$_[0]を、引数が複数の場合は@_[0],@_[1],----@_[n]を使う
my $sec;
my $min;
my $hour;
my $mday;
my $mon;
my $year;
my $wday;
my $yday;
my $isdst;
my $tt;
$tt=time();
($sec, $min, $hour, $mday, $mon, $year,
$wday, $yday, $isdst) = localtime($tt);
$year=$year+1900;
$mon=$mon+1;
open (OUT,">> $no_up2");
printf OUT "%02d/%02d/%02d %02d:%02d:%02d ", $year,$mon,$mday,$hour,$min,$sec ;
close(OUT);
}