2007-10-08

hosts と DNS のどちらで名前解決してるか分かるツール書いてみた

またタイトルで終わってしまった。

odz buffer - 名前解決

でヒントをもらったので Ruby で書いてみた。

#! /usr/bin/env ruby

require 'resolv'
require 'ipaddr'

def main()
  host      = ARGV.shift()
  num_addrs = 0

  if ( host )
    begin
      ipaddr = IPAddr.new( host )
      output_names( ipaddr )
    rescue
      begin
        num_addrs += output_addrs( Resolv::Hosts.new(), host )
      ensure
        num_addrs += output_addrs( Resolv::DNS.new(), host )
      end
    end
  else
    STDERR.puts "Usage: #{$0} hostname/FQDN|ipaddr"
  end

  exit num_addrs
end

def output_addrs( resolv, host )
  addrs = resolv.getaddresses( host )

  if ( addrs.size > 0 )
    puts resolv.class.to_s.sub( /Resolv::/, '' )
    addrs.each { |addr|
      puts addr
    }
  end

  return addrs.size
end

def output_names( ipaddr )
  if ( ipaddr.class == IPAddr and
         names = Resolv.getnames( ipaddr.to_s ) and
         names.size > 0 )
    names.each { |name|
      puts name
    }
  end

  return names.size
end

if ( $0 == __FILE__ )
  main()
end

試しに getaddresses.rb という名前にしてみる。

$ ./getaddresses.rb aligach.net
Hosts
127.0.0.1
DNS
202.181.99.90
$ ./getaddresses.rb www.google.com
DNS
66.249.89.99
66.249.89.104
66.249.89.147

意外に便利。

取得したアドレスの数を返すので DNS にも hosts にも一切情報がない場合は 0 になり、失敗した旨を伝えることになります。

[2007-10-09 追記] 逆引きもできるようにしてみた。名前は pseudohost.rb とかそんなんで。

逆引きもできるので、通常の使い方では alias で host にしちゃうことも可能になった。これでより使いやすくなった。

※ ただし面倒なので逆引きの方は hosts だ DNS だなんつーことは言いません。

About

例によって個人のなんちゃらです