diff --git a/README.md b/README.md new file mode 100644 index 0000000..c54164d --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +## How to build +``` +python -m venv .venv +source .venv/bin/activate +pip install -U pip +pip install -r requirements +pyinstaller --onefile check_dns_advanced.py --collect-all importlib --collect-all h2 --collect-all httpx --collect-all httpcore +``` \ No newline at end of file diff --git a/check_dns_advanced.py b/check_dns_advanced.py index e580488..ece6178 100644 --- a/check_dns_advanced.py +++ b/check_dns_advanced.py @@ -1,3 +1,4 @@ +#!/bin/env python import argparse import dns.message import dns.name @@ -6,13 +7,14 @@ import dns.rdatatype import dns.resolver import httpx import ipaddress +import asyncio from sys import exit parser = argparse.ArgumentParser( epilog="Nagios/Icinga compatible check for DNS, DOT (DNS over TLS), DOH (DNS over HTTPS)", formatter_class=argparse.RawTextHelpFormatter) -parser.add_argument("-m", "--mode", choices=["dns", "dot", "doh"], \ +parser.add_argument("-m", "--mode", choices=["dns", "dot", "doh","doq"], \ default="dns", help="Check Mode: dns = normal DNS query\n dot = DNS over TLS\n doh = DNS over HTTPs\ndefault: %(default)s") parser.add_argument("-t", "--type", choices=["A", "AAAA", "TXT"], \ default="A", help="Type to check\ndefault: %(default)s") @@ -42,6 +44,18 @@ def doh(query,server): return r.answer except httpx.ConnectError as e: print(e) + +def doq(query,server): + async def amulti(query): + global response + async with dns.quic.AsyncioQuicManager() as manager: + connection = manager.connect(get_ip(server), 853) + r = await dns.asyncquery.quic(query, get_ip(server), port=443, connection=connection) + print(r) + response = r + + asyncio.run(amulti(query)) + return response def dot(query,server): server = get_ip(server) @@ -61,6 +75,7 @@ def query(mode,address,type,server): if(mode == "dns"): response = dns53(query,server) if(mode == "dot"): response = dot(query,server) if(mode == "doh"): response = doh(query,server) + if(mode == "doq"): response = doq(query,server) analyze(address,type,server,response) def analyze(address,type,server,response): diff --git a/requirements.txt b/requirements.txt index e5a6b6f..354abf9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1 @@ -dnspython -httpx -h2 +dnspython[doh,dnssec,idna,doq] \ No newline at end of file