]> git.siccegge.de Git - tools.git/blobdiff - dnssec-check
[backup-zfs] regularly flush remotefile
[tools.git] / dnssec-check
old mode 100644 (file)
new mode 100755 (executable)
index 5753be1..ad3d08c
@@ -1,7 +1,8 @@
 #!/usr/bin/python
 
+from __future__ import print_function
 import ldns
-import unbound
+from unbound import ub_ctx, idn2dname, RR_TYPE_SOA, RR_TYPE_DNSKEY, RR_TYPE_RRSIG, ub_strerror
 from optparse import OptionParser
 import sys
 from datetime import datetime, timedelta
@@ -18,19 +19,29 @@ def parse_rrsig_expire(expirestring):
     return delta
 
 def check_dnssec_expire(resolver, name, warn, crit):
-    s, result = resolver.resolve(name)
-    if 0 != s:
-        pass
-
-    s, packet = ldns.ldns_wire2pkt(result.packet)
-    rrsigs = packet.rr_list_by_type(unbound.RR_TYPE_RRSIG, ldns.LDNS_SECTION_ANSWER).rrs()
-    for rrsig in rrsigs:
-        delta = parse_rrsig_expire(str(rrsig.rrsig_expiration()))
-
-        if delta < crit:
-            print "CRIT (%s) %s" % (delta, name)
-        elif delta < warn:
-            print "WARN (%s) %s" % (delta, name)
+    for rrtype in [RR_TYPE_SOA, RR_TYPE_DNSKEY]:
+        s, result = resolver.resolve(name, rrtype=rrtype)
+        if 0 != s:
+            ub_strerror(s)
+            return 3
+
+        if not result.secure:
+            print("CRIT (does not verify) %s" % (name, ))
+            return 2
+
+        s, packet = ldns.ldns_wire2pkt(result.packet)
+        rrsigs = packet.rr_list_by_type(RR_TYPE_RRSIG, ldns.LDNS_SECTION_ANSWER).rrs()
+
+        for rrsig in rrsigs:
+            delta = parse_rrsig_expire(str(rrsig.rrsig_expiration()))
+
+            if delta < crit:
+                print("CRIT (expires in %s) %s" % (delta, name))
+                return 2
+            elif delta < warn:
+                print("WARN (expires in %s) %s" % (delta, name))
+                return 1
+    return 0
     
 
 def main():
@@ -48,14 +59,32 @@ def main():
     parser.add_option("-c", "--critical-days",
                       action="store", type=int, dest="crit", default=2,
                       help="minimum remaining validity in days before a warning is issued")
-    
+    parser.add_option("-v", action="store_true", dest="verbose", default=False)
+    parser.add_option("-q", action="store_false", dest="verbose")
         
     opts, _args = parser.parse_args()
-    resolver = unbound.ub_ctx()
+    if not opts.names:
+        parser.error("needs at least one DNS name")
+
+    resolver = ub_ctx()
     resolver.add_ta_file(opts.ancor)
-    
-    for name in  opts.names:
-        check_dnssec_expire(resolver, name, timedelta(opts.warn), timedelta(opts.crit))
+    encoding = sys.getfilesystemencoding()
+
+    final = 0
+    for name in opts.names:
+        name = idn2dname(name.decode(encoding))
+        result = check_dnssec_expire(resolver, name,
+                                     timedelta(opts.warn), timedelta(opts.crit))
+        if result == 0 and opts.verbose:
+            print("OK %s" % name)
+        if result == 2:
+            final = 2
+        elif result == 1 and final != 2:
+            final = 1
+        elif result == 3 and final not in [1, 2]:
+            final = 3
+
+    sys.exit(final)
 
 if __name__ == "__main__":
     main()