Lines 128-133
RE_ALNUM = re.compile(r'([0-9]+)|([^0-9]+)')
|
Link Here
|
---|
|
128 |
class _Iface(dict): |
128 |
class _Iface(dict): |
129 |
"""Single network interface.""" |
129 |
"""Single network interface.""" |
130 |
|
130 |
|
|
|
131 |
IPv4Address = IPv4Address |
132 |
IPv6Address = IPv6Address |
133 |
IPv4Interface = IPv4Interface |
134 |
IPv6Interface = IPv6Interface |
135 |
|
131 |
def __init__(self, *args, **kwargs): |
136 |
def __init__(self, *args, **kwargs): |
132 |
dict.__init__(self, *args, **kwargs) |
137 |
dict.__init__(self, *args, **kwargs) |
133 |
self.ipv6_names = set() |
138 |
self.ipv6_names = set() |
|
162 |
def network(self): |
167 |
def network(self): |
163 |
# type: () -> IPv4Address |
168 |
# type: () -> IPv4Address |
164 |
"""Return network address.""" |
169 |
"""Return network address.""" |
165 |
return IPv4Address(u'%(network)s' % self) |
170 |
return self.IPv4Address(u'%(network)s' % self) |
166 |
|
171 |
|
167 |
@property # type: ignore |
172 |
@property # type: ignore |
168 |
@forgiving_addr |
173 |
@forgiving_addr |
169 |
def broadcast(self): |
174 |
def broadcast(self): |
170 |
# type: () -> IPv4Address |
175 |
# type: () -> IPv4Address |
171 |
"""Return broadcast address.""" |
176 |
"""Return broadcast address.""" |
172 |
return IPv4Address(u'%(broadcast)s' % self) |
177 |
return self.IPv4Address(u'%(broadcast)s' % self) |
173 |
|
178 |
|
174 |
@forgiving_addr |
179 |
@forgiving_addr |
175 |
def ipv4_address(self): |
180 |
def ipv4_address(self): |
176 |
# type: () -> IPv4Interface |
181 |
# type: () -> IPv4Interface |
177 |
"""Return IPv4 address.""" |
182 |
"""Return IPv4 address.""" |
178 |
return IPv4Interface(u'%(address)s/%(netmask)s' % self) |
183 |
return self.IPv4Interface(u'%(address)s/%(netmask)s' % self) |
179 |
|
184 |
|
180 |
@forgiving_addr |
185 |
@forgiving_addr |
181 |
def ipv6_address(self, name='default'): |
186 |
def ipv6_address(self, name='default'): |
182 |
# type: (str) -> IPv6Interface |
187 |
# type: (str) -> IPv6Interface |
183 |
"""Return IPv6 address.""" |
188 |
"""Return IPv6 address.""" |
184 |
key = u'%%(ipv6/%s/address)s/%%(ipv6/%s/prefix)s' % (name, name) |
189 |
key = u'%%(ipv6/%s/address)s/%%(ipv6/%s/prefix)s' % (name, name) |
185 |
return IPv6Interface(key % self) |
190 |
return self.IPv6Interface(key % self) |
186 |
|
191 |
|
187 |
@property |
192 |
@property |
188 |
def routes(self): |
193 |
def routes(self): |
|
204 |
yield v |
209 |
yield v |
205 |
|
210 |
|
206 |
|
211 |
|
|
|
212 |
class _NewIface(_Iface): |
213 |
|
214 |
from ipaddress import IPv4Address, IPv6Address, IPv4Interface, IPv6Interface |
215 |
|
216 |
|
207 |
class VengefulConfigRegistry(ConfigRegistry): |
217 |
class VengefulConfigRegistry(ConfigRegistry): |
208 |
""" |
218 |
""" |
209 |
Instance wrapper for Config Registry throwing exceptions. |
219 |
Instance wrapper for Config Registry throwing exceptions. |
Lines 244-263
class Interfaces(object):
|
Link Here
|
---|
|
244 |
Handle network interfaces configured by UCR. |
254 |
Handle network interfaces configured by UCR. |
245 |
|
255 |
|
246 |
:param ucr: UCR instance. |
256 |
:param ucr: UCR instance. |
|
|
257 |
:param use_python3_api bool: Whether to use the module :py:mod:`ipaddress` from Python 3 or the legacy module :py:mod:`ipaddr` for Python 2 as the interface. |
258 |
|
259 |
.. deprecated:: 5.0 |
260 |
`use_python3_api` is only relevant for Python 2 code. |
247 |
""" |
261 |
""" |
248 |
|
262 |
|
249 |
def __init__(self, ucr=None): |
263 |
def __init__(self, ucr=None, use_python3_api=six.PY3): |
250 |
# type: (ConfigRegistry) -> None |
264 |
# type: (ConfigRegistry, bool) -> None |
251 |
if ucr is None: |
265 |
if ucr is None: |
252 |
ucr = ConfigRegistry() |
266 |
ucr = ConfigRegistry() |
253 |
ucr.load() |
267 |
ucr.load() |
254 |
if isinstance(ucr, ConfigRegistry): |
268 |
if isinstance(ucr, ConfigRegistry): |
255 |
ucr = VengefulConfigRegistry(ucr) |
269 |
ucr = VengefulConfigRegistry(ucr) |
256 |
|
270 |
|
|
|
271 |
IPv4AddressClass = _NewIface.IPv4Address if use_python3_api else IPv4Address |
272 |
IPv6AddressClass = _NewIface.IPv6Address if use_python3_api else IPv6Address |
273 |
IfaceClass = _NewIface if use_python3_api else _Iface |
274 |
|
257 |
self.handler = ucr.get('interfaces/handler', 'ifplugd') |
275 |
self.handler = ucr.get('interfaces/handler', 'ifplugd') |
258 |
self.primary = ucr.get('interfaces/primary', 'eth0') |
276 |
self.primary = ucr.get('interfaces/primary', 'eth0') |
259 |
try: |
277 |
try: |
260 |
self.ipv4_gateway = IPv4Address(ucr['gateway']) |
278 |
self.ipv4_gateway = IPv4AddressClass(ucr['gateway']) |
261 |
except KeyError: |
279 |
except KeyError: |
262 |
self.ipv4_gateway = None |
280 |
self.ipv4_gateway = None |
263 |
except ValueError: |
281 |
except ValueError: |
Lines 270-276
class Interfaces(object):
|
Link Here
|
---|
|
270 |
parts = ucr['ipv6/gateway'].rsplit('%', 1) |
288 |
parts = ucr['ipv6/gateway'].rsplit('%', 1) |
271 |
gateway = parts.pop(0) |
289 |
gateway = parts.pop(0) |
272 |
zone_index = parts[0] if parts else None |
290 |
zone_index = parts[0] if parts else None |
273 |
self.ipv6_gateway = IPv6Address(gateway) |
291 |
self.ipv6_gateway = IPv6AddressClass(gateway) |
274 |
self.ipv6_gateway_zone_index = zone_index |
292 |
self.ipv6_gateway_zone_index = zone_index |
275 |
except KeyError: |
293 |
except KeyError: |
276 |
self.ipv6_gateway = None |
294 |
self.ipv6_gateway = None |
Lines 287-293
class Interfaces(object):
|
Link Here
|
---|
|
287 |
if not match: |
305 |
if not match: |
288 |
continue |
306 |
continue |
289 |
iface, subkey, ipv6_name = match.groups() |
307 |
iface, subkey, ipv6_name = match.groups() |
290 |
data = self._all_interfaces.setdefault(iface, _Iface(name=iface)) |
308 |
data = self._all_interfaces.setdefault(iface, IfaceClass(name=iface)) |
291 |
data[subkey] = value |
309 |
data[subkey] = value |
292 |
if ipv6_name: |
310 |
if ipv6_name: |
293 |
data.ipv6_names.add(ipv6_name) |
311 |
data.ipv6_names.add(ipv6_name) |