]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
add constants
authorBob Halley <halley@dnspython.org>
Mon, 3 Aug 2020 13:35:22 +0000 (06:35 -0700)
committerBob Halley <halley@dnspython.org>
Mon, 3 Aug 2020 13:35:22 +0000 (06:35 -0700)
dns/dnssec.py
dns/edns.py
dns/flags.py
dns/message.py
dns/opcode.py
dns/rcode.py
dns/rdataclass.py
dns/rdatatype.py
dns/rdtypes/dnskeybase.py
dns/update.py
util/constants-tool [new file with mode: 0755]

index 891999661dee2d1f75694348772f6dd8ba53bf71..79752aae1552f34546d7f6c8a4e645a5a8c064e2 100644 (file)
@@ -584,3 +584,25 @@ else:
     validate = _validate                # type: ignore
     validate_rrsig = _validate_rrsig    # type: ignore
     _have_pyca = True
+
+### BEGIN generated algorithm constants
+
+RSAMD5 = Algorithm.RSAMD5
+DH = Algorithm.DH
+DSA = Algorithm.DSA
+ECC = Algorithm.ECC
+RSASHA1 = Algorithm.RSASHA1
+DSANSEC3SHA1 = Algorithm.DSANSEC3SHA1
+RSASHA1NSEC3SHA1 = Algorithm.RSASHA1NSEC3SHA1
+RSASHA256 = Algorithm.RSASHA256
+RSASHA512 = Algorithm.RSASHA512
+ECCGOST = Algorithm.ECCGOST
+ECDSAP256SHA256 = Algorithm.ECDSAP256SHA256
+ECDSAP384SHA384 = Algorithm.ECDSAP384SHA384
+ED25519 = Algorithm.ED25519
+ED448 = Algorithm.ED448
+INDIRECT = Algorithm.INDIRECT
+PRIVATEDNS = Algorithm.PRIVATEDNS
+PRIVATEOID = Algorithm.PRIVATEOID
+
+### END generated algorithm constants
index 087592b560d4081f5ae7811c435296fbe218f6e8..75ecdf182a5b0d9eb680d88fbff04d28f9d084d9 100644 (file)
@@ -352,3 +352,18 @@ def register_type(implementation, otype):
     """
 
     _type_to_class[otype] = implementation
+
+### BEGIN generated optiontype constants
+
+NSID = OptionType.NSID
+DAU = OptionType.DAU
+DHU = OptionType.DHU
+N3U = OptionType.N3U
+ECS = OptionType.ECS
+EXPIRE = OptionType.EXPIRE
+COOKIE = OptionType.COOKIE
+KEEPALIVE = OptionType.KEEPALIVE
+PADDING = OptionType.PADDING
+CHAIN = OptionType.CHAIN
+
+### END generated optiontype constants
index 4eb6d90cc3f757734fc876390130a750bd0d0c2a..a53197c79978503d4fbdca3df005e8b637fa28ee 100644 (file)
@@ -104,3 +104,21 @@ def edns_to_text(flags):
     """
 
     return _to_text(flags, EDNSFlag)
+
+### BEGIN generated flag constants
+
+QR = Flag.QR
+AA = Flag.AA
+TC = Flag.TC
+RD = Flag.RD
+RA = Flag.RA
+AD = Flag.AD
+CD = Flag.CD
+
+### END generated flag constants
+
+### BEGIN generated ednsflag constants
+
+DO = EDNSFlag.DO
+
+### END generated ednsflag constants
index 1dfb0280fa7c2cf9bd92a318452e82a97ecd1a51..1a5787f75950e229b533dddf04a7845267518ff2 100644 (file)
@@ -1465,3 +1465,12 @@ def make_response(query, recursion_available=False, our_payload=8192,
                           tsig_error, b'', query.keyalgorithm)
         response.request_mac = query.mac
     return response
+
+### BEGIN generated messagesection constants
+
+QUESTION = MessageSection.QUESTION
+ANSWER = MessageSection.ANSWER
+AUTHORITY = MessageSection.AUTHORITY
+ADDITIONAL = MessageSection.ADDITIONAL
+
+### END generated messagesection constants
index 5a76326a7071514b50d5ef610e3f8f894e7b48ec..32f209fa2392643335c6124c966372a355951776 100644 (file)
@@ -105,3 +105,13 @@ def is_update(flags):
     """
 
     return from_flags(flags) == Opcode.UPDATE
+
+### BEGIN generated opcode constants
+
+QUERY = Opcode.QUERY
+IQUERY = Opcode.IQUERY
+STATUS = Opcode.STATUS
+NOTIFY = Opcode.NOTIFY
+UPDATE = Opcode.UPDATE
+
+### END generated opcode constants
index 846bf6dcd7d4c921fc63ca0c08bddfd17ed0e202..6e33045b07ba99872a45b7f3e995d158aac67b7e 100644 (file)
@@ -137,3 +137,29 @@ def to_text(value, tsig=False):
     if tsig and value == Rcode.BADVERS:
         return 'BADSIG'
     return Rcode.to_text(value)
+
+### BEGIN generated rcode constants
+
+NOERROR = Rcode.NOERROR
+FORMERR = Rcode.FORMERR
+SERVFAIL = Rcode.SERVFAIL
+NXDOMAIN = Rcode.NXDOMAIN
+NOTIMP = Rcode.NOTIMP
+REFUSED = Rcode.REFUSED
+YXDOMAIN = Rcode.YXDOMAIN
+YXRRSET = Rcode.YXRRSET
+NXRRSET = Rcode.NXRRSET
+NOTAUTH = Rcode.NOTAUTH
+NOTZONE = Rcode.NOTZONE
+DSOTYPENI = Rcode.DSOTYPENI
+BADVERS = Rcode.BADVERS
+BADSIG = Rcode.BADSIG
+BADKEY = Rcode.BADKEY
+BADTIME = Rcode.BADTIME
+BADMODE = Rcode.BADMODE
+BADNAME = Rcode.BADNAME
+BADALG = Rcode.BADALG
+BADTRUNC = Rcode.BADTRUNC
+BADCOOKIE = Rcode.BADCOOKIE
+
+### END generated rcode constants
index 7943a95a823275ae303fce38cbc724040630f5a7..af0bd99766440af00ef2adeae2206225046f9cc0 100644 (file)
@@ -100,3 +100,17 @@ def is_metaclass(rdclass):
     if rdclass in _metaclasses:
         return True
     return False
+
+### BEGIN generated rdataclass constants
+
+RESERVED0 = RdataClass.RESERVED0
+IN = RdataClass.IN
+INTERNET = RdataClass.INTERNET
+CH = RdataClass.CH
+CHAOS = RdataClass.CHAOS
+HS = RdataClass.HS
+HESIOD = RdataClass.HESIOD
+NONE = RdataClass.NONE
+ANY = RdataClass.ANY
+
+### END generated rdataclass constants
index c793d5a0d85f11888459dc9371f5ac56fa6dee21..1abc59c9ad53aa671afcf3c42276ae4b7d5765fb 100644 (file)
@@ -219,3 +219,81 @@ def register_type(rdtype, rdtype_text, is_singleton=False):
     _registered_by_value[rdtype] = rdtype_text
     if is_singleton:
         _singletons.add(rdtype)
+
+### BEGIN generated rdatatype constants
+
+TYPE0 = RdataType.TYPE0
+NONE = RdataType.NONE
+A = RdataType.A
+NS = RdataType.NS
+MD = RdataType.MD
+MF = RdataType.MF
+CNAME = RdataType.CNAME
+SOA = RdataType.SOA
+MB = RdataType.MB
+MG = RdataType.MG
+MR = RdataType.MR
+NULL = RdataType.NULL
+WKS = RdataType.WKS
+PTR = RdataType.PTR
+HINFO = RdataType.HINFO
+MINFO = RdataType.MINFO
+MX = RdataType.MX
+TXT = RdataType.TXT
+RP = RdataType.RP
+AFSDB = RdataType.AFSDB
+X25 = RdataType.X25
+ISDN = RdataType.ISDN
+RT = RdataType.RT
+NSAP = RdataType.NSAP
+NSAP_PTR = RdataType.NSAP_PTR
+SIG = RdataType.SIG
+KEY = RdataType.KEY
+PX = RdataType.PX
+GPOS = RdataType.GPOS
+AAAA = RdataType.AAAA
+LOC = RdataType.LOC
+NXT = RdataType.NXT
+SRV = RdataType.SRV
+NAPTR = RdataType.NAPTR
+KX = RdataType.KX
+CERT = RdataType.CERT
+A6 = RdataType.A6
+DNAME = RdataType.DNAME
+OPT = RdataType.OPT
+APL = RdataType.APL
+DS = RdataType.DS
+SSHFP = RdataType.SSHFP
+IPSECKEY = RdataType.IPSECKEY
+RRSIG = RdataType.RRSIG
+NSEC = RdataType.NSEC
+DNSKEY = RdataType.DNSKEY
+DHCID = RdataType.DHCID
+NSEC3 = RdataType.NSEC3
+NSEC3PARAM = RdataType.NSEC3PARAM
+TLSA = RdataType.TLSA
+HIP = RdataType.HIP
+NINFO = RdataType.NINFO
+CDS = RdataType.CDS
+CDNSKEY = RdataType.CDNSKEY
+OPENPGPKEY = RdataType.OPENPGPKEY
+CSYNC = RdataType.CSYNC
+SPF = RdataType.SPF
+UNSPEC = RdataType.UNSPEC
+EUI48 = RdataType.EUI48
+EUI64 = RdataType.EUI64
+TKEY = RdataType.TKEY
+TSIG = RdataType.TSIG
+IXFR = RdataType.IXFR
+AXFR = RdataType.AXFR
+MAILB = RdataType.MAILB
+MAILA = RdataType.MAILA
+ANY = RdataType.ANY
+URI = RdataType.URI
+CAA = RdataType.CAA
+AVC = RdataType.AVC
+AMTRELAY = RdataType.AMTRELAY
+TA = RdataType.TA
+DLV = RdataType.DLV
+
+### END generated rdatatype constants
index 0243d6f33709330af7c2046f5ded8585b944ec85..1fac4bdc41ec1a1c0a3b56f7e64472c49bd778c2 100644 (file)
@@ -72,3 +72,11 @@ class DNSKEYBase(dns.rdata.Rdata):
         key = parser.get_remaining()
         return cls(rdclass, rdtype, header[0], header[1], header[2],
                    key)
+
+### BEGIN generated flag constants
+
+SEP = Flag.SEP
+REVOKE = Flag.REVOKE
+ZONE = Flag.ZONE
+
+### END generated flag constants
index 8e796504f36a2f32279089c43dd7244351c1c1b5..b4cb755a6d2ed1e4cc4df71976190c55dd308feb 100644 (file)
@@ -310,3 +310,12 @@ class UpdateMessage(dns.message.Message):
 
 # backwards compatibility
 Update = UpdateMessage
+
+### BEGIN generated updatesection constants
+
+ZONE = UpdateSection.ZONE
+PREREQ = UpdateSection.PREREQ
+UPDATE = UpdateSection.UPDATE
+ADDITIONAL = UpdateSection.ADDITIONAL
+
+### END generated updatesection constants
diff --git a/util/constants-tool b/util/constants-tool
new file mode 100755 (executable)
index 0000000..baf54b6
--- /dev/null
@@ -0,0 +1,112 @@
+#!/usr/bin/env python3
+
+# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
+
+from importlib import import_module
+import os
+import sys
+
+enum_names = [
+    'dns.dnssec.Algorithm',
+    'dns.edns.OptionType',
+    'dns.flags.Flag',
+    'dns.flags.EDNSFlag',
+    'dns.message.MessageSection',
+    'dns.opcode.Opcode',
+    'dns.rcode.Rcode',
+    'dns.rdataclass.RdataClass',
+    'dns.rdatatype.RdataType',
+    'dns.rdtypes.dnskeybase.Flag',
+    'dns.update.UpdateSection',
+]
+
+def generate():
+    for enum_name in enum_names:
+        dot = enum_name.rindex('.')
+        module_name = enum_name[:dot]
+        type_name = enum_name[dot + 1:]
+        mod = import_module(module_name)
+        enum = getattr(mod, type_name)
+        filename = module_name.replace('.', '/') + '.py'
+        new_filename = filename + '.new'
+        with open(filename) as f:
+            with open(new_filename, 'w') as nf:
+                lines = f.readlines()
+                found = False
+                i = 0
+                length = len(lines)
+                while i < length:
+                    l = lines[i].rstrip()
+                    i += 1
+                    if l.startswith(f'### BEGIN generated {type_name} ' +
+                                    'constants'):
+                        found = True
+                        break
+                    else:
+                        print(l, file=nf)
+                if found:
+                    found = False
+                    while i < length:
+                        l = lines[i].rstrip()
+                        i += 1
+                        if l.startswith(f'### END generated {type_name} ' +
+                                        'constants'):
+                            found = True
+                            break
+                    if not found:
+                        print(f'Found begin marker for {type_name} but did ' +
+                              'not find end marker!', file=sys.stderr)
+                        sys.exit(1)
+                if not found:
+                    print('', file=nf)
+                print(f'### BEGIN generated {type_name} constants', file=nf)
+                print('', file=nf)
+                # We have to use __members__.items() and not "in enum" because
+                # otherwise we miss values that have multiple names (e.g. NONE
+                # and TYPE0 for rdatatypes).
+                for name, value in enum.__members__.items():
+                    print(f'{name} = {type_name}.{name}', file=nf)
+                print('', file=nf)
+                print(f'### END generated {type_name} constants', file=nf)
+                # Copy remaining lines (if any)
+                while i < length:
+                    l = lines[i].rstrip()
+                    i += 1
+                    print(l, file=nf)
+        os.rename(new_filename, filename)
+
+def check():
+    ok = True
+    for enum_name in enum_names:
+        dot = enum_name.rindex('.')
+        module_name = enum_name[:dot]
+        type_name = enum_name[dot + 1:]
+        mod = import_module(module_name)
+        enum = getattr(mod, type_name)
+        for name, value in enum.__members__.items():
+            try:
+                if value != getattr(mod, name):
+                    ok = False
+                    print(f'{name} != {value}', file=sys.stderr)
+            except Exception:
+                ok = False
+                print('exception checking', name, file=sys.stderr)
+    return ok
+
+def usage():
+    print('usage: constants-tool [generate|check]', file=sys.stderr)
+    sys.exit(1)
+
+def main():
+    if len(sys.argv) < 2:
+        usage()
+    if sys.argv[1] == 'generate':
+        generate()
+    elif sys.argv[1] == 'check':
+        if not check():
+            sys.exit(2)
+    else:
+        usage()
+
+if __name__ == '__main__':
+    main()