author | Tero Marttila <terom@paivola.fi> |
Mon, 09 Mar 2015 23:31:13 +0200 | |
changeset 738 | 3104fdf7ea26 |
parent 736 | 75938aa0390b |
child 739 | 5149c39f3dfc |
permissions | -rw-r--r-- |
738
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
1 |
import collections |
735
008cfe47b194
pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
2 |
import ipaddress, ipaddr # XXX: conversion |
008cfe47b194
pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
3 |
import pvl.hosts |
738
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
4 |
import pvl.hosts.host |
735
008cfe47b194
pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
5 |
|
738
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
6 |
class HostInterface(object): |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
7 |
""" |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
8 |
A single host-interface. |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
9 |
""" |
735
008cfe47b194
pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
10 |
|
738
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
11 |
ip4 = None |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
12 |
|
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
13 |
def __init__(self, name): |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
14 |
self.name = name |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
15 |
|
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
16 |
def __str__(self): |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
17 |
return self.name |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
18 |
|
735
008cfe47b194
pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
19 |
@pvl.hosts.extension |
738
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
20 |
class HostInterfaces(object): |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
21 |
""" |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
22 |
A host with multiple sub-interfaces. |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
23 |
|
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
24 |
Typically used for point-to-point interfaces between routers. For multi-homed hosts, it might make |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
25 |
more sense to use multiple hosts in different domains. |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
26 |
|
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
27 |
[foo] |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
28 |
interface:ip.eth0 = 10.255.1.1/30 |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
29 |
|
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
30 |
[bar] |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
31 |
interface:ip.eth1 = 10.255.1.2/30 |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
32 |
""" |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
33 |
|
735
008cfe47b194
pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
34 |
EXTENSION = 'interface' |
008cfe47b194
pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
35 |
|
008cfe47b194
pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
36 |
@classmethod |
738
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
37 |
def build (cls, ip={}): |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
38 |
interfaces = collections.defaultdict(HostInterface) |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
39 |
|
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
40 |
for iface, ip in pvl.hosts.host.parse_dict(ip, parse=ipaddress.ip_interface).iteritems(): |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
41 |
if iface in interfaces: |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
42 |
iface = interfaces[iface] |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
43 |
else: |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
44 |
iface = interfaces[iface] = HostInterface(iface) |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
45 |
|
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
46 |
interfaces[iface].ip4 = ip |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
47 |
|
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
48 |
return cls(interfaces) |
735
008cfe47b194
pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
49 |
|
008cfe47b194
pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
50 |
def __init__ (self, interfaces): |
008cfe47b194
pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
51 |
self.interfaces = interfaces |
008cfe47b194
pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
52 |
|
008cfe47b194
pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
53 |
def addresses (self): |
738
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
54 |
""" |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
55 |
Yield additional sub-addresses for host interfaces. |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
56 |
""" |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
57 |
|
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
58 |
for iface in self: |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
59 |
if iface.ip4: |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
60 |
# XXX: convert |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
61 |
yield iface.name, ipaddr.IPv4Address(str(iface.ip4.ip)) |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
62 |
|
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
63 |
def __iter__(self): |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
64 |
""" |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
65 |
HostInterface's with stable ordering. |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
66 |
""" |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
67 |
|
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
68 |
return iter(sorted(self.interfaces.itervalues(), key=str)) |
3104fdf7ea26
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents:
736
diff
changeset
|
69 |