| #!/usr/bin/python |
| """DNS service check. |
| |
| Prints a one line summary of whether DNS servers are functioning. |
| Supports IPv4 and IPv6. |
| |
| $ dnsck 2001:4860:4860::8888 2001:4860:4860::8844 8.8.8.8 8.8.4.4 |
| 2001:4860:4860::8888(OK),13.2ms 2001:4860:4860::8844(TIMEOUT),3000.0ms \ |
| 8.8.8.8(OK),13.7ms 8.8.4.4(OK),15.8ms |
| """ |
| |
| import dns.resolver |
| import sys |
| import time |
| |
| try: |
| import monotime # gpylint disable=unused-import,g-import-not-at-top |
| except ImportError: |
| pass |
| |
| |
| _time = getattr(time, 'monotime', time.time) |
| |
| |
| def GetDefaultNameservers(): |
| s = dns.resolver.Resolver(configure=True) |
| return s.nameservers |
| |
| |
| def DnsCheck(server, qname): |
| """Resolve qname using server, return status.""" |
| s = dns.resolver.Resolver(configure=False) |
| s.timeout = s.lifetime = 3 # in seconds |
| s.nameservers.append(server) |
| start = _time() |
| result = 'UNKNOWN' |
| try: |
| answer = s.query(qname=qname) |
| result = 'OK' |
| except dns.exception.Timeout: |
| result = 'TIMEOUT' |
| except dns.exception.DNSException: |
| result = 'DNSERR' |
| end = _time() |
| msec = '%.1fms' % ((end - start) * 1000) |
| return '%s(%s),%s' % (server, result, msec) |
| |
| |
| def main(): |
| servers = set(GetDefaultNameservers()) |
| if (len(sys.argv) > 1): |
| servers |= set(sys.argv[1:]) |
| output = [] |
| for server in servers: |
| output.append(DnsCheck(server, qname='gstatic.com')) |
| print ' '.join(output) |
| |
| |
| if __name__ == '__main__': |
| main() |