Esempio n. 1
0
def handle_a_record(q: QuestionItem) -> AnswerItem:
    if q.qname_str == myname:
        answer = q.get_answer(listen)
    else:
        ip = doker.get_ip_info(q.qname_str)
        if ip is None:
            return RCODE.NAME_ERROR

        answer = q.get_answer(ip)
    return answer
Esempio n. 2
0
def handle_ptr_record(q: QuestionItem) -> AnswerItem:
    if in_addr_to_ip(q.qname_str) == listen:
        answer = q.get_answer(myname)
    else:
        hostname = doker.container_name_by_ip(in_addr_to_ip(q.qname_str))
        if hostname is not None:
            answer = q.get_answer(hostname)
        else:
            answer = None

    return answer
Esempio n. 3
0
  def __init__(self, _msg=None):
    """
    :type _msg byte
    :param _msg Get byte array as input and form structured data
    """
    if _msg is None:
      self.message_id = generate_message_id()
      self.header = Header()
      self.question_section = []
      self.answer_section = []
      self.authority_section = []
      self.additional_section = []
      return

    offset = 0

    #  parse data packet
    self.message_id, _msg, offset = bread(_msg, 2, offset)

    _pack1, _msg, offset = bread(_msg, 2, offset, data_fx=lambda x: int.from_bytes(x, byteorder="big"))

    # declare sections
    _size, _msg, offset = bread(_msg, 2, offset, data_fx=lambda x: int.from_bytes(x, byteorder="big"))
    self.question_section = [None] * _size
    # required to store question section offsets for answer_section "name"
    question_offset_grid = [None] * _size

    _size, _msg, offset = bread(_msg, 2, offset, data_fx=lambda x: int.from_bytes(x, byteorder="big"))
    self.answer_section = [None] * _size

    _size, _msg, offset = bread(_msg, 2, offset, data_fx=lambda x: int.from_bytes(x, byteorder="big"))
    self.authority_section = [None] * _size

    _size, _msg, offset = bread(_msg, 2, offset, data_fx=lambda x: int.from_bytes(x, byteorder="big"))
    self.additional_section = [None] * _size

    #  decode header section
    self.header = Header(_pack1)

    # decode Question section
    for i in range(0, len(self.question_section)):
      la = len(_msg)
      item, _msg = QuestionItem.parse(_msg)
      lb = len(_msg)
      question_offset_grid[i] = offset
      self.question_section[i] = item
      offset += la - lb

    # decode Answer section
    for i in range(0, len(self.answer_section)):
      la = len(_msg)
      item, _msg = AnswerItem.parse(_msg)
      lb = len(_msg)

      # here we will get answer name from the offset
      loffset = item.name
      for x in range(0, len(question_offset_grid)):
        if question_offset_grid[x] <= loffset:
          item.name = self.question_section[x].qname

      self.answer_section[i] = item
      offset += la - lb

    # decode Authority section
    for i in range(0, len(self.authority_section)):
      la = len(_msg)
      item, _msg = AnswerItem.parse(_msg)
      lb = len(_msg)

      # here we will get answer name from the offset
      loffset = item.name
      for x in range(0, len(question_offset_grid)):
        if question_offset_grid[x] <= loffset:
          item.name = self.question_section[x].qname

      self.authority_section[i] = item
      offset += la - lb