require 'socket'
require 'openssl'
# 実行時の引数をなしにする場合は、次の行をコメントアウト
abort "usage: #$0 userid password {'*'|''|subdomain} example.com" if ARGV.size != 4
# 実行時の引数を無効にする場合は、次の行をコメントアウトすると警告が表示されない
#UserID, Password, Subdomain, Domain = ARGV
# 引数を有効にする場合は、以下のパラメータをコメントアウト
# 引数に指定したパラメータは、以下のパラメータで上書き
UserID = "1234567"
Password = "hogefugahogera"
Subdomain = "www"
Domain = "abten.net"
# 現在登録されているIPアドレスの取得
if Subdomain == "" then
DomainName = Domain
else
DomainName = Subdomain + "." + Domain
end
RegisteredIP = IPSocket.getaddress(DomainName)
# パブリックキーが変更された場合は、次の行を編集
OnamaePubkey = 'af4447e1ca6e6525561904eb420503d9b353e29c7e9efc3479c03ca79cb71b4e'
DDNSServer = 'ddnsclient.onamae.com'
# 静的IPを使う場合は、次の行をコメントアウトすると警告が表示されない
IP = TCPSocket.open(DDNSServer, 65000) {|socket| socket.gets }[6..-2]
# 静的IPを設定する場合は、次の行で設定
# IP = "0.0.0.0"
# DNSの正引きIPと登録したいIPが同じ場合は処理を中止
exit if IP == RegisteredIP
print( "'" + DomainName + "'のIPアドレスを'" + IP + "'に更新登録の処理を実行します。\n" )
TCPSocket.open(DDNSServer, 65010) do |socket|
context = OpenSSL::SSL::SSLContext.new
context.set_params
context.verify_mode = OpenSSL::SSL::VERIFY_NONE
ssl = OpenSSL::SSL::SSLSocket.new(socket, context)
ssl.connect
raise "#{ssl.verify_result}" if ssl.verify_result != OpenSSL::X509::V_OK
ssl.post_connection_check(DDNSServer)
# パブリックキーの確認を無効化するには、次の行をコメントアウト
# 逆に、チェックを有効にする場合は、アンコメント
#raise "public key is not right" if OpenSSL::Digest::SHA256.hexdigest(ssl.peer_cert.public_key.to_der) != OnamaePubkey
begin
ssl.puts *%W[LOGIN USERID:#{UserID} PASSWORD:#{Password} .]
response = ssl.gets("\n.\n")
raise response if response.to_i != 0
ssl.puts *%W[MODIP HOSTNAME:#{Subdomain} DOMNAME:#{Domain} IPV4:#{IP} .]
response = ssl.gets("\n.\n")
raise response if response.to_i != 0
ensure
ssl.puts *%W[LOGOUT .]
end
end