commit b09f06665d0423ba60d5229b896873c065efc8a7 Author: Félix Baylac-Jacqué Date: Sun Oct 18 16:52:57 2020 +0200 test dns sacha diff --git a/dns-sacha.py b/dns-sacha.py new file mode 100755 index 0000000..f3a92a2 --- /dev/null +++ b/dns-sacha.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 + +import functools +import json +import socket +import sys + +''' +Takes as input a list of domain names to test. Return wether they are +IPv4/IPv6-compatible. + +Usage: + +> cat test.txt +baionet.fr +google.com + +> cat test.txt | ./dns-sacha.py | jq + +[ + { + "host": "baionet.fr", + "v4": true, + "v6": false + }, + { + "host": "google.com", + "v4": true, + "v6": true + } +] +''' + +class UrlIp: + ''' + Struct wrapping a single record entry. Does it have IPv4 support? + IPv6 support? + ''' + def __init__(self, host, v4, v6): + self.host = host + self.v4 = v4 + self.v6 = v6 + def toJSON(self): + return json.dumps(self, default=lambda o: o.__dict__,sort_keys=True) + +def get_host_records(host): + ''' + Folds all the DNS entries of a Host and looks whether or not we + can find v4 and v6 records. + + reduce == left fold in the python world btw... + ''' + records = socket.getaddrinfo(host, 80) + return(functools.reduce(_test_record,records,UrlIp(host,False,False))) + +def _test_record(urlip, rec): + ''' + Fold function for get_host_records. Too big for a lambda not to + get messy. + + Gotta love Python... + ''' + (family, _rtype, proto, _canonname, _sockaddr) = rec + if family == socket.AF_INET: + urlip.v4 = True + elif family == socket.AF_INET6: + urlip.v6 = True + return urlip + +def parse_hosts(file_name): + with open(file_name, 'r') as f: + return f.readlines() + +def render_results(results): + ''' + Takes an array of UrlIp and renders that to json. + + Python's json.dumps only works with dictionnaries, not classes. + Extracting the dictionnary representation of the class. + ''' + return(json.dumps([r.__dict__ for r in results])) + +if __name__ == '__main__': + entries = [l.strip() for l in sys.stdin.readlines()] + test_results = [get_host_records(entry) for entry in entries] + print(render_results(test_results))