def to_address(name): """Convert a reverse map domain name into textual address form. @param name: an IPv4 or IPv6 address in reverse-map form. @type name: dnspython.name.Name object @rtype: str """ if name.is_subdomain(ipv4_reverse_domain): name = name.relativize(ipv4_reverse_domain) labels = list(name.labels) labels.reverse() text = '.'.join(labels) # run through inet_aton() to check syntax and make pretty. return dnspython.ipv4.inet_ntoa(dnspython.ipv4.inet_aton(text)) elif name.is_subdomain(ipv6_reverse_domain): name = name.relativize(ipv6_reverse_domain) labels = list(name.labels) labels.reverse() parts = [] i = 0 l = len(labels) while i < l: parts.append(''.join(labels[i:i+4])) i += 4 text = ':'.join(parts) # run through inet_aton() to check syntax and make pretty. return dnspython.ipv6.inet_ntoa(dnspython.ipv6.inet_aton(text)) else: raise dnspython.exception.SyntaxError, 'unknown reverse-map address family'
def _validate_name(self, name): if isinstance(name, (str, unicode)): name = dnspython.name.from_text(name, None) elif not isinstance(name, dnspython.name.Name): raise KeyError, "name parameter must be convertable to a DNS name" if name.is_absolute(): if not name.is_subdomain(self.origin): raise KeyError, "name parameter must be a subdomain of the zone origin" if self.relativize: name = name.relativize(self.origin) return name
def _rr_line(self): """Process one line from a DNS master file.""" # Name if self.current_origin is None: raise UnknownOrigin token = self.tok.get(want_leading=True) if token[0] != dnspython.tokenizer.WHITESPACE: self.last_name = dnspython.name.from_text(token[1], self.current_origin) else: token = self.tok.get() if token[0] == dnspython.tokenizer.EOL or token[0] == dnspython.tokenizer.EOF: # treat leading WS followed by EOL/EOF as if they were EOL/EOF. return self.tok.unget(token) name = self.last_name if not name.is_subdomain(self.zone.origin): self._eat_line() return if self.relativize: name = name.relativize(self.zone.origin) token = self.tok.get() if token[0] != dnspython.tokenizer.IDENTIFIER: raise dnspython.exception.SyntaxError # TTL try: ttl = dnspython.ttl.from_text(token[1]) token = self.tok.get() if token[0] != dnspython.tokenizer.IDENTIFIER: raise dnspython.exception.SyntaxError except dnspython.ttl.BadTTL: ttl = self.ttl # Class try: rdclass = dnspython.rdataclass.from_text(token[1]) token = self.tok.get() if token[0] != dnspython.tokenizer.IDENTIFIER: raise dnspython.exception.SyntaxError except dnspython.exception.SyntaxError: raise dnspython.exception.SyntaxError except: rdclass = self.zone.rdclass if rdclass != self.zone.rdclass: raise dnspython.exception.SyntaxError, "RR class is not zone's class" # Type try: rdtype = dnspython.rdatatype.from_text(token[1]) except: raise dnspython.exception.SyntaxError, "unknown rdatatype '%s'" % token[1] n = self.zone.nodes.get(name) if n is None: n = self.zone.node_factory() self.zone.nodes[name] = n try: rd = dnspython.rdata.from_text(rdclass, rdtype, self.tok, self.current_origin, False) except dnspython.exception.SyntaxError: # Catch and reraise. (ty, va) = sys.exc_info()[:2] raise ty, va except: # All exceptions that occur in the processing of rdata # are treated as syntax errors. This is not strictly # correct, but it is correct almost all of the time. # We convert them to syntax errors so that we can emit # helpful filename:line info. (ty, va) = sys.exc_info()[:2] raise dnspython.exception.SyntaxError, "caught exception %s: %s" % (str(ty), str(va)) rd.choose_relativity(self.zone.origin, self.relativize) covers = rd.covers() rds = n.find_rdataset(rdclass, rdtype, covers, True) rds.add(rd, ttl)