Commit acf7b96d authored by Jonathan Michalon's avatar Jonathan Michalon

Merge branch 'dyndns' into 'master'

Add support for dynamic DNS resolution in host addresses

See merge request !9
parents 5f742829 83c73056
......@@ -60,6 +60,23 @@ unnamed = Host(ipv4='', ipv6='::1')
v6only = Host(ipv6='2001:0DB8::beef')
# Dynamic DNS resolution for the hosts (discouraged but for truly dynamic DNS)
from picomon.dyndns import DynDNS4, DynDNS6
dynamic = Host(ipv4=DynDNS4(''), ipv6=DynDNS6(''),
# Shorthands for dynamic hosts
from picomon.dyndns import DynHost, DynHost4, DynHost6
dynamic2 = DynHost(dns='')
dynamic3 = DynHost('')
dynv4only = DynHost4(dns='')
dynv6only = DynHost6(dns='')
partdyn = DynHost(dns='', ipv6='::1')
# Checks
......@@ -110,7 +110,7 @@ class Check(object):
lambda s: "'" + s.replace("'", "'\"'\"'") + "'",
p = Popen(command, stdout=PIPE, stderr=PIPE)
p = Popen(map(str, command), stdout=PIPE, stderr=PIPE)
except OSError as e:
self.errmsg = 'Check not available: ' + e.strerror
return False
import socket
from .checks import Host
class DynDNS(object):
mimicks a str() but resolves a host to an IP
>>> x=DynDNS('localhost')
>>> print(x)
>>> print(x.replace('.', ' '))
127 0 0 1
>>> x == 'localhost'
>>> x == ''
def __init__(self, host, family=0):
self._host = host
self._family = family
def __str__(self):
""" pick up the first matching address """
return socket.getaddrinfo(self._host, None, self._family)[0][4][0]
def __repr__(self):
return str(self)
def __eq__(self, other):
""" consider equality if host or string representation match """
if isinstance(other, type(self)) and self._host == other._host:
return True
other_str = str(other)
return self._host == other_str or str(self) == other_str
def __getattr__(self, attr):
return getattr(str(self), attr)
class DynDNS4(DynDNS):
def __init__(self, host):
DynDNS.__init__(self, host, socket.AF_INET)
class DynDNS6(DynDNS):
def __init__(self, host):
DynDNS.__init__(self, host, socket.AF_INET6)
class DynHost(Host):
def __init__(self, dns, ipv4=None, ipv6=None, name=None):
Host.__init__(self, ipv4=ipv4 or DynDNS4(dns),
ipv6=ipv6 or DynDNS6(dns), name=name or dns)
class DynHost4(Host):
def __init__(self, dns, name=None):
Host.__init__(self, ipv4=DynDNS4(dns), name=name or dns)
class DynHost6(Host):
def __init__(self, dns):
Host.__init__(self, ipv6=DynDNS6(dns), name=name or dns)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment