Files
Home-AssistantConfig/deps/netdisco/util.py

52 lines
1.5 KiB
Python
Raw Normal View History

2016-10-11 16:42:06 +00:00
"""Util functions used by Netdisco."""
from collections import defaultdict
# pylint: disable=unused-import, import-error, no-name-in-module
try:
# Py2
from urlparse import urlparse # noqa
except ImportError:
# Py3
from urllib.parse import urlparse # noqa
import netifaces
# Taken from http://stackoverflow.com/a/10077069
# pylint: disable=invalid-name
def etree_to_dict(t):
"""Convert an ETree object to a dict."""
# strip namespace
tag_name = t.tag[t.tag.find("}")+1:]
d = {tag_name: {} if t.attrib else None}
children = list(t)
if children:
dd = defaultdict(list)
for dc in map(etree_to_dict, children):
for k, v in dc.items():
dd[k].append(v)
d = {tag_name: {k: v[0] if len(v) == 1 else v for k, v in dd.items()}}
if t.attrib:
d[tag_name].update(('@' + k, v) for k, v in t.attrib.items())
if t.text:
text = t.text.strip()
if children or t.attrib:
if text:
d[tag_name]['#text'] = text
else:
d[tag_name] = text
return d
def interface_addresses(family=netifaces.AF_INET):
"""Return local addresses of any associated network.
Gathering of addresses which are bound to a local interface that has
broadcast (and probably multicast) capability.
"""
# pylint: disable=no-member
return [addr['addr']
for i in netifaces.interfaces()
for addr in netifaces.ifaddresses(i).get(family) or []
if 'broadcast' in addr]