mirror of
https://github.com/Hopiu/linkchecker.git
synced 2026-04-11 18:10:58 +00:00
git-svn-id: https://linkchecker.svn.sourceforge.net/svnroot/linkchecker/trunk/linkchecker@3682 e7d03fd6-7b0d-0410-9947-9c21f3af8025
212 lines
4.7 KiB
Python
212 lines
4.7 KiB
Python
# -*- coding: iso-8859-1 -*-
|
|
# Copyright (C) 2001-2004 Nominum, Inc.
|
|
#
|
|
# Permission to use, copy, modify, and distribute this software and its
|
|
# documentation for any purpose with or without fee is hereby granted,
|
|
# provided that the above copyright notice and this permission notice
|
|
# appear in all copies.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
|
|
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
|
|
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
|
# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
"""DNS Rdata Types.
|
|
|
|
@var _by_text: The rdata type textual name to value mapping
|
|
@type _by_text: dict
|
|
@var _by_value: The rdata type value to textual name mapping
|
|
@type _by_value: dict
|
|
@var _metatypes: If an rdatatype is a metatype, there will be a mapping
|
|
whose key is the rdatatype value and whose value is True in this dictionary.
|
|
@type _metatypes: dict
|
|
@var _singletons: If an rdatatype is a singleton, there will be a mapping
|
|
whose key is the rdatatype value and whose value is True in this dictionary.
|
|
@type _singletons: dict"""
|
|
|
|
import re
|
|
|
|
import linkcheck.dns.exception
|
|
|
|
NONE = 0
|
|
A = 1
|
|
NS = 2
|
|
MD = 3
|
|
MF = 4
|
|
CNAME = 5
|
|
SOA = 6
|
|
MB = 7
|
|
MG = 8
|
|
MR = 9
|
|
NULL = 10
|
|
WKS = 11
|
|
PTR = 12
|
|
HINFO = 13
|
|
MINFO = 14
|
|
MX = 15
|
|
TXT = 16
|
|
RP = 17
|
|
AFSDB = 18
|
|
X25 = 19
|
|
ISDN = 20
|
|
RT = 21
|
|
NSAP = 22
|
|
NSAP_PTR = 23
|
|
SIG = 24
|
|
KEY = 25
|
|
PX = 26
|
|
GPOS = 27
|
|
AAAA = 28
|
|
LOC = 29
|
|
NXT = 30
|
|
SRV = 33
|
|
NAPTR = 35
|
|
KX = 36
|
|
CERT = 37
|
|
A6 = 38
|
|
DNAME = 39
|
|
OPT = 41
|
|
APL = 42
|
|
DS = 43
|
|
SSHFP = 44
|
|
RRSIG = 46
|
|
NSEC = 47
|
|
DNSKEY = 48
|
|
UNSPEC = 103
|
|
TKEY = 249
|
|
TSIG = 250
|
|
IXFR = 251
|
|
AXFR = 252
|
|
MAILB = 253
|
|
MAILA = 254
|
|
ANY = 255
|
|
|
|
_by_text = {
|
|
'NONE' : NONE,
|
|
'A' : A,
|
|
'NS' : NS,
|
|
'MD' : MD,
|
|
'MF' : MF,
|
|
'CNAME' : CNAME,
|
|
'SOA' : SOA,
|
|
'MB' : MB,
|
|
'MG' : MG,
|
|
'MR' : MR,
|
|
'NULL' : NULL,
|
|
'WKS' : WKS,
|
|
'PTR' : PTR,
|
|
'HINFO' : HINFO,
|
|
'MINFO' : MINFO,
|
|
'MX' : MX,
|
|
'TXT' : TXT,
|
|
'RP' : RP,
|
|
'AFSDB' : AFSDB,
|
|
'X25' : X25,
|
|
'ISDN' : ISDN,
|
|
'RT' : RT,
|
|
'NSAP' : NSAP,
|
|
'NSAP-PTR' : NSAP_PTR,
|
|
'SIG' : SIG,
|
|
'KEY' : KEY,
|
|
'PX' : PX,
|
|
'GPOS' : GPOS,
|
|
'AAAA' : AAAA,
|
|
'LOC' : LOC,
|
|
'NXT' : NXT,
|
|
'SRV' : SRV,
|
|
'NAPTR' : NAPTR,
|
|
'KX' : KX,
|
|
'CERT' : CERT,
|
|
'A6' : A6,
|
|
'DNAME' : DNAME,
|
|
'OPT' : OPT,
|
|
'APL' : APL,
|
|
'DS' : DS,
|
|
'SSHFP' : SSHFP,
|
|
'RRSIG' : RRSIG,
|
|
'NSEC' : NSEC,
|
|
'DNSKEY' : DNSKEY,
|
|
'UNSPEC' : UNSPEC,
|
|
'TKEY' : TKEY,
|
|
'TSIG' : TSIG,
|
|
'IXFR' : IXFR,
|
|
'AXFR' : AXFR,
|
|
'MAILB' : MAILB,
|
|
'MAILA' : MAILA,
|
|
'ANY' : ANY
|
|
}
|
|
|
|
# We construct the inverse mapping programmatically to ensure that we
|
|
# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that
|
|
# would cause the mapping not to be true inverse.
|
|
|
|
_by_value = dict([(y, x) for x, y in _by_text.iteritems()])
|
|
|
|
|
|
_metatypes = {
|
|
OPT : True
|
|
}
|
|
|
|
_singletons = {
|
|
SOA : True,
|
|
NXT : True,
|
|
DNAME : True,
|
|
# CNAME is technically a singleton, but we allow multiple CNAMEs.
|
|
}
|
|
|
|
_unknown_type_pattern = re.compile('TYPE([0-9]+)$', re.I);
|
|
|
|
class UnknownRdatatype(linkcheck.dns.exception.DNSException):
|
|
"""Raised if a type is unknown."""
|
|
pass
|
|
|
|
def from_text(text):
|
|
"""Convert text into a DNS rdata type value.
|
|
@param text: the text
|
|
@type text: string
|
|
@raises linkcheck.dns.rdatatype.UnknownRdatatype: the type is unknown
|
|
@raises ValueError: the rdata type value is not >= 0 and <= 65535
|
|
@rtype: int"""
|
|
|
|
value = _by_text.get(text.upper())
|
|
if value is None:
|
|
match = _unknown_type_pattern.match(text)
|
|
if match is None:
|
|
raise UnknownRdatatype
|
|
value = int(match.group(1))
|
|
if value < 0 or value > 65535:
|
|
raise ValueError, "type must be between >= 0 and <= 65535"
|
|
return value
|
|
|
|
def to_text(value):
|
|
"""Convert a DNS rdata type to text.
|
|
@param value: the rdata type value
|
|
@type value: int
|
|
@raises ValueError: the rdata type value is not >= 0 and <= 65535
|
|
@rtype: string"""
|
|
|
|
if value < 0 or value > 65535:
|
|
raise ValueError, "type must be between >= 0 and <= 65535"
|
|
text = _by_value.get(value)
|
|
if text is None:
|
|
text = 'TYPE' + repr(value)
|
|
return text
|
|
|
|
def is_metatype(rdtype):
|
|
"""True if the type is a metatype.
|
|
@param rdtype: the type
|
|
@type rdtype: int
|
|
@rtype: bool"""
|
|
|
|
return rdtype >= TKEY and rdtype <= ANY or rdtype in _metatypes
|
|
|
|
def is_singleton(rdtype):
|
|
"""True if the type is a singleton.
|
|
@param rdtype: the type
|
|
@type rdtype: int
|
|
@rtype: bool"""
|
|
|
|
return rdtype in _singletons
|