From de0e8d27d62c1b21b644444f1c9582e9a6649019 Mon Sep 17 00:00:00 2001 From: Fredrik Wahlberg Date: Fri, 23 Jan 2004 12:59:17 +0000 Subject: [PATCH] Better catching of specific exceptions instead of try: except: Added verification of password/keyname --- dnsupdate.py | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/dnsupdate.py b/dnsupdate.py index fe7fe68..0cce750 100644 --- a/dnsupdate.py +++ b/dnsupdate.py @@ -156,9 +156,14 @@ def update(msg): import dns.tsigkeyring import dns.update # The name of the key and the secret - keyring = dns.tsigkeyring.from_text({ + import binascii # for exception handling + try: + keyring = dns.tsigkeyring.from_text({ msg['keyname']: msg['keysecret'] - }) + }) + except binascii.Error: + msg['error'].append("Your password is incorrect.") + return # dns.update.Update(name of domain, keyring, keyname) update = dns.update.Update(msg['domain'], keyring=keyring, keyname=msg['keyname']) @@ -170,11 +175,15 @@ def update(msg): update.replace(msg['hostname'], msg['ttl'], 'a', msg['ipaddress']) # doit, servername + import socket # Import socket so we can catch exceptions try: response = dns.query.tcp(update, '217.78.32.198') - except: + except socket.error: msg['error'].append("An error occurred in the server communication.") return + except dns.tsig.BadSignature: + msg['error'].append("Your password could not be verified.\n Check your password and keyname.") + return # Verify response if not msg.has_key('quiet'): @@ -183,8 +192,10 @@ def update(msg): print "Host '%s.%s' has been deleted" % (msg['hostname'], msg['domain']) else: print "Host '%s.%s' has been added with ip address %s" % (msg['hostname'], msg['domain'], msg['ipaddress']) + elif response.rcode() == 5: + msg['error'].append("The server refused to accept the update") else: - print "An error has occurred, the server returned:\n%s" % response + msg['error'].append("Update refused, the server returned:\n%s" % response) @@ -211,12 +222,16 @@ def validate(msg): def verify_ip(msg): # Check if the ip address exists and if it needs an update import dns.resolver + ip = "" + host = msg['hostname'] + "." + msg['domain'] try: - ans = dns.resolver.query(msg['hostname'] + "." + msg['domain'], 'A') + ans = dns.resolver.query(host, 'A') for res in ans: ip = res.to_text() - except: - ip = "" + except dns.exception.Timeout: + msg['error'].append("Connection timeout, could not connect to nameserver.\n") + except dns.resolver.NXDOMAIN: + pass if ip == msg['ipaddress'] and not msg.has_key('delete'): msg['error'].append("Nameserver already up to date")