def __init__(self, url, node=None, parent=None, dump=''): self.__parent = parent self.__services = {} self.__devices = {} self.__icons = {} icons = node.find('iconList') if icons is None: icons = [] services = node.find('serviceList') if services is None: services = [] devices = node.find('deviceList') if devices is None: devices = [] self.__node = node for icon in icons: icon = Icon(self, url, icon) self.__icons[icon.__name__] = icon for service in services: scpdurl = service.find('SCPDURL').text.replace(url, '') control_url = service.find('controlURL').text.replace(url, '') service_id = service.find('serviceId').text service_type = service.find('serviceType').text service = Service( self, url, scpdurl, service_type, control_url, dump=dump ) name = service_id.split(':')[-1] service.__name__ = name self.__services[name] = service for device in devices: device = EmbeddedDevice( url, node=device, parent=self, dump=dump ) self.__devices[device.__name__] = device self.url = url self.__name__ = self.friendly_name.replace(' ', '_').replace('-', '')
def __init__(self, ip, locations, dump=''): self.ip_address = ip cls_name = None self._devices = {} self._services = {} for location in locations: parsed_url = urlparse(location) url = parsed_url.scheme + '://' + parsed_url.netloc response = requests.get(location) if dump: path = location if path.startswith('/'): path = path[1:] if '/' in path: path, file_name = path.rsplit('/', 1) path = os.path.join(dump, path) else: file_name = path path = dump if not os.path.exists(path): os.makedirs(path) if not file_name.endswith('.xml'): file_name += '.xml' if isinstance(response.content, bytes): content = response.content.decode('utf-8') else: content = response.content with open(os.path.join(path, file_name), 'w') as f: f.write(content) root = etree.fromstring(response.content) root = strip_xmlns(root) node = root.find('device') services = node.find('serviceList') if services is None: services = [] devices = node.find('deviceList') if devices is None: devices = [] for service in services: scpdurl = service.find('SCPDURL').text.replace(url, '') control_url = service.find('controlURL').text if control_url is None: if scpdurl.endswith('.xml'): control_url = scpdurl.rsplit('/', 1)[0] if control_url == scpdurl: control_url = '' else: control_url = scpdurl else: control_url = control_url.replace(url, '') service_id = service.find('serviceId').text service_type = service.find('serviceType').text service = Service( self, url, scpdurl, service_type, control_url, node, dump=dump ) name = service_id.split(':')[-1] service.__name__ = name self._services[name] = service for device in devices: device = EmbeddedDevice( url, node=device, parent=self, dump=dump ) self._devices[device.__name__] = device if cls_name is None: cls_name = node.find('modelName') if cls_name is not None and cls_name.text: cls_name = cls_name.text.replace(' ', '_').replace('-', '') self.__name__ = cls_name
def build(self, ip_address, locations, dump=''): self._devices.clear() self._services.clear() self.ip_address = ip_address for location in locations: parsed = urlparse(location) url = '{0}://{1}:{2}/'.format(parsed.scheme, parsed.hostname, parsed.port) logger.debug(self.ip_address + ' <-- (' + location + ') ""') response = requests.get(location) logger.debug(self.ip_address + ' --> (' + location + ') ' + response.content.decode('utf-8')) path = parsed.path if path.startswith('/'): path = path[1:] if '/' in path: path, file_name = path.rsplit('/', 1) else: file_name = path path = '' if not file_name.endswith('.xml'): file_name += '.xml' if dump: content = response.content.decode('utf-8') if path: output = os.path.join(dump, path) if not os.path.exists(output): os.makedirs(output) else: output = dump indent_count = 0 for line in content.split('\n'): for char in list(line): if not line: continue if char != ' ' and not indent_count: break if char == ' ': indent_count += 1 else: if indent_count != 2: indent_count = 0 break if indent_count: break with open(os.path.join(output, file_name), 'w') as f: for line in content.split('\n'): if not line.strip(): continue line = line.replace('\t', ' ') if indent_count: count = 0 for char in list(line): if char != ' ': break count += 1 line = ' ' * (count / 2) + line.strip() f.write(line + '\n') try: root = etree.fromstring(response.content.decode('utf-8')) except etree.XMLSyntaxError: return except ValueError: try: root = etree.fromstring(response.content) except etree.XMLSyntaxError: return root = strip_xmlns(root) node = root.find('device') if node is None: services = [] devices = [] else: services = node.find('serviceList') if services is None: services = [] devices = node.find('deviceList') if devices is None: devices = [] for service in services: scpdurl = service.find('SCPDURL').text.replace(url, '') if '/' not in scpdurl and path and path not in scpdurl: scpdurl = path + '/' + scpdurl control_url = service.find('controlURL').text if control_url is None: if scpdurl.endswith('.xml'): control_url = scpdurl.rsplit('/', 1)[0] if control_url == scpdurl: control_url = '' else: control_url = scpdurl else: control_url = control_url.replace(url, '') if control_url.startswith('/'): control_url = control_url[1:] if scpdurl.startswith('/'): scpdurl = scpdurl[1:] service_id = service.find('serviceId').text service_type = service.find('serviceType').text service = Service(self, url, scpdurl, service_type, control_url, node, dump=dump) name = service_id.split(':')[-1] service.__name__ = name self._services[name] = service for device in devices: device = EmbeddedDevice(url, node=device, parent=self, dump=dump) self._devices[device.__name__] = device