Class: Masquito::Daemon

Inherits:
Object
  • Object
show all
Defined in:
lib/masquito/daemon.rb

Constant Summary collapse

ADDRESS =
'127.0.0.1'
PORT =
53532
@@resource =
{
  'A' => Resolv::DNS::Resource::IN::A.new(ADDRESS),
  'AAAA' => Resolv::DNS::Resource::IN::AAAA.new('::1')
}
@@ttl =

3 hours

10800

Instance Method Summary collapse

Constructor Details

#initialize(config_path = CONFIG_PATH, addr = ADDRESS, port = PORT) ⇒ Daemon

Returns a new instance of Daemon.



15
16
17
18
19
20
# File 'lib/masquito/daemon.rb', line 15

def initialize(config_path = CONFIG_PATH, addr = ADDRESS, port = PORT)
  @addr, @port = addr, port
  @settings = Settings.new(config_path)
  @resolver = Resolver.new(config_path)
  at_exit { stop }
end

Instance Method Details

#startObject



22
23
24
25
# File 'lib/masquito/daemon.rb', line 22

def start
  start_resolver
  start_dns_server
end

#start_dns_serverObject



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/masquito/daemon.rb', line 31

def start_dns_server
  puts "Starting Masquito on #{@addr}:#{@port}"

  # Bind port to receive requests
  @socket = UDPSocket.new
  @socket.bind(@addr, @port)

  loop do
    # Receive and parse query
    data, sender_addrinfo = @socket.recvfrom(512)

    Thread.new(data, sender_addrinfo) do |data, sender_addrinfo|
      sender_port, sender_ip = sender_addrinfo[1], sender_addrinfo[2]
      query = Resolv::DNS::Message.decode(data)
      answer = setup_answer(query)
      @socket.send(answer.encode, 0, sender_ip, sender_port) # Send the response
    end
  end
end

#start_resolverObject



27
28
29
# File 'lib/masquito/daemon.rb', line 27

def start_resolver
  @resolver_thread = Thread.new { @resolver.start }
end

#stopObject



51
52
53
54
# File 'lib/masquito/daemon.rb', line 51

def stop
  @resolver_thread && (@resolver_thread.join(0.5) || @resolver_thread.kill)
  @resolver.remove_configs
end