RubyのresolvによるIPv6のDNS逆引き時のエラー
RubyのResolvでIPアドレス(IPv4とv6が混在した某アクセスログ)の分析を行おうとした際に「can't modify frozen String (RuntimeError)」のエラーが表示されたので、メモを残しておく。症状としては、IPv4は問題なく逆引きできる、IPv6の逆引きはできない。
サンプルコードと実行結果
$ host google.com google.com has address 216.58.197.238 google.com has IPv6 address 2404:6800:4004:800::200e
require 'resolv' ipv6_test_string = "2404:6800:4004:800::200e" puts ipv6_test_string puts Resolv.getname(ipv6_test_string)
$ ruby hostname_fetcher_from_ipv6.rb 2404:6800:4004:800::200e /usr/local/Cellar/ruby/2.3.0/lib/ruby/2.3.0/resolv.rb:2462:in `block in create': can't modify frozen String (RuntimeError) from /usr/local/Cellar/ruby/2.3.0/lib/ruby/2.3.0/resolv.rb:2462:in `scan' from /usr/local/Cellar/ruby/2.3.0/lib/ruby/2.3.0/resolv.rb:2462:in `create'
原因と対策?
当初、文字列が連結されている?と思い、.frozen?で状態を確認したり、.dupして複製したものを放り込んでみたりしたが変わらず。アップデート系のコマンドをググって試してみるも変化なし。
どうしようと思いながら調べていると、以下の情報を発見した。
Resolv::IPv6.create: avoid modifying frozen string literal · ruby/ruby@a3b53cd · GitHub
Bugっぽい?ということで、resolv.rbに変更を反映して再実行したところ、直った。そのうち本体に反映されるのかな?
$ ruby hostname_fetcher_from_ipv6.rb 2404:6800:4004:800::200e nrt12s01-in-x0e.1e100.net
完全にビギナーなので事あるごとに躓いている気がするが、これで分析の続きができる。