Files
hassos_config/custom_components/truenas/truenas_api.py
2022-12-20 21:26:47 +01:00

122 lines
3.3 KiB
Python

"""TrueNAS API"""
from requests import get as requests_get, post as requests_post
from logging import getLogger
from threading import Lock
from voluptuous import Optional
_LOGGER = getLogger(__name__)
# ---------------------------
# TrueNASAPI
# ---------------------------
class TrueNASAPI(object):
"""Handle all communication with TrueNAS"""
def __init__(self, hass, host, api_key, use_ssl=False, verify_ssl=True):
"""Initialize the TrueNAS API"""
self._hass = hass
self._host = host
self._use_ssl = use_ssl
self._api_key = api_key
self._protocol = "https" if self._use_ssl else "http"
self._ssl_verify = verify_ssl
if not self._use_ssl:
self._ssl_verify = True
self._url = f"{self._protocol}://{self._host}/api/v2.0/"
self.lock = Lock()
self._connected = False
self._error = ""
# ---------------------------
# connected
# ---------------------------
def connected(self) -> bool:
"""Return connected boolean"""
return self._connected
# ---------------------------
# connection_test
# ---------------------------
def connection_test(self):
"""TrueNAS connection test"""
self.query("pool")
return self._connected, self._error
# ---------------------------
# query
# ---------------------------
def query(self, service, method="get", params={}) -> Optional(list):
"""Retrieve data from TrueNAS"""
self.lock.acquire()
error = False
try:
_LOGGER.debug(
"TrueNAS %s query: %s, %s, %s",
self._host,
service,
method,
params,
)
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {self._api_key}",
}
if method == "get":
response = requests_get(
f"{self._url}{service}",
headers=headers,
params=params,
verify=self._ssl_verify,
)
elif method == "post":
response = requests_post(
f"{self._url}{service}",
headers=headers,
json=params,
verify=self._ssl_verify,
)
if response.status_code == 200:
data = response.json()
_LOGGER.debug("TrueNAS %s query response: %s", self._host, data)
else:
error = True
except Exception:
error = True
if error:
try:
errorcode = response.status_code
except Exception:
errorcode = "no_response"
_LOGGER.warning(
'TrueNAS %s unable to fetch data "%s" (%s)',
self._host,
service,
errorcode,
)
if errorcode != 500 and service != "reporting/get_data":
self._connected = False
self._error = errorcode
self.lock.release()
return None
self._connected = True
self._error = ""
self.lock.release()
return data
@property
def error(self):
return self._error