X-Git-Url: https://git.ralfj.de/dyn-nsupdate.git/blobdiff_plain/5395e7dcae4d4263e5d84845097757dec5518bbf..556b6fb987e04d7898c5520298c4e1f07b234434:/client-scripts/dyn-ns-client diff --git a/client-scripts/dyn-ns-client b/client-scripts/dyn-ns-client index 5006fbd..e5eb56e 100755 --- a/client-scripts/dyn-ns-client +++ b/client-scripts/dyn-ns-client @@ -29,7 +29,7 @@ VERBOSE_CHANGE = 1 VERBOSE_FULL = 2 def sslContext(config): - if config['DEFAULT']['ssl_check_cert'].lower() in ('0', 'false', 'no'): + if config['DEFAULT'].get('ssl_check_cert', 'yes').lower() in ('0', 'false', 'no'): context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) return context else: @@ -50,7 +50,10 @@ def getConfigDir(): return os.path.expanduser("~/.config/dyn-nsupdate") def urlopen(url, config): - return urllib.request.urlopen(url, context=sslContext(config)).read().decode('utf-8').strip() + if sys.version_info >= (3, 4, 3): + return urllib.request.urlopen(url, context=sslContext(config)).read().decode('utf-8').strip('\n') + else: + return urllib.request.urlopen(url).read().decode('utf-8').strip('\n') def getMyIP(family, config, methods = {}, verbose = 0): '''Returns our current IP address ( can be "IPv4" or "IPv6"), detected as given by the configuration. @@ -58,9 +61,15 @@ def getMyIP(family, config, methods = {}, verbose = 0): method = config[family]['method'] if method == 'none': return None + elif method == 'remove': + return "" elif method == 'web': server = config[family].get('server', config['DEFAULT']['server']) - ip = urlopen('https://'+server+'/checkip', config) + url = 'https://'+server+'/checkip' + try: + ip = urlopen(url, config) + except urllib.error.URLError: + raise Exception("Error fetching {}, make sure the URL is correct and the internet connection actually works.".format(url)) if verbose >= VERBOSE_FULL: print("Server",server,"says my",family,"is",ip) return ip @@ -76,7 +85,8 @@ def getMyIPv4(config, verbose = 0): def getMyIPv6(config, verbose = 0): '''Returns our current IPv6 address, detected as given by the configuration''' def local(): - out = subprocess.check_output(["ip", "addr"]) + device = config["IPv6"].get("device") + out = subprocess.check_output(["ip", "addr", "show"] + ([] if device is None else ["dev", device])) for line in out.decode('utf-8').split('\n'): m = re.search('inet6 ([a-fA-F0-9:]+)/64 ([a-zA-Z0-9 ]*)', line) if m is not None: @@ -133,6 +143,8 @@ def updateDomain(server, domain, ipv4, ipv6, password, config, verbose): if ipv6 is not None: url += '&ipv6='+urllib.parse.quote(ipv6) expected += " "+ipv6 + if verbose >= VERBOSE_FULL: + print("Request:",url) result = urlopen(url, config) # did everything go as planned? @@ -140,16 +152,24 @@ def updateDomain(server, domain, ipv4, ipv6, password, config, verbose): if verbose >= VERBOSE_CHANGE: msg = "Successfully updated domain {} on {}:".format(domain, server) if ipv4 is not None: - msg += " IPv4={}".format(ipv4) + if curIPv4 == ipv4: + msg += " IPv4={} (unchanged)".format(curIPv4) + else: + msg += " IPv4={} -> {}".format(curIPv4, ipv4) + if ipv4 is not None and ipv6 is not None: + msg += "," if ipv6 is not None: - msg += " IPv6={}".format(ipv6) + if curIPv6 == ipv6: + msg += " IPv6={} (unchanged)".format(curIPv6) + else: + msg += " IPv6={} -> {}".format(curIPv6, ipv6) print(msg) # all went all right return True else: # Something went wrong print("Unexpected answer from server",server,"while updating",domain) - print(result) + print("Got '{}', expected '{}'".format(result, expected)) return False if __name__ == "__main__": @@ -159,7 +179,7 @@ if __name__ == "__main__": dest="config", default=os.path.join(getConfigDir(), "dyn-ns-client.conf"), help="The configuration file") parser.add_argument("-v", "--verbose", - action="count", dest="verbose", + action="count", dest="verbose", default=0, help="Be more verbose") args = parser.parse_args()