class Blondy::DHCPD::Pool

Public Class Methods

query(hwaddr, type) click to toggle source
# File lib/blondy/dhcpd/pool.rb, line 11
def query(hwaddr, type)
  reply = Cache.query(hwaddr,type)
  if reply
    reply[:data]
  else
    http = EM::HttpRequest.new(Blondy::DHCPD::CONFIG['master']).
      get(head: {'x-blondy-key' => Blondy::DHCPD::CONFIG['client_key']}, query: {'type' => type.to_s, 'hwaddr' => hwaddr})
    http.callback do
      if http.response_header.status != 200
        Logger.error "Remote server reply with #{http.response_header.status} error code."
      else
        data = transform(http.response, type)
        Cache.add(hwaddr,type, data) if data
      end
      data
    end
    http.errback do
      Logger.error 'Remote pool server is unavailable.'
    end
    false
  end
end

Private Class Methods

transform(json, type) click to toggle source
# File lib/blondy/dhcpd/pool.rb, line 36
def transform(json, type)
  begin
    data = JSON.parse(json)
    if type == :discover
      reply_type = $DHCP_MSG_OFFER
    elsif type == :request
      reply_type = $DHCP_MSG_ACK
    else
      raise UnsupportedReqType
    end
    Reply.new(data, reply_type).get
  rescue UnsupportedReqType
    # Unsupported request type
    Logger.error 'Unsupported type received.'
    false
  rescue JSON::ParserError
    # Wrong json
    Logger.error 'Remote server send invalid json.'
    false
  rescue NoMethodError
    Logger.error 'Remote server send invalid text data in json.'
    # Wrong data in json
    false
  rescue IPAddr::AddressFamilyError
    # Wrong data in json (address family must be specified)
    Logger.error 'Remote server send invalid ip or nemask in json.'
    false
  rescue IPAddr::InvalidAddressError
    # Wrong data in json (invalid address)
    Logger.error 'Remote server send invalid ip or nemask in json.'
    false
  rescue
    # Unknown error
    Logger.error 'Unknown error.'
    false
  end
end