############################################## ### ### ### IP_Set_dhs.pl version 1.1.1 ### ### ### ### DynamicDNS IPアドレス設定 ### ### dyn(http://www.dhs.org/)専用 ### ### ### ### http://ai-line.com/linux/ ### ### しお ### ### ### ############################################## # 暗号化しませんので第三者から見えない場所に設置して下さい # ルーター環境下でも可能です # cron等で定時実行する場合は20分間隔以上にして下さい #=====================# # dhs 登録データ # #=====================# $id = '変更'; # ユーザー名 $password = '変更'; # パスワード $server_name = 'dyn.dhs.org'; # ドメイン名(dyn.dhs.org 又は 2y.net) $mx = ''; # メールサーバーを立ち上げている場合には # 'ホストネーム.ドメイン名'で指定する。 # (例)mymx.dyn.dhs.org $username = '変更'; # ホストネーム $dir = '/usr/DDNS'; # このスクリプトを置く絶対パス #=====================# # 変更箇所は上記のみ # #=====================# # Socket モジュールを使う use Socket; # HTTP プロトコルを使う $port = getservbyname('http', 'tcp'); # IPアドレスチェック先 $ip_view_host = 'ai-line.com'; $ip_view_file = '/linux/ip_view.cgi'; # データファイル名 $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 + 1200){ print "Wait for 20minutes\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サーバーへ接続 # POSTデータ $get = "hostscmd=edit&hostscmdstage=2&type=4&updatetype=Online&ip=$new_ip&submit=Update&domain=$server_name&hostname=$username&mx=$mx"; # ホスト名を変換 $dhs_server_name = "members.dhs.org"; $iaddr = inet_aton("$dhs_server_name") or die "$dhs_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 /nic/hosts?$get HTTP/1.0\n"; print SOCKET "HOST: $dhs_server_name:$port\n"; # print SOCKET "Content-length: $len\n\n"; print SOCKET "Authorization: Basic\n "; print SOCKET &encode_mime_B("$id:$password")."\n\n"; # print SOCKET "$get"; print SOCKET "\n"; # ヘッダ部分を受け取る while (){ m/^\r\n$/ and last; } # 完了コメント表示 $check_addr = inet_ntoa($check_addr); print "IP_Set $old_ip => $new_ip OK!\n"; } sub encode_mime_B { @d64 = ( "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P", # 0 "Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f", # 1 "g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v", # 2 "w","x","y","z","0","1","2","3","4","5","6","7","8","9","+","/" # 3 ); if ( $_[1] eq 'header' ) { $b_encoded = "=?ISO-2022-JP?B?"; } else { $b_encoded = ""; } for ( $ix = 0; $ix < length($_[0]); $ix += 3 ){ $encode_token = substr($_[0],$ix,3 ); $len = length($encode_token); $encode_code = ord( substr($encode_token,0,1) ) * 256 * 256 ; $encode_code += ord( substr($encode_token,1,1) ) * 256 if ($len >= 2); $encode_code += ord( substr($encode_token,2,1) ) if ($len >= 3); $b_encoded .= $d64[$encode_code >> 18 & 0x3f]; $b_encoded .= $d64[$encode_code >> 12 & 0x3f]; $b_encoded .= $d64[$encode_code >> 6 & 0x3f] if ($len >= 2); $b_encoded .= $d64[$encode_code & 0x3f] if ($len >= 3); } $b_encoded .= "==" if ( $len == 1 ); $b_encoded .= "=" if ( $len == 2 ); if ( $_[1] eq 'header' ) { $b_encoded .= "?="; } return ( $b_encoded ); }