pvl/dns/labels.py
author Tero Marttila <tero.marttila@aalto.fi>
Thu, 26 Feb 2015 15:23:00 +0200
changeset 486 cf120b977790
parent 456 602838dfb6e7
child 515 996ccf5356b8
permissions -rw-r--r--
pvl.dns: split() and relative()
456
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     1
# TODO: support fqdns in parts
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     2
def join (*parts) :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     3
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     4
        Join a domain name from labels.
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     5
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     6
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     7
    return '.'.join(str(part) for part in parts)
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     8
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     9
def fqdn (*parts) :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    10
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    11
        Return an FQND from parts, ending in .
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    12
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    13
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    14
    fqdn = join(*parts)
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    15
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    16
    # we may be given an fqdn in parts
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    17
    if not fqdn.endswith('.') :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    18
        fqdn += '.'
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    19
    
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    20
    return fqdn
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    21
486
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    22
def split (origin, fqdn):
456
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    23
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    24
        Determine the relative label from the given zone origin to the given host fqnd.
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    25
    """
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    26
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    27
    if fqdn.endswith('.' + origin) :
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    28
        # strip
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    29
        return fqdn[:(len(fqdn) - len(origin) - 1)]
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    30
    else:
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    31
        raise ValueError("{fqdn} outside of zone {origin}".format(fqdn=fqdn, origin=origin))
602838dfb6e7 pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    32
486
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    33
def relative (origin, domain, name) :
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    34
    """
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    35
        relative relative label @origin for name@domain
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    36
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    37
        Raises ValueError if name is outside of origin
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    38
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    39
        >>> print relative(None, None, 'fqdn')
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    40
        fqdn.
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    41
        >>> print relative(None, 'domain', 'host')
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    42
        host.domain.
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    43
        >>> print relative('origin', 'domain', 'host')
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    44
        Traceback (most recent call last):
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    45
            ...
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    46
        ValueError: host: domain domain out of zone origin.
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    47
        >>> print relative('origin', 'origin', 'host')
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    48
        host
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    49
        >>> print relative('origin', 'domain.origin', 'host')
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    50
        host.domain
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    51
        >>> print relative('origin', 'domainorigin', 'host')
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    52
        Traceback (most recent call last):
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    53
            ...
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    54
        ValueError: host: domain domainorigin out of zone origin.
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    55
        >>> print relative('origin', None, 'host.domain')
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    56
        Traceback (most recent call last):
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    57
            ...
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    58
        ValueError: host.domain: fqdn host.domain. out of zone origin.
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    59
    """
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    60
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    61
    if origin:
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    62
        origin = fqdn(origin)
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    63
    
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    64
    if domain:
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    65
        host_fqdn = fqdn(name, domain)
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    66
    else:
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    67
        host_fqdn = fqdn(name)
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    68
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    69
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    70
    if not origin:
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    71
        return host_fqdn
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    72
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    73
    elif domain == origin:
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    74
         return name
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    75
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    76
    elif host_fqdn.endswith('.' + origin):
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    77
        return split(origin, host_fqdn)
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    78
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    79
    elif domain:
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    80
        raise ValueError("{name}: domain {domain} out of zone {origin}".format(name=name, domain=domain, origin=origin))
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    81
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    82
    else:
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    83
        raise ValueError("{name}: fqdn {fqdn} out of zone {origin}".format(name=name, fqdn=host_fqdn, origin=origin))
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    84
cf120b977790 pvl.dns: split() and relative()
Tero Marttila <tero.marttila@aalto.fi>
parents: 456
diff changeset
    85