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-- |
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 |