def parse_connected_clients_list(html): lst = ConnectedClientsList() regex = re.compile("var x=new Array\((.+?)\);") match_object = regex.search(html) if match_object is None: raise RouterParseError("Cannot parse connected clients list") match_str = match_object.group(1) if match_str == '""': return lst import ast try: list_literal = "[%s]" % match_str list_items = ast.literal_eval(list_literal) list_items.pop() # empty 'sentinel' string - not needed list_items = [v.decode("utf-8", "ignore") if isinstance(v, bytes) else v for v in list_items] for ip, name, mac in split_in_groups(list_items, 3): item = ConnectedClientsListItem() item.set_client_name(name) item.set_mac(converter.normalize_mac(mac)) item.set_ip(ip) item.set_lease_time(item.__class__.LEASE_TIME_PERMANENT) lst.append(item) return lst except Exception: return lst
def _parse_connected_clients_list(html): lst = ConnectedClientsList() regex = re.compile('dhcpd_lease = \[ (.+?)\];\nlist = \[') match_object = regex.search(html) if match_object is None: return lst def parse_lease_time(lease): regex = '(\d+) days?, (\d+):(\d+):(\d+)' match_object = re.compile(regex).search(lease) if match_object is None: return ConnectedClientsListItem.LEASE_TIME_PERMANENT days, hours, minutes, seconds = map(int, match_object.groups()) return days * 86400 + hours * 3600 + minutes * 60 + seconds try: array = ast.literal_eval('[%s]' % match_object.group(1)) for name, ip, mac, lease_time in array: item = ConnectedClientsListItem() item.set_client_name(name) item.set_ip(ip) item.set_mac(converter.normalize_mac(mac)) item.set_lease_time(parse_lease_time(lease_time)) lst.append(item) return lst except ValueError: raise RouterParseError('Cannot parse connected clients!')
def parse_addr_reservation_list(html): """ Entries look like this: {status?}, {mac}, {ip_last_part}, {optional description} "1","00-11-11-11-11-11","52","", "1","00-11-11-11-11-11","52","R_user-cc5c756950", The status in front (0 or 1) is not important. It's 0 for all entries, when the list is empty, and 1 when there's at least one real entry. The IP prefix is always 192.168.1. The optional description only appears in entries not added manually, but automatically via a 'Reserve' checkbox in the connected clients list """ regex = re.compile('^"0|1","(.+?)","([0-9]+)","(?:.*?)",\n') reservation_list = DHCPReservationList() reservation_list.set_reboot_requirement_status(False) for mac, ip_last_part in regex.findall(html): if ip_last_part == "0": continue ip = "192.168.1.%s" % ip_last_part item = DHCPReservationListItem() item.set_mac(converter.normalize_mac(mac)) item.set_ip(ip) item.set_enabled_status(True) reservation_list.append(item) return reservation_list
def _parse_connected_clients_list(html): lst = ConnectedClientsList() regex = re.compile('dhcpd_lease = \[ (.+?)\];\nlist = \[') match_object = regex.search(html) if match_object is None: return lst def parse_lease_time(lease): regex = '(\d+) days?, (\d+):(\d+):(\d+)' match_object = re.compile(regex).search(lease) if match_object is None: return ConnectedClientsListItem.__class__.LEASE_TIME_PERMANENT days, hours, minutes, seconds = map(int, match_object.groups()) return days * 86400 + hours * 3600 + minutes * 60 + seconds try: array = ast.literal_eval('[%s]' % match_object.group(1)) for name, ip, mac, lease_time in array: item = ConnectedClientsListItem() item.set_client_name(name) item.set_ip(ip) item.set_mac(converter.normalize_mac(mac)) item.set_lease_time(parse_lease_time(lease_time)) lst.append(item) return lst except ValueError: raise RouterParseError('Cannot parse connected clients!')
def _parse_mac_address(html): regex = re.compile('<!--Wan Information-->(?:.+?)Physical Address(?:.+?)' '>((?:[a-f0-9]{2}:){5}[a-f0-9]{2})</font>', re.DOTALL) match_object = regex.search(html) if match_object is None: raise RouterParseError('Cannot determine MAC address!') return converter.normalize_mac(match_object.group(1))
def _parse_connected_clients_list(contents): regex = "<form(?:.+?)<tr(?:.+?)<tr bgcolor=(?:.+?)<font size=2>(.+?)</td><td><font size=2>(.+?)</td><td><font size=2>([0-9]+)</td>" regex_dhcp_list = re.compile(regex, re.DOTALL) lst = ConnectedClientsList() for id, match_groups in enumerate(re.findall(regex_dhcp_list, contents), start=1): ip, mac, lease_time = match_groups if not validator.is_valid_ip_address(ip): raise RouterParseError("Invalid IP address: %s" % ip) if not validator.is_valid_mac_address(mac): raise RouterParseError("Invalid MAC address: %s" % mac) lease_time = int(lease_time) item = ConnectedClientsListItem() item.set_client_name("Client %d" % id) item.set_mac(converter.normalize_mac(mac)) item.set_ip(ip) item.set_lease_time(lease_time) lst.append(item) return lst
def parse_addr_reservation_list(html): """ Entries look like this: {status?}, {mac}, {ip_last_part}, {optional description} "1","00-11-11-11-11-11","52","", "1","00-11-11-11-11-11","52","R_user-cc5c756950", The status in front (0 or 1) is not important. It's 0 for all entries, when the list is empty, and 1 when there's at least one real entry. The IP prefix is always 192.168.1. The optional description only appears in entries not added manually, but automatically via a 'Reserve' checkbox in the connected clients list """ regex = re.compile('^"0|1","(.+?)","([0-9]+)","(?:.*?)",\n') reservation_list = DHCPReservationList() reservation_list.set_reboot_requirement_status(False) for mac, ip_last_part in regex.findall(html): if ip_last_part == '0': continue ip = '192.168.1.%s' % ip_last_part item = DHCPReservationListItem() item.set_mac(converter.normalize_mac(mac)) item.set_ip(ip) item.set_enabled_status(True) reservation_list.append(item) return reservation_list
def parse_connected_clients_list(html): lst = ConnectedClientsList() regex = re.compile('var x=new Array\((.+?)\);') match_object = regex.search(html) if match_object is None: raise RouterParseError('Cannot parse connected clients list') match_str = match_object.group(1) if match_str == '""': return lst import ast try: list_literal = '[%s]' % match_str list_items = ast.literal_eval(list_literal) list_items.pop() # empty 'sentinel' string - not needed list_items = [ v.decode('utf-8', 'ignore') if isinstance(v, bytes) else v for v in list_items ] for ip, name, mac in split_in_groups(list_items, 3): item = ConnectedClientsListItem() item.set_client_name(name) item.set_mac(converter.normalize_mac(mac)) item.set_ip(ip) item.set_lease_time(item.__class__.LEASE_TIME_PERMANENT) lst.append(item) return lst except Exception: return lst
def _parse_mac_address(html): regex = re.compile('Internet Port(?:.+?)MAC Address </b></td>(?:.+?)>(.+?)</td>', re.DOTALL) match_object = regex.search(html) if match_object is None: raise RouterParseError('Cannot parse MAC address information') return converter.normalize_mac(match_object.group(1))
def _parse_mac_address(html): match_object = re.compile("dw\(MACAddress\)(?:.+?)table2(?:.+?)> (.+?)\s", re.DOTALL).search(html) if match_object is None: raise RouterParseError('Cannot determine mac address') mac = match_object.group(1).strip(" ") if not validator.is_valid_mac_address(mac): raise RouterParseError('Found an invalid MAC address: %s' % mac) return converter.normalize_mac(mac)
def _parse_addr_reservations(html): regex = re.compile('name="smac[0-9]+" value="(.+?)"(?:.+?)name="sip[0-9]+" value="(.+?)">', re.DOTALL) reservation_list = DHCPReservationList() reservation_list.set_reboot_requirement_status(False) for mac, ip in regex.findall(html): item = DHCPReservationListItem() item.set_mac(converter.normalize_mac(mac)) item.set_ip(ip) item.set_enabled_status(True) reservation_list.append(item) return reservation_list
def _parse_mac_address(contents): regex = "bssid_drv\[0\] ='((?:(?:[a-f0-9]{2}:){5})(?:[a-f0-9]{2}))';" regex_mac_address = re.compile(regex, re.DOTALL) match_object = regex_mac_address.search(contents) if match_object is None: raise RouterParseError("Cannot _parse mac address from contents") mac = match_object.group(1).strip(" ") if not validator.is_valid_mac_address(mac): raise RouterParseError("Found an invalid MAC address: %s" % mac) return converter.normalize_mac(mac)
def _parse_connected_clients_list(html): lst = ConnectedClientsList() regex = re.compile('<tr bgcolor=#(?:.+?)><td><font size=2>(.+?)</td>' '<td><font size=2>(.+?)</td>' '<td><font size=2>([0-9]+)</td></tr>') for i, (ip, mac, time) in enumerate(regex.findall(html)): item = ConnectedClientsListItem() item.set_client_name('Client %d' % (i + 1)) item.set_ip(ip) item.set_mac(converter.normalize_mac(mac)) item.set_lease_time(int(time)) lst.append(item) return lst
def _parse_addr_reservation_list(html): reservations = re.compile('var StaticList = new Array\((.*)\);').search(html) if reservations is None: raise RouterParseError('Cannot find reservations list.') reservations_list = reservations.group(1) results = re.compile(';(.+?);(.+?);([12]);(\d+)').findall(reservations_list) reservation_list = DHCPReservationList() reservation_list.set_reboot_requirement_status(False) for ip, mac, mac_bind, _time in results: item = DHCPReservationListItem() item.set_mac(converter.normalize_mac(mac)) item.set_ip(ip) item.set_enabled_status(mac_bind == '1') reservation_list.append(item) return reservation_list
def _parse_addr_reservation_list(contents): array_name = 'dhcpList' result = _extract_js_array_data(contents, array_name) result = result[:-2] # the last 2 elements are not needed # each 3 subsequent items are related (mac_address, ip, is_enabled) list_raw = split_in_groups(result, 3) reservation_list = DHCPReservationList() for mac, ip, is_enabled in list_raw: item = DHCPReservationListItem() item.set_mac(converter.normalize_mac(mac)) item.set_ip(ip) item.set_enabled_status(is_enabled == 1) reservation_list.append(item) return reservation_list
def _parse_connected_clients_list(html): lst = ConnectedClientsList() regex = "<tr>(?:.+?)<span class=\"ttext\">(.+?)</span>(?:.+?)<span class=\"ttext\">(.+?)</span>(?:.+?)<span class=\"ttext\">(.+?)</span>(?:.+?)</tr>" for ip, name, mac in re.compile(regex, re.DOTALL).findall(html): if ip == '--': # I've seen such entries on WGR614v7 only.. let's ignore them continue if not validator.is_valid_ip_address(ip): raise RouterParseError('Invalid IP address: %s' % ip) item = ConnectedClientsListItem() item.set_client_name(name) item.set_mac(converter.normalize_mac(mac)) item.set_ip(ip) item.set_lease_time(None) # no lease time information available lst.append(item) return lst
def _parse_connected_clients_list(html): dhcp_list = re.compile('var dhcpList=new Array\((.*)\);').search(html) if dhcp_list is None: raise RouterParseError('Cannot find DHCP list.') dhcp_list = dhcp_list.group(1) results = re.compile("'(.+?);(.+?);(.+?);[01];(\d+)'").findall(dhcp_list) lst = ConnectedClientsList() for client_name, ip, mac, lease_time in results: if not validator.is_valid_ip_address(ip): raise RouterParseError('Invalid IP address: %s' % ip) if not validator.is_valid_mac_address(mac): raise RouterParseError('Invalid MAC address: %s' % mac) item = ConnectedClientsListItem() item.set_client_name(client_name) item.set_mac(converter.normalize_mac(mac)) item.set_ip(ip) item.set_lease_time(int(lease_time)) lst.append(item) return lst
def _parse_connected_clients_list(html): # the last 2 elements of the data array are not needed result = _extract_js_array_data(html, 'DHCPDynList')[:-2] lst = ConnectedClientsList() # each 4 subsequent items are related (client_name, mac_address, ip, lease_time) for client_name, mac, ip, lease_time in split_in_groups(result, 4): if not validator.is_valid_ip_address(ip): raise RouterParseError('Invalid IP address: %s' % ip) item = ConnectedClientsListItem() item.set_client_name(client_name) item.set_mac(converter.normalize_mac(mac)) item.set_ip(ip) if lease_time == 'Permanent': item.set_lease_time(item.__class__.LEASE_TIME_PERMANENT) else: item.set_lease_time(_parse_lease_time(lease_time)) lst.append(item) return lst
def _parse_connected_clients_list(html): regex_dhcp_list = "<tr class=table2 align=center><td><font size=2>(.+?)</td><td><font size=2>(.+?)</td>" lst = ConnectedClientsList() for id, (ip, mac) in enumerate(re.findall(regex_dhcp_list, html), start=1): if ip == "None": # this entry is added when there are no connected clients break if not validator.is_valid_ip_address(ip): raise RouterParseError('Invalid IP address: %s' % ip) if not validator.is_valid_mac_address(mac): raise RouterParseError('Invalid MAC address: %s' % mac) item = ConnectedClientsListItem() item.set_client_name('Client %d' % id) item.set_mac(converter.normalize_mac(mac)) item.set_ip(ip) item.set_lease_time(0) lst.append(item) return lst
def parse_mac_address(html): regex = re.compile('NAME=_En VALUE="(.+?)"') match_object = regex.search(html) if match_object is None: raise RouterParseError("Cannot parse mac address") return converter.normalize_mac(match_object.group(1))
def parse_mac_address(html): regex = re.compile('NAME=_En VALUE="(.+?)"') match_object = regex.search(html) if match_object is None: raise RouterParseError('Cannot parse mac address') return converter.normalize_mac(match_object.group(1))
def _parse_mac_address(status_js): nvram = _parse_js_structure(status_js, 'nvram') try: return converter.normalize_mac(nvram['wan_hwaddr']) except KeyError: raise RouterParseError('Cannot parse MAC address!')
def set_mac(self, value): self._mac_address = converter.normalize_mac(value)
def _parse_mac_address(html): match_obj = re.compile('wan_mac="(.+?)";').search(html) if match_obj is None: raise RouterParseError('Cannot determine WAN mac address') return converter.normalize_mac(match_obj.group(1))
def _parse_mac_address(data_array): try: return converter.normalize_mac(data_array[1]) except IndexError, e: raise RouterParseError('Cannot access the array index: %s' % repr(e))
def _parse_mac_address(data_array): try: return converter.normalize_mac(data_array[1]) except IndexError as e: raise RouterParseError('Cannot access the array index: %s' % repr(e))