def treat_data_from_receive(self, data): try: sender = socket.socket(AF_INET, SOCK_DGRAM) sender.connect((self._next_dns_addr, self._port)) sender.settimeout(5) sender.send(data) data = sender.recv(1024) sender.close() except socket.error: answer = MessageParser.to_bytes( self._message_parser.transaction_id, MessageType.QUERY, self._message_parser.opcode, HaveStatus.NO, self._message_parser.recursion_required, self._message_parser.recursion_available, RCode.REFUSED, self._message_parser.message[12:], answers_num=0, answers=[]) self._dns_listener.sendto(answer, self._client_addr) return self._dns_listener.sendto(data, self._client_addr) answer_info = MessageParser() answer_info.from_bytes(data) for container in [ answer_info.answers, answer_info.resources_rights, answer_info.additional_resources ]: for resource in container: self._cache.add_record(resource.ttl, resource.name.decode(), resource.resource_type, resource.resource_data, resource.resource_class) self._client_addr = None
def start_listening(self): lis = keyboard.Listener(on_press=self.on_press) lis.start() try: while True: self._message_parser = MessageParser() self._cache.update_cache() data, self._client_addr = self._dns_listener.recvfrom(1024) self._message_parser.from_bytes(data) have_all_data = True answers = [] for query in self._message_parser.queries: have_info = self.try_find_info(query, answers) if query.query_type == ResourceType.PTR and\ self._message_parser.questions_num > 1: continue elif not have_info: self.treat_data_from_receive(data) have_all_data = False break if have_all_data and len(answers) > 0: answer = MessageParser.to_bytes( self._message_parser.transaction_id, MessageType.ANSWER, self._message_parser.opcode, HaveStatus.NO, self._message_parser.recursion_required, self._message_parser.recursion_available, RCode.NO_ERROR, self._message_parser.message[12:], questions_num=self._message_parser.questions_num, answers_num=len(answers), answers=answers) self._dns_listener.sendto(answer, self._client_addr) self._client_addr = None finally: sys.stderr.write('\nThe server was stopped. ' 'All useful data will be serialize\n') self._cache.serialize_cache()