"""Scraping information about device from service web page.""" import functools import re import sys from urllib.error import URLError from urllib.request import urlopen def search_on_page(func): """Connect to web page and search needed info.""" @functools.wraps(func) # pylint: disable=inconsistent-return-statements # pylint: disable=protected-access def wrapper(self, *args, **kwargs): """Wrapper for universal searching info.""" if self._body: return func(self, *args, **kwargs) else: print("[+] Searching info on web page...") for r_url in self._root_urls: print("[+]\t try {}".format(r_url + self._page_url)) try: response = urlopen(r_url + self._page_url) if response.status != 200: continue self._body = response.read() if b"Service not available" in self._body: print("Please reboot router for access to hidden web page.") sys.exit(2) return func(self, *args, **kwargs) except URLError as err: print("[-] error: {}".format(err)) continue print("Error: getting info from web page.") sys.exit(2) return wrapper class WebInfo: """Class for getting info from engineering web page of Norton Core Router.""" def __init__(self): self._root_urls = ["http://norton.core", "http://172.16.0.1", "http://172.17.0.1"] self._page_url = "/info.php" self._body = None self.bt_mac = None self.serial_number = None @search_on_page def search_bt_mac(self): """ :return: Found BT MAC address on web page. """ if self.bt_mac: return self.bt_mac else: match = re.search(b"BT MAC Address:(?P[A-Z0-9:]+)\n", self._body) if not match: print("BT MAC Address not found, please check {} for details.".format( r_url + self._page_url)) # pylint: disable=undefined-variable sys.exit(2) self.bt_mac = match.group("BT_MAC").decode("utf-8") print("[+] BT MAC address was obtained.") return self.bt_mac @search_on_page def search_serial_number(self): """ :return: Found device serial number on web page. """ if self.serial_number: return self.serial_number else: match = re.search(b"Device Serial No:(?P\w+)\n", self._body) if not match: print("Device Serial Number not found, please check {} for details.".format( r_url + self._page_url)) # pylint: disable=undefined-variable sys.exit(2) self.serial_number = match.group("serial_number").decode("utf-8") print("[+] Device Serial Number was obtained.") return self.serial_number