require "meshname" require "resolv" require "async/dns" def parse_address str case str when /\A\[(?
.* )\]:(? \d+ )\z/x address, port = $~[:address], $~[:port] when /\A(?
[^:]+ ):(? \d+ )\z/x address, port = $~[:address], $~[:port] else address, port = str, nil end return [address, port] # source: https://rosettacode.org/wiki/Parse_an_IP_Address end addr = ARGV[0] ? ARGV[0] : "[::1]:53535" parsed_addr = parse_address addr class MeshnameDnsServer < Async::DNS::Server def process name, resource_class, tx if name =~ /[abcdefghijklmnopqrstuvwxyz234567]{26}.(meshname|meship)/ && resource_class == Resolv::DNS::Resource::IN::AAAA Meshname.resolv(name).map! { |ip| tx.respond! ip.to_s } end end end srv = MeshnameDnsServer.new [[:udp, parsed_addr[0], parsed_addr[1].to_i]] srv.run