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
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
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