2007/12/11(火)22:55
DDNS自動更新(修正)
* バグがあったので取りました。
ieserver.netのdip.jpでアカウントとってるんだけど、ルータ再起動したりしてipアドレスが変わったときに一々手動で更新するのが面倒かった。
AOCやるときとかAOCやるときとかAOC(ry
なんか適当にスクリプト作ればやれるっぽさげだったんでスクリプト作ってみた。
#!/opt/csw/bin/ruby
# ieserver.netのDDNS情報を更新する
# postするurlの形式
# https://ieserver.net/cgi-bin/dip.cgi?username=***&password=***&domain=dip.jp&updatehost=1
require 'net/http'
Net::HTTP.version_1_2 # おまじない
# ディレクトリ
WORKDIR="データを保存するディレクトリ"
# 以前のIPアドレスを保存するファイル
SAVFILE=WORKDIR+"oldip.dat"
# ログファイル
LOGFILE=WORKDIR+"log.dat"
# 各種データを入れるハッシュ
hash={}
# 各種情報の設定
hash["dst_url"]="https://ieserver.net/cgi-bin/dip.cgi"
hash["username"]="your account"
hash["password"]="your password"
hash["domain"]="your domain"
# hash["fqdn"]= hash["username"] + "." + hash["domain"]
####
# ipアドレス更新時の処理
def renew( newip , hash)
# 新しいipアドレスを保存
open( SAVFILE, "w" ){|f|
f.puts newip
}
# DNS情報更新
data= "username=" + hash["username"] + "&password=" + hash["password"] + \
"&domain=" + hash["domain"] + "&updatehost=1"
# wgetを使います。 1.10.2 では下記のようにすることで更新が可能。
system("wget -q --no-check-certificate - '#{hash["dst_url"]}?#{data}'")
end
####
# 各種保存ファイルが無いときのために・・・
begin
open(SAVFILE){|f|}
open(LOGFILE){|f|}
rescue
# 各種保存用ファイルを作る。
# 作れないときの処理は省略
open(SAVFILE, "w"){|f|
f.puts "0.0.0.0"
}
open(LOGFILE, "w"){|f|
f.print "[" , Time.new.to_s, "] ", "Log file created. \n"
}
end
# 現在のIPアドレスをチェックする
# address chech url
# http://info.ddo.jp/remote_addr.php
Net::HTTP.start( "info.ddo.jp" ,80){ |http|
res = http.get("/remote_addr.php")
# curipにipが入る
res.body.scan(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/){|curip|
print "current ipaddress is " , curip , "\n"
open( SAVFILE , "r"){|o|
open( LOGFILE , "a"){|log|
res_output=""
# 前のipアドレスがoldipに入る
oldip=o.gets.chomp
# ipアドレスが変わっているとき
if oldip != curip then
renew(curip, hash)
res_output = "[" ,Time.new.to_s, "] " ,\
"renewal IP : #{oldip} => #{curip}\n"
else
res_output = "[" , Time.new.to_s, "] " , "No update needed.\n"
end
print res_output
log.print res_output
}
}
}
}
-----------------------
さて、作った後に公式のページ見てみると、なんかそれっぽいスクリプトが既に置いてあった件について。
自分のIP調べるurlも変更したほうがよさげ。
久しぶりにrubyで書いたんで、かなり時間掛かった。