#!/usr/bin/python
+import sys
import re
import argparse
from subprocess import Popen, PIPE
import ipaddr
+class NsupdateError(Exception):
+ def __init__(self, returncode):
+ self.returncode = returncode
+
+
def ipfamily_by_ip(ip):
if isinstance(ip, ipaddr.IPv4Address):
return 'A'
def nsupdate_add(fqdn, ttl, ip):
"""
:param fqdn: Fully qualified domain name
- :param ip_family: A or AAAA"""
+ :param ip_family: A or AAAA
+ :raises an NsupdateError in case of errors."""
command = "update add {fqdn} {ttl} IN {ip_family} {ip}\n\n".format(fqdn=fqdn, ttl=ttl, ip_family=ipfamily_by_ip(ip), ip=ip)
p = Popen(['nsupdate', '-l'], stdin=PIPE)
p.communicate(command)
+ if p.returncode != 0:
+ raise NsupdateError(p.returncode)
def nsupdate_delete(fqdn, ip_family):
"""
:param fqdn: Fully qualified domain name
- :param ip_family: A or AAAA"""
+ :param ip_family: A or AAAA
+ :raises an NsupdateError in case of errors."""
command = "update delete {fqdn} {ip_family}\n\n".format(fqdn=fqdn, ip_family=ip_family)
p = Popen(['nsupdate', '-l'], stdin=PIPE)
p.communicate(command)
+ if p.returncode != 0:
+ raise NsupdateError(p.returncode)
def main(args):
- if args.delete:
- if args.ip is None:
- nsupdate_delete(args.fqdn, 'A')
- nsupdate_delete(args.fqdn, 'AAAA')
+ try:
+ if args.delete:
+ if args.ip is None:
+ nsupdate_delete(args.fqdn, 'A')
+ nsupdate_delete(args.fqdn, 'AAAA')
+ else:
+ nsupdate_delete(args.fqdn, ipfamily_by_ip(args.ip))
else:
nsupdate_delete(args.fqdn, ipfamily_by_ip(args.ip))
- else:
- nsupdate_delete(args.fqdn, ipfamily_by_ip(args.ip))
- nsupdate_add(args.fqdn, args.ttl, args.ip)
+ nsupdate_add(args.fqdn, args.ttl, args.ip)
+ except NsupdateError as e:
+ sys.exit(e.returncode)
+
if __name__ == '__main__':