Skip to content

Instantly share code, notes, and snippets.

@marek22k
Last active January 5, 2022 00:41
Show Gist options
  • Save marek22k/795b7e1b9e2dcd5df46ee601f566058e to your computer and use it in GitHub Desktop.
Save marek22k/795b7e1b9e2dcd5df46ee601f566058e to your computer and use it in GitHub Desktop.
Meshname DNS Server
require "meshname"
require "resolv"
require "async/dns"
def parse_address str
case str
when /\A\[(?<address> .* )\]:(?<port> \d+ )\z/x
address, port = $~[:address], $~[:port]
when /\A(?<address> [^:]+ ):(?<port> \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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment