diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/capture/disable_guest_wifi b/capture/disable_guest_wifi new file mode 100644 index 0000000..e69de29 diff --git a/capture/enable_guest_wifi.request b/capture/enable_guest_wifi.request new file mode 100644 index 0000000..991da2c --- /dev/null +++ b/capture/enable_guest_wifi.request @@ -0,0 +1,45 @@ +POST /soap/server_sa/ HTTP/1.0 +SOAPAction: urn:NETGEAR-ROUTER:service:WLANConfiguration:1#SetGuestAccessEnabled2 +content-type: text/xml;charset=utf-8 +HOST: www.routerlogin.com +User-Agent: SOAP Toolkit 3.0 +connection: keep-Alive +Cache-Control: no-cache +Pragma: no-cache +Cookie: sess_id=595c7d4dbd5cd58a94352588a87c6c3295464a3e7ac5262592e08799820c3e01830a65a0e60a540d47582e1850a861e25b003af85315d2ab8a0104ee2cdab661; SameSite=Strict +content-length: 752 + + + +session_ID + + + +1 +GUEST_SSID_key +0 +0 +0 +GUEST_SSID +WPA2-PSK + + + +HTTP/1.1 200 OK +CONTENT-LENGTH:460 +CONTENT-TYPE: text/xml; charset="UTF-8" +SERVER: "OS/version" UPnP/1.0 "product/version" + + + + + + + 000 + + diff --git a/pynetgear/__init__.py b/pynetgear/__init__.py index c8fd287..90cc151 100644 --- a/pynetgear/__init__.py +++ b/pynetgear/__init__.py @@ -161,6 +161,67 @@ def tofloats(lst): return (float(t) for t in lst) trafficdict = {t.tag: parse_text(t.text) for t in data} return trafficdict + def set_guest_wifi_enable(self,SSID,SSID_KEY): + """ + Turn on Guest WIFI + + Returns None if error occurred. + """ + _LOGGER.info("Enable Guest Wifi") + + def parse_response(response): + try: + result = re.search(REGEX_ENABLE_GUEST_WIFI, response).group(1) + except (AttributeError): + _LOGGER.error("Error parsing respone: %s", response) + return False, None + else: + return True, result + # Right now key should be 16 characters are less, key is broken down into key1,key2..key4 + # So the assumption is you have breack it down into 16 byte chunks + success, response = self._make_request( + ACTION_ENABLE_GUEST_WIFI, + SOAP_ENABLE_GUEST_WIFI.format(session_id=SESSION_ID,ssid=SSID,ssid_key=SSID_KEY)) + + if not success: + return None + + parsable, raw = parse_response(response) + + if not parsable: + return None + return success, response + + def set_guest_wifi_disable(self): + """ + Turn off Guest WIFI + + Returns None if error occurred. + """ + _LOGGER.info("Disable Guest Wifi") + + def parse_response(response): + try: + result = re.search(REGEX_ENABLE_GUEST_WIFI, response).group(1) + except (AttributeError): + _LOGGER.error("Error parsing respone: %s", response) + return False, None + else: + return True, result + + success, response = self._make_request( + ACTION_DISABLE_GUEST_WIFI, + SOAP_DISABLE_GUEST_WIFI.format(session_id=SESSION_ID)) + + if not success: + return None + + parsable, raw = parse_response(response) + + if not parsable: + return None + return success, response + def _make_request(self, action, message, try_login_after_failure=True): """Make an API request to the router.""" # If we are not logged in, the request will fail for sure. @@ -217,9 +278,15 @@ def convert(value, to_type, default=None): "urn:NETGEAR-ROUTER:service:DeviceInfo:1#GetAttachDevice" ACTION_GET_TRAFFIC_METER = \ "urn:NETGEAR-ROUTER:service:DeviceConfig:1#GetTrafficMeterStatistics" +ACTION_ENABLE_GUEST_WIFI = \ + "SOAPAction: urn:NETGEAR-ROUTER:service:WLANConfiguration:1#SetGuestAccessEnabled2" +ACTION_DISABLE_GUEST_WIFI = \ + "urn:NETGEAR-ROUTER:service:WLANConfiguration:1#SetGuestAccessEnabled" REGEX_ATTACHED_DEVICES = r"(.*)" +REGEX_ENABLE_GUEST_WIFI =r".*(WLANConfiguration:1).*" + # Until we know how to generate it, give the one we captured SESSION_ID = "A7D88AE69687E58D9A00" @@ -268,5 +335,41 @@ def convert(value, to_type, default=None): """ +SOAP_ENABLE_GUEST_WIFI = """ + + + {session_id} + + + + 1 + {ssid_key} + 0 + 0 + 0 + {ssid} + WPA2-PSK + + + + """ + +SOAP_DISABLE_GUEST_WIFI = """ + + {session_id} + + + 0 + + + """ + + UNKNOWN_DEVICE_DECODED = '' UNKNOWN_DEVICE_ENCODED = '<unknown>'