def tasmota_req(**kwargs): querystring = kwargs['querystring'] try: response = requests.request("GET", url, headers=headers, params=querystring, timeout=config.so_timeout) if response.status_code == 200: if json.loads(response.text)['POWER'] == 'ON': _response = True elif json.loads(response.text)['POWER'] == 'OFF': _response = False else: _response = 'invalid state returned {}'.format( response.text) else: _response = '[{}] error returned {}'.format( response.status_code, response.text) except (requests.exceptions.Timeout, requests.exceptions.ConnectionError): _response = 'Unreachable' except requests.exceptions.RequestException as e: log.debug( f"[tasmota_req] {url.replace('http://', '').replace('https://', '').split('/')[0]} Exception: {e}" ) _response = 'Unreachable ~ hit catchall exception handler' # determine if other exceptions types are possible return _response
def esphome_req(*args, command=command): '''sub function to perform operation on outlet ''' try: method = "GET" if command is None else "POST" response = requests.request(method, url=url, headers=headers, timeout=config.so_timeout) if response.status_code == 200: if command is None: _response = response.json().get('value') else: # espHome returns status Code 200 with no content for /toggle if command in ['toggle', 'cycle']: _response = not cur_state else: _response = command # success return bool command else: _response = '[{}] error returned {}'.format( response.status_code, response.text) except (requests.exceptions.Timeout, requests.exceptions.ConnectionError): _response = 'Unreachable' except requests.exceptions.RequestException as e: log.debug( f"[esphome_req] {url.replace('http://', '').replace('https://', '').split('/')[0]} Exception: {e}" ) _response = 'Unreachable' # So I can determine if other exceptions types are possible when unreachable return _response
def get_adapters_via_api(self, ip: str, port: int = 5000, rename: bool = False, log_host: str = None): """Send RestFul GET request to Remote ConsolePi to collect adapter info params: ip(str): ip address or FQDN of remote ConsolePi rename(bool): TODO log_host(str): friendly string for logging purposes "hostname(ip)" returns: adapter dict for remote if successful and adapters exist status_code 200 if successful but no adapters or Falsey or response status_code if an error occurred. """ if not log_host: log_host = ip url = f"http://{ip}:{port}/api/v1.0/adapters" if rename: url = f"{url}?refresh=true" log.debug(url) headers = { "Accept": "*/*", "Cache-Control": "no-cache", "Host": f"{ip}:{port}", "accept-encoding": "gzip, deflate", "Connection": "keep-alive", "cache-control": "no-cache", } try: response = requests.request("GET", url, headers=headers, timeout=config.remote_timeout) except (OSError, TimeoutError): log.warning( f"[API RQST OUT] Remote ConsolePi: {log_host} TimeOut when querying via API - Unreachable." ) return False if response.ok: ret = response.json() ret = ret["adapters"] if ret["adapters"] else response.status_code _msg = f"Adapters Successfully retrieved via API for Remote ConsolePi: {log_host}" log.info("[API RQST OUT] {}".format(_msg)) log.debugv("[API RQST OUT] Response: \n{}".format( json.dumps(ret, indent=4, sort_keys=True))) else: ret = response.status_code log.error( f"[API RQST OUT] Failed to retrieve adapters via API for Remote ConsolePi: {log_host}\n{ret}:{response.text}" ) return ret
def get_adapters_via_api(self, ip: str, rename: bool = False): """Send RestFul GET request to Remote ConsolePi to collect adapter info params: ip(str): ip address or FQDN of remote ConsolePi returns: adapter dict for remote if successful Falsey or response status_code if an error occured. """ # log = self.config.log if rename: url = f"http://{ip}:5000/api/v1.0/adapters?refresh=true" else: url = f"http://{ip}:5000/api/v1.0/adapters" log.info(url) # DEBUG headers = { "Accept": "*/*", "Cache-Control": "no-cache", "Host": f"{ip}:5000", "accept-encoding": "gzip, deflate", "Connection": "keep-alive", "cache-control": "no-cache", } try: response = requests.request("GET", url, headers=headers, timeout=config.remote_timeout) except (OSError, TimeoutError): log.warning( "[API RQST OUT] Remote ConsolePi @ {} TimeOut when querying via API - Unreachable." .format(ip)) return False if response.ok: ret = response.json() ret = ret["adapters"] if ret["adapters"] else response.status_code _msg = "Adapters Successfully retrieved via API for Remote ConsolePi @ {}".format( ip) log.info("[API RQST OUT] {}".format(_msg)) log.debugv("[API RQST OUT] Response: \n{}".format( json.dumps(ret, indent=4, sort_keys=True))) else: ret = response.status_code log.error( "[API RQST OUT] Failed to retrieve adapters via API for Remote ConsolePi @ {}\n{}:{}" .format(ip, ret, response.text)) return ret
def do_api_request(self, ip: str, path: str, *args, **kwargs): """Send RestFul GET request to Remote ConsolePi to collect data params: ip(str): ip address or FQDN of remote ConsolePi path(str): path beyond /api/v1.0/ returns: response object """ url = f"http://{ip}:5000/api/v1.0/{path}" log.debug(f'[do_api_request] URL: {url}') headers = { "Accept": "*/*", "Cache-Control": "no-cache", "Host": f"{ip}:5000", "accept-encoding": "gzip, deflate", "Connection": "keep-alive", "cache-control": "no-cache", } try: response = requests.request("GET", url, headers=headers, timeout=config.remote_timeout) except (OSError, TimeoutError): log.warning( f"[API RQST OUT] Remote ConsolePi @ {ip} TimeOut when querying via API - Unreachable." ) return False if response.ok: log.info(f"[API RQST OUT] {url} Response: OK") log.debugv( f"[API RQST OUT] Response: \n{json.dumps(response.json(), indent=4, sort_keys=True)}" ) else: log.error(f"[API RQST OUT] API Request Failed {url}") return response
def esphome_req(*args, command: str = command): try: method = "GET" if command is None else "POST" response = requests.request(method, url=url if command is not None else status_url, headers=headers, timeout=3) if response.status_code == 200: if command is None: _response = response.json().get('value') else: if command in ['toggle', 'cycle']: _response = not cur_state else: _response = command # _response = requests.request("GET", status_url, # headers=headers, timeout=3).json().get('value') else: _response = '[{}] error returned {}'.format(response.status_code, response.text) except (requests.exceptions.Timeout, requests.exceptions.ConnectionError): _response = 'Unreachable' except requests.exceptions.RequestException as e: log.debug(f"[esphome_req] {url.replace('http://', '').replace('https://', '').split('/')[0]} Exception: {e}") _response = 'Unreachable' # So I can determine if other exceptions types are possible when unreachable return _response
if vendor is not None and 'ConsolePi' in vendor: log.info('ConsolePi Discovered via DHCP') url = 'http://{}:5000/api/v1.0/details'.format(ip) headers = { 'User-Agent': 'ConsolePi/version', 'Accept': '*/*', 'Cache-Control': 'no-cache', 'Host': '{}:5000'.format(ip), 'accept-encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'cache-control': 'no-cache' } try: response = requests.request("GET", url, headers=headers) log.info('[DHCP TRIGGER] Response from {}[{}]: \n{}'.format( ip, response.status_code, response.text)) except Exception: pass # TODO get/post info from/to ConsolePi that just connected via API # Update local cloud cache # oobm Discovery & ZTP trigger elif vendor is not None and iface is not None and iface == 'eth0': for _ in match: if _ in vendor: if utils.is_reachable(ip, 22): log.info('{} is reachable via ssh @ {}'.format(_, ip)) elif utils.is_reachable(ip, 23): log.info('{} is reachable via telnet @ {}'.format(_, ip))