Initial Commit
This commit is contained in:
@@ -0,0 +1,144 @@
|
||||
"""TrueNAS API."""
|
||||
|
||||
from logging import getLogger
|
||||
from threading import Lock
|
||||
from typing import Any
|
||||
|
||||
from requests import get as requests_get, post as requests_post
|
||||
from voluptuous import Optional
|
||||
from urllib3 import disable_warnings
|
||||
from urllib3.exceptions import InsecureRequestWarning
|
||||
|
||||
from homeassistant.core import HomeAssistant
|
||||
|
||||
_LOGGER = getLogger(__name__)
|
||||
disable_warnings(InsecureRequestWarning)
|
||||
|
||||
|
||||
# ---------------------------
|
||||
# TrueNASAPI
|
||||
# ---------------------------
|
||||
class TrueNASAPI(object):
|
||||
"""Handle all communication with TrueNAS."""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
hass: HomeAssistant,
|
||||
host: str,
|
||||
api_key: str,
|
||||
use_ssl: bool = False,
|
||||
verify_ssl: bool = True,
|
||||
) -> None:
|
||||
"""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) -> tuple:
|
||||
"""Test connection."""
|
||||
self.query("pool")
|
||||
|
||||
return self._connected, self._error
|
||||
|
||||
# ---------------------------
|
||||
# query
|
||||
# ---------------------------
|
||||
def query(
|
||||
self, service: str, method: str = "get", params: dict[str, Any] | None = {}
|
||||
) -> 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,
|
||||
timeout=10,
|
||||
)
|
||||
|
||||
elif method == "post":
|
||||
response = requests_post(
|
||||
f"{self._url}{service}",
|
||||
headers=headers,
|
||||
json=params,
|
||||
verify=self._ssl_verify,
|
||||
timeout=10,
|
||||
)
|
||||
|
||||
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"
|
||||
and service != "reporting/netdata_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 error."""
|
||||
return self._error
|
||||
Reference in New Issue
Block a user