X-Git-Url: https://git.ralfj.de/dyn-nsupdate.git/blobdiff_plain/6259a980d722ebbf8a9f0b3f7ca1e9461b7caac9..5a68663cbbe2c85ca9f4189395d9fa2de5f34c40:/client-scripts/dyn-ns-client diff --git a/client-scripts/dyn-ns-client b/client-scripts/dyn-ns-client index af263b7..9f8118b 100755 --- a/client-scripts/dyn-ns-client +++ b/client-scripts/dyn-ns-client @@ -23,7 +23,7 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #============================================================================== -import urllib.request, socket, sys, argparse, os, configparser, itertools +import urllib.request, socket, sys, argparse, os, configparser, itertools, subprocess, re def readConfig(fname, defSection = 'DEFAULT'): config = configparser.ConfigParser() @@ -54,7 +54,7 @@ def getMyIP(family, config, methods = {}, verbose = False): if verbose: print("Server",server,"says my",family,"is",ip) return ip - elif method in 'methods': + elif method in methods: return methods[method]() else: raise Exception("Unsupported "+family+" detection method: "+method) @@ -65,7 +65,19 @@ def getMyIPv4(config, verbose = False): def getMyIPv6(config, verbose = False): '''Returns our current IPv6 address, detected as given by the configuration''' - return getMyIP("IPv6", config, verbose=verbose) + def local(): + out = subprocess.check_output(["ip", "addr"]) + 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: + ip = m.group(1) + flags = m.group(2).split() + if not 'temporary' in flags and not 'deprecated' in flags: + if verbose: + print("Local IPv6 detected to be",ip) + return ip + raise Exception("Unable to detect correct local IPv6 address") + return getMyIP("IPv6", config, methods={'local': local}, verbose=verbose) def getCurIP(domain, family): '''Return the current IP of the given . can be socket.AF_INET or socket.AF_INET6.'''