############################################## ### ### ### IP_Set_do.pl version 1.2.1 ### ### ### ### DynamicDNS IPアドレス設定 ### ### ddo(http://ddo.jp/) 専用 ### ### ### ### http://ai-line.com/linux/ ### ### しお ### ### ### ############################################## # 暗号化しませんので第三者から見えない場所に設置して下さい # ルーター環境下でも可能です # cron等で定時実行する場合は10分間隔以上にして下さい #=====================# # ddo 登録データ # #=====================# $server_name = 'ddo.jp'; # ホスト名 $username = '変更'; # ユーザー名 $password = '変更'; # パスワード $dir = '/usr/DDNS'; # このスクリプトを置く絶対パス #=====================# # 変更箇所は上記のみ # #=====================# # Socket モジュールを使う use Socket; # HTTP プロトコルを使う $port = getservbyname('http', 'tcp'); # IPアドレスチェック先 $ip_view_host = 'ddo.jp'; $ip_view_file = '/remote_addr.php'; # データファイル名 $ip_data_file = "$dir/old_ip"; &old_ip_read; &new_ip_read; if ($new_ip ne $old_ip){&ip_write;&ddns;} exit; #======================# # ここからサブルーチン # #======================# sub new_ip_read{ ### グローバルIPアドレス取得 # ip_viewスクリプトの設置場所 $check_addr = inet_aton("$ip_view_host") or die "$ip_view_host does not exist\n"; # ポート番号・IPアドレスを変換 $sock_addr = pack_sockaddr_in($port, $check_addr); # ソケット生成 socket(SOCKET, PF_INET, SOCK_STREAM, 0) or die "SOCKET ERROR!!\n"; # 指定のホストの指定のポートに接続 connect(SOCKET, $sock_addr) or die "$port PORT ERROR!!\n"; # ファイルハンドル SOCKET をバッファリングしない select(SOCKET); $|=1; select(STDOUT); # WWWサーバにHTTPリクエストを送る print SOCKET "GET $ip_view_file HTTP/1.0\n"; print SOCKET "HOST: $ip_view_host:$port\n"; print SOCKET "\n"; # ヘッダ部分を受け取る while (){ m/^\r\n$/ and last; } # ボディ部分を受け取る $new_ip = ; chomp($new_ip); unless ($new_ip =~ /[\d]+\.[\d]+\.[\d]+\.[\d]+/){print "IP Read ERROR!!\n";exit;} else{$new_ip = $&;} } sub old_ip_read{ # 前回のIPアドレスを取得 open(FILE, $ip_data_file); $old_ip = ; close(FILE); &time; } sub time{ my($time_old) = (stat("$ip_data_file"))[9]; my($time) = time; if ($time < $time_old + 600){ print "Wait for 10minutes\n"; exit; } open(OUT,">>$ip_data_file"); flock(OUT,2); truncate(OUT,0); print OUT $old_ip; close(OUT); } sub ip_write{ # ipアドレス保存 open(OUT,">>$ip_data_file"); flock(OUT,2); truncate(OUT,0); print OUT $new_ip; close(OUT); } sub ddns{ # ddnsサーバーへ接続 # GETデータ $get = "dn=$username&ip=$new_ip&pw=$password"; # ホスト名を変換 $iaddr = inet_aton("$server_name") or die "$server_name does not exist\n"; # ポート番号・IPアドレスを変換 $sock_addr = pack_sockaddr_in($port, $iaddr); # ソケット生成 socket(SOCKET, PF_INET, SOCK_STREAM, 0) or die "SOCKET ERROR!!\n"; # 指定のホストの指定のポートに接続 connect(SOCKET, $sock_addr) or die "$port PORT ERROR!!\n"; # ファイルハンドル SOCKET をバッファリングしない select(SOCKET); $|=1; select(STDOUT); # データ長を得る # $len = length($post); # WWWサーバにHTTPリクエストを送る print SOCKET "GET /dnsupdate.php?$get HTTP/1.0\n"; print SOCKET "HOST: $server_name:$port\n"; # print SOCKET "Content-length: $len\n\n"; print SOCKET "\n"; # ヘッダ部分を受け取る while (){ m/^\r\n$/ and last; } # 完了コメント表示 $check_addr = inet_ntoa($check_addr); print "IP_Set $old_ip => $new_ip OK!\n"; }