diff --git a/dashmachine/platform/http_status.py b/dashmachine/platform/http_status.py new file mode 100644 index 0000000..a74741f --- /dev/null +++ b/dashmachine/platform/http_status.py @@ -0,0 +1,94 @@ +""" + +##### http_status +Make a http call on a given URL and display if the service is online. +```ini +[variable_name] +platform = http_status +resource = https://your-website.com/api +method = get +authentication = basic +username = my_username +password = my_password +headers = {"Content-Type": "application/json"} +return_codes = 2xx,3xx +``` +> **Returns:** a right-aligned colored bullet point on the app card. + +| Variable | Required | Description | Options | +|-----------------|----------|-----------------------------------------------------------------|-------------------| +| [variable_name] | Yes | Name for the data source. | [variable_name] | +| platform | Yes | Name of the platform. | rest | +| resource | Yes | Url of rest api resource. | url | +| method | No | Method for the api call, default is GET | GET,HEAD,OPTIONS,TRACE| +| authentication | No | Authentication for the api call, default is None | None,basic,digest | +| username | No | Username to use for auth. | string | +| password | No | Password to use for auth. | string | +| headers | No | Request headers | json | +| return_codes | No | Acceptable http status codes, x is handled as wildcard | string | + +> **Working example:** +>```ini +>[http_status_test] +>platform = http_status +>resource = https://google.com +>return_codes = 2xx,3xx +> +>[Google] +>prefix = https:// +>url = google.com +>icon = static/images/apps/default.png +>open_in = this_tab +>data_sources = http_status_test +>``` + +""" + +from requests import Request, Session +from requests.auth import HTTPBasicAuth, HTTPDigestAuth + + +class Platform: + def __init__(self, *args, **kwargs): + # parse the user's options from the config entries + for key, value in kwargs.items(): + self.__dict__[key] = value + + # set defaults for omitted options + if not hasattr(self, "method"): + self.method = "GET" + if not hasattr(self, "authentication"): + self.authentication = None + if not hasattr(self, "headers"): + self.headers = None + if not hasattr(self, "return_codes"): + self.return_codes = "2xx,3xx" + + def process(self): + # Check if method is within allowed methods for http_status + if self.method.upper() not in ["GET", "HEAD", "OPTIONS", "TRACE"]: + raise NotImplementedError + + s = Session() + # prepare Authentication mechanism + if self.authentication: + if self.authentication.lower() == "digest": + auth = HTTPDigestAuth(self.username, self.password) + else: + auth = HTTPBasicAuth(self.username, self.password) + else: + auth = None + + # Send request + req = Request(self.method.upper(), self.resource, headers=self.headers, auth=auth) + prepped = req.prepare() + resp = s.send(prepped) + + return_codes = tuple([x.replace('x', '') for x in self.return_codes.split(',')]) + + if str(resp.status_code).startswith(return_codes): + icon_class = "theme-success-text" + else: + icon_class = "theme-failure-text" + + return f"fiber_manual_record " diff --git a/dashmachine/platform/rest.py b/dashmachine/platform/rest.py index b8b914a..77fd143 100644 --- a/dashmachine/platform/rest.py +++ b/dashmachine/platform/rest.py @@ -12,6 +12,8 @@ authentication = basic username = my_username password = my_password payload = {"var1": "hi", "var2": 1} +headers = {"Content-Type": "application/json"} +verify = false ``` > **Returns:** `value_template` as rendered string @@ -26,6 +28,8 @@ payload = {"var1": "hi", "var2": 1} | username | No | Username to use for auth. | string | | password | No | Password to use for auth. | string | | payload | No | Payload for post request. | json | +| headers | No | Custom headers for get or post | json | +| verify | No | Turn TLS verification on or off, default is True | true,false | > **Working example:** >```ini @@ -62,6 +66,10 @@ class Platform: self.method = "GET" if not hasattr(self, "authentication"): self.authentication = None + if not hasattr(self, "headers"): + self.headers = None + if not hasattr(self, "verify"): + self.verify = True def process(self): if self.authentication: @@ -72,14 +80,16 @@ class Platform: else: auth = None + verify = False if str(self.verify).lower() == "false" else True + if self.method.upper() == "GET": try: - value = get(self.resource, auth=auth).json() + value = get(self.resource, auth=auth, headers=self.headers, verify=verify).json() except Exception as e: value = f"{e}" elif self.method.upper() == "POST": payload = json.loads(self.payload.replace("'", '"')) - value = post(self.resource, data=payload, auth=auth) + value = post(self.resource, data=payload, auth=auth, headers=self.headers, verify=verify) value_template = render_template_string(self.value_template, value=value) return value_template