1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 """DNS Rdata Types.
17
18 @var _by_text: The rdata type textual name to value mapping
19 @type _by_text: dict
20 @var _by_value: The rdata type value to textual name mapping
21 @type _by_value: dict
22 @var _metatypes: If an rdatatype is a metatype, there will be a mapping
23 whose key is the rdatatype value and whose value is True in this dictionary.
24 @type _metatypes: dict
25 @var _singletons: If an rdatatype is a singleton, there will be a mapping
26 whose key is the rdatatype value and whose value is True in this dictionary.
27 @type _singletons: dict"""
28
29 import re
30
31 import dns.exception
32
33 NONE = 0
34 A = 1
35 NS = 2
36 MD = 3
37 MF = 4
38 CNAME = 5
39 SOA = 6
40 MB = 7
41 MG = 8
42 MR = 9
43 NULL = 10
44 WKS = 11
45 PTR = 12
46 HINFO = 13
47 MINFO = 14
48 MX = 15
49 TXT = 16
50 RP = 17
51 AFSDB = 18
52 X25 = 19
53 ISDN = 20
54 RT = 21
55 NSAP = 22
56 NSAP_PTR = 23
57 SIG = 24
58 KEY = 25
59 PX = 26
60 GPOS = 27
61 AAAA = 28
62 LOC = 29
63 NXT = 30
64 SRV = 33
65 NAPTR = 35
66 KX = 36
67 CERT = 37
68 A6 = 38
69 DNAME = 39
70 OPT = 41
71 APL = 42
72 DS = 43
73 SSHFP = 44
74 IPSECKEY = 45
75 RRSIG = 46
76 NSEC = 47
77 DNSKEY = 48
78 DHCID = 49
79 NSEC3 = 50
80 NSEC3PARAM = 51
81 TLSA = 52
82 HIP = 55
83 CDS = 59
84 CDNSKEY = 60
85 SPF = 99
86 UNSPEC = 103
87 EUI48 = 108
88 EUI64 = 109
89 TKEY = 249
90 TSIG = 250
91 IXFR = 251
92 AXFR = 252
93 MAILB = 253
94 MAILA = 254
95 ANY = 255
96 URI = 256
97 CAA = 257
98 TA = 32768
99 DLV = 32769
100
101 _by_text = {
102 'NONE': NONE,
103 'A': A,
104 'NS': NS,
105 'MD': MD,
106 'MF': MF,
107 'CNAME': CNAME,
108 'SOA': SOA,
109 'MB': MB,
110 'MG': MG,
111 'MR': MR,
112 'NULL': NULL,
113 'WKS': WKS,
114 'PTR': PTR,
115 'HINFO': HINFO,
116 'MINFO': MINFO,
117 'MX': MX,
118 'TXT': TXT,
119 'RP': RP,
120 'AFSDB': AFSDB,
121 'X25': X25,
122 'ISDN': ISDN,
123 'RT': RT,
124 'NSAP': NSAP,
125 'NSAP-PTR': NSAP_PTR,
126 'SIG': SIG,
127 'KEY': KEY,
128 'PX': PX,
129 'GPOS': GPOS,
130 'AAAA': AAAA,
131 'LOC': LOC,
132 'NXT': NXT,
133 'SRV': SRV,
134 'NAPTR': NAPTR,
135 'KX': KX,
136 'CERT': CERT,
137 'A6': A6,
138 'DNAME': DNAME,
139 'OPT': OPT,
140 'APL': APL,
141 'DS': DS,
142 'SSHFP': SSHFP,
143 'IPSECKEY': IPSECKEY,
144 'RRSIG': RRSIG,
145 'NSEC': NSEC,
146 'DNSKEY': DNSKEY,
147 'DHCID': DHCID,
148 'NSEC3': NSEC3,
149 'NSEC3PARAM': NSEC3PARAM,
150 'TLSA': TLSA,
151 'HIP': HIP,
152 'CDS': CDS,
153 'CDNSKEY': CDNSKEY,
154 'SPF': SPF,
155 'UNSPEC': UNSPEC,
156 'EUI48': EUI48,
157 'EUI64': EUI64,
158 'TKEY': TKEY,
159 'TSIG': TSIG,
160 'IXFR': IXFR,
161 'AXFR': AXFR,
162 'MAILB': MAILB,
163 'MAILA': MAILA,
164 'ANY': ANY,
165 'URI': URI,
166 'CAA': CAA,
167 'TA': TA,
168 'DLV': DLV,
169 }
170
171
172
173
174
175 _by_value = dict((y, x) for x, y in _by_text.items())
176
177
178 _metatypes = {
179 OPT: True
180 }
181
182 _singletons = {
183 SOA: True,
184 NXT: True,
185 DNAME: True,
186 NSEC: True,
187
188 }
189
190 _unknown_type_pattern = re.compile('TYPE([0-9]+)$', re.I)
191
192
194
195 """DNS resource record type is unknown."""
196
197
198 -def from_text(text):
199 """Convert text into a DNS rdata type value.
200 @param text: the text
201 @type text: string
202 @raises dns.rdatatype.UnknownRdatatype: the type is unknown
203 @raises ValueError: the rdata type value is not >= 0 and <= 65535
204 @rtype: int"""
205
206 value = _by_text.get(text.upper())
207 if value is None:
208 match = _unknown_type_pattern.match(text)
209 if match is None:
210 raise UnknownRdatatype
211 value = int(match.group(1))
212 if value < 0 or value > 65535:
213 raise ValueError("type must be between >= 0 and <= 65535")
214 return value
215
216
218 """Convert a DNS rdata type to text.
219 @param value: the rdata type value
220 @type value: int
221 @raises ValueError: the rdata type value is not >= 0 and <= 65535
222 @rtype: string"""
223
224 if value < 0 or value > 65535:
225 raise ValueError("type must be between >= 0 and <= 65535")
226 text = _by_value.get(value)
227 if text is None:
228 text = 'TYPE' + repr(value)
229 return text
230
231
241
242
244 """True if the type is a singleton.
245 @param rdtype: the type
246 @type rdtype: int
247 @rtype: bool"""
248
249 if rdtype in _singletons:
250 return True
251 return False
252