Skip to content

Instantly share code, notes, and snippets.

@vulpicastor
Last active April 26, 2017 01:32

Revisions

  1. vulpicastor revised this gist Apr 26, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion dnscheck.py
    Original file line number Diff line number Diff line change
    @@ -99,7 +99,7 @@ def main():
    wait = DEFAULT_INTERVAL
    timeout = 0
    time.sleep(wait)
    except dns.exception.Timeout:
    except dns.exception.Timeout as err:
    zwrite.zwrite(str(err) + "\nRetry in {} seconds".format(wait), zsig=domain, **DEFAULT_ARGS)
    wait = randrange(0, BACKOFF_START * 2**timeout)
    timeout += 1
  2. vulpicastor revised this gist Oct 14, 2016. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions dnscheck.py
    Original file line number Diff line number Diff line change
    @@ -7,9 +7,9 @@
    from random import randrange
    import zwrite

    DEFAULT_ARGS = {"classname": "slz-auto",
    DEFAULT_ARGS = {"classname": "test",
    "instance": "dns",
    "sender": "slz_bot",
    "sender": "dns_bot",
    "opcode": "auto"}

    TEMPLATE = "{:15} SOA Serial: @b({})"
  3. vulpicastor revised this gist Oct 14, 2016. 1 changed file with 22 additions and 7 deletions.
    29 changes: 22 additions & 7 deletions dnscheck.py
    Original file line number Diff line number Diff line change
    @@ -4,15 +4,19 @@
    import sys
    import time
    import dns.resolver, dns.exception
    from random import randrange
    import zwrite

    DEFAULT_ARGS = {"classname": "test",
    DEFAULT_ARGS = {"classname": "slz-auto",
    "instance": "dns",
    "sender": "bot",
    "sender": "slz_bot",
    "opcode": "auto"}

    TEMPLATE = "{:15} SOA Serial: @b({})"

    DEFAULT_INTERVAL = 300
    BACKOFF_START = 10

    def find_nameservers(domain):
    nameservers = []
    try:
    @@ -75,20 +79,31 @@ def main():
    try:
    resolver_ips = find_ips(find_nameservers(domain))
    except (dns.exception.Timeout, dns.resolver.NXDOMAIN, dns.resolver.YXDOMAIN,
    dns.resolver.NoAnswer, dns.resolver.NoNameservers):
    dns.resolver.NoAnswer, dns.resolver.NoNameservers) as err:
    if len(sys.argv) > 2:
    resolver_ips = sys.argv[2:]
    else:
    zwrite.zwrite(str(err), zsig=domain, **DEFAULT_ARGS)
    raise
    resolvers = spawn_resolvers(resolver_ips)
    serials = {}
    for r in resolvers:
    serials[r.nameservers[0]] = "0"
    wait = DEFAULT_INTERVAL
    timeout = 0
    while True:
    message = check_soa_serial(domain, resolvers, serials)
    if message:
    zwrite.zwrite(message, zsig=domain, **DEFAULT_ARGS)
    time.sleep(300)
    try:
    message = check_soa_serial(domain, resolvers, serials)
    if message:
    zwrite.zwrite(message, zsig=domain, **DEFAULT_ARGS)
    wait = DEFAULT_INTERVAL
    timeout = 0
    time.sleep(wait)
    except dns.exception.Timeout:
    zwrite.zwrite(str(err) + "\nRetry in {} seconds".format(wait), zsig=domain, **DEFAULT_ARGS)
    wait = randrange(0, BACKOFF_START * 2**timeout)
    timeout += 1
    time.sleep(wait)

    if __name__ == "__main__":
    main()
  4. vulpicastor revised this gist Jul 17, 2016. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion dnscheck.py
    Original file line number Diff line number Diff line change
    @@ -91,4 +91,4 @@ def main():
    time.sleep(300)

    if __name__ == "__main__":
    main()
    main()
  5. vulpicastor revised this gist Jul 17, 2016. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions dnscheck.py
    Original file line number Diff line number Diff line change
    @@ -6,9 +6,9 @@
    import dns.resolver, dns.exception
    import zwrite

    DEFAULT_ARGS = {"classname": "slz-auto",
    DEFAULT_ARGS = {"classname": "test",
    "instance": "dns",
    "sender": "slz_bot",
    "sender": "bot",
    "opcode": "auto"}

    TEMPLATE = "{:15} SOA Serial: @b({})"
  6. vulpicastor revised this gist Jul 17, 2016. 1 changed file with 36 additions and 22 deletions.
    58 changes: 36 additions & 22 deletions dnscheck.py
    Original file line number Diff line number Diff line change
    @@ -3,22 +3,26 @@
    from __future__ import print_function
    import sys
    import time
    import dns.resolver
    import dns.resolver, dns.exception
    import zwrite

    DEFAULT_ARGS = {"classname": "test",
    DEFAULT_ARGS = {"classname": "slz-auto",
    "instance": "dns",
    "sender": "bot",
    "sender": "slz_bot",
    "opcode": "auto"}

    TEMPLATE = "{:15} SOA Serial: @b({})"

    def find_nameservers(domain):
    nameservers = []
    answer = dns.resolver.query(domain, "NS")
    for ns in answer:
    nameservers.append(ns.target)
    return nameservers
    try:
    answer = dns.resolver.query(domain, "NS")
    for ns in answer:
    nameservers.append(ns.target)
    return nameservers
    except dns.resolver.NoNameservers:
    print("Error: Cannot find name servers for {}.".format(domain))
    raise

    def find_ips(domains):
    ips = []
    @@ -28,7 +32,6 @@ def find_ips(domains):
    ips.append(a.address)
    return ips


    def spawn_resolvers(nameservers):
    resolvers = []
    for ns in nameservers:
    @@ -48,25 +51,36 @@ def check_soa_serial(domain, resolvers, serials):
    new_serials = {}
    updated = False
    for r in resolvers:
    soa = r.query(domain, "SOA")
    n = r.nameservers[0]
    s = soa[0].serial
    if serials_gt(s, serials[n]):
    answers.append(TEMPLATE.format(n, s) + " @b(@color(green)UPDATE)")
    updated = True
    elif serials_eq(s, serials[n]):
    if updated:
    answers.append(TEMPLATE.format(n, s) + " @b(@color(yellow)UNCHANGED)")
    else:
    answers.append(TEMPLATE.format(n, s) + " @b(@color(red)REGRESSION)")
    updated = True
    new_serials[n] = s
    try:
    soa = r.query(domain, "SOA")
    s = soa[0].serial
    if serials_gt(s, serials[n]):
    answers.append(TEMPLATE.format(n, s) + " @b(@color(green)UPDATE)")
    updated = True
    elif serials_eq(s, serials[n]):
    if updated:
    answers.append(TEMPLATE.format(n, s) + " @b(@color(yellow)UNCHANGED)")
    else:
    answers.append(TEMPLATE.format(n, s) + " @b(@color(red)REGRESSION)")
    updated = True
    new_serials[n] = s
    except dns.resolver.NoNameservers:
    answers.append(TEMPLATE.format(n, "@color(red)UNKNOWN"))
    serials.update(new_serials)
    return "\n".join(answers)

    def main():
    domain = sys.argv[1]
    resolvers = spawn_resolvers(find_ips(find_nameservers(domain)))
    try:
    resolver_ips = find_ips(find_nameservers(domain))
    except (dns.exception.Timeout, dns.resolver.NXDOMAIN, dns.resolver.YXDOMAIN,
    dns.resolver.NoAnswer, dns.resolver.NoNameservers):
    if len(sys.argv) > 2:
    resolver_ips = sys.argv[2:]
    else:
    raise
    resolvers = spawn_resolvers(resolver_ips)
    serials = {}
    for r in resolvers:
    serials[r.nameservers[0]] = "0"
    @@ -77,4 +91,4 @@ def main():
    time.sleep(300)

    if __name__ == "__main__":
    main()
    main()
  7. vulpicastor revised this gist Jul 15, 2016. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions dnscheck.py
    Original file line number Diff line number Diff line change
    @@ -6,9 +6,9 @@
    import dns.resolver
    import zwrite

    DEFAULT_ARGS = {"classname": "slz-auto",
    DEFAULT_ARGS = {"classname": "test",
    "instance": "dns",
    "sender": "slz_bot",
    "sender": "bot",
    "opcode": "auto"}

    TEMPLATE = "{:15} SOA Serial: @b({})"
  8. vulpicastor revised this gist Jul 15, 2016. 1 changed file with 16 additions and 10 deletions.
    26 changes: 16 additions & 10 deletions dnscheck.py
    Original file line number Diff line number Diff line change
    @@ -6,22 +6,29 @@
    import dns.resolver
    import zwrite

    DEFAULT_ARGS = {"classname": "message",
    DEFAULT_ARGS = {"classname": "slz-auto",
    "instance": "dns",
    "sender": "bot",
    "zsig": "dnscheck.py",
    "sender": "slz_bot",
    "opcode": "auto"}

    TEMPLATE = "{:15} SOA Serial: @b({})"

    def find_nameservers(domain):
    nameservers = []
    ns = dns.resolver.query(domain, "NS")
    for rrset in ns.response.additional:
    for a in rrset:
    nameservers.append(a.address)
    answer = dns.resolver.query(domain, "NS")
    for ns in answer:
    nameservers.append(ns.target)
    return nameservers

    def find_ips(domains):
    ips = []
    for d in domains:
    answer = dns.resolver.query(d)
    for a in answer:
    ips.append(a.address)
    return ips


    def spawn_resolvers(nameservers):
    resolvers = []
    for ns in nameservers:
    @@ -59,15 +66,14 @@ def check_soa_serial(domain, resolvers, serials):

    def main():
    domain = sys.argv[1]
    print(domain)
    resolvers = spawn_resolvers(find_nameservers(domain))
    resolvers = spawn_resolvers(find_ips(find_nameservers(domain)))
    serials = {}
    for r in resolvers:
    serials[r.nameservers[0]] = "0"
    while True:
    message = check_soa_serial(domain, resolvers, serials)
    if message:
    zwrite.zwrite("\n".join((domain, message)), **DEFAULT_ARGS)
    zwrite.zwrite(message, zsig=domain, **DEFAULT_ARGS)
    time.sleep(300)

    if __name__ == "__main__":
  9. vulpicastor revised this gist Jul 14, 2016. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions dnscheck.py
    Original file line number Diff line number Diff line change
    @@ -37,7 +37,7 @@ def serials_eq(a, b):
    return int(a) == int(b)

    def check_soa_serial(domain, resolvers, serials):
    answers = [domain]
    answers = []
    new_serials = {}
    updated = False
    for r in resolvers:
    @@ -67,7 +67,7 @@ def main():
    while True:
    message = check_soa_serial(domain, resolvers, serials)
    if message:
    zwrite.zwrite(message, **DEFAULT_ARGS)
    zwrite.zwrite("\n".join((domain, message)), **DEFAULT_ARGS)
    time.sleep(300)

    if __name__ == "__main__":
  10. vulpicastor revised this gist Jul 14, 2016. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion dnscheck.py
    Original file line number Diff line number Diff line change
    @@ -71,4 +71,4 @@ def main():
    time.sleep(300)

    if __name__ == "__main__":
    main()
    main()
  11. vulpicastor revised this gist Jul 14, 2016. 1 changed file with 4 additions and 3 deletions.
    7 changes: 4 additions & 3 deletions dnscheck.py
    Original file line number Diff line number Diff line change
    @@ -47,10 +47,11 @@ def check_soa_serial(domain, resolvers, serials):
    if serials_gt(s, serials[n]):
    answers.append(TEMPLATE.format(n, s) + " @b(@color(green)UPDATE)")
    updated = True
    elif serials_eq(s, serials[n]) and updated:
    answers.append(TEMPLATE.format(n, s) + " @b(@color(yellow)UNCHANGED)")
    elif serials_eq(s, serials[n]):
    if updated:
    answers.append(TEMPLATE.format(n, s) + " @b(@color(yellow)UNCHANGED)")
    else:
    answers.append(TEMPLATE.format(n, s) + " @b(@color(yellow)REGRESSION)")
    answers.append(TEMPLATE.format(n, s) + " @b(@color(red)REGRESSION)")
    updated = True
    new_serials[n] = s
    serials.update(new_serials)
  12. vulpicastor revised this gist Jul 14, 2016. 1 changed file with 2 additions and 0 deletions.
    2 changes: 2 additions & 0 deletions dnscheck.py
    Original file line number Diff line number Diff line change
    @@ -52,6 +52,8 @@ def check_soa_serial(domain, resolvers, serials):
    else:
    answers.append(TEMPLATE.format(n, s) + " @b(@color(yellow)REGRESSION)")
    updated = True
    new_serials[n] = s
    serials.update(new_serials)
    return "\n".join(answers)

    def main():
  13. vulpicastor created this gist Jul 14, 2016.
    71 changes: 71 additions & 0 deletions dnscheck.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,71 @@
    #!/usr/bin/env python3

    from __future__ import print_function
    import sys
    import time
    import dns.resolver
    import zwrite

    DEFAULT_ARGS = {"classname": "message",
    "instance": "dns",
    "sender": "bot",
    "zsig": "dnscheck.py",
    "opcode": "auto"}

    TEMPLATE = "{:15} SOA Serial: @b({})"

    def find_nameservers(domain):
    nameservers = []
    ns = dns.resolver.query(domain, "NS")
    for rrset in ns.response.additional:
    for a in rrset:
    nameservers.append(a.address)
    return nameservers

    def spawn_resolvers(nameservers):
    resolvers = []
    for ns in nameservers:
    resolvers.append(dns.resolver.Resolver())
    resolvers[-1].nameservers = [ns]
    return resolvers

    def serials_gt(a, b):
    # TODO: actually use the algorithm specified in RFC 1982
    return int(a) > int(b)

    def serials_eq(a, b):
    return int(a) == int(b)

    def check_soa_serial(domain, resolvers, serials):
    answers = [domain]
    new_serials = {}
    updated = False
    for r in resolvers:
    soa = r.query(domain, "SOA")
    n = r.nameservers[0]
    s = soa[0].serial
    if serials_gt(s, serials[n]):
    answers.append(TEMPLATE.format(n, s) + " @b(@color(green)UPDATE)")
    updated = True
    elif serials_eq(s, serials[n]) and updated:
    answers.append(TEMPLATE.format(n, s) + " @b(@color(yellow)UNCHANGED)")
    else:
    answers.append(TEMPLATE.format(n, s) + " @b(@color(yellow)REGRESSION)")
    updated = True
    return "\n".join(answers)

    def main():
    domain = sys.argv[1]
    print(domain)
    resolvers = spawn_resolvers(find_nameservers(domain))
    serials = {}
    for r in resolvers:
    serials[r.nameservers[0]] = "0"
    while True:
    message = check_soa_serial(domain, resolvers, serials)
    if message:
    zwrite.zwrite(message, **DEFAULT_ARGS)
    time.sleep(300)

    if __name__ == "__main__":
    main()