Better catching of specific exceptions instead of try: except:
Added verification of password/keyname
This commit is contained in:
29
dnsupdate.py
29
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")
|
||||
|
||||
Reference in New Issue
Block a user