Esempio n. 1
0
 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
Esempio n. 2
0
 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
Esempio n. 3
0
    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
Esempio n. 4
0
    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
Esempio n. 5
0
    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
Esempio n. 6
0
 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
Esempio n. 7
0
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))