Add HTTPServer and PingableSystem to dashboad.system and add an example.

This commit is contained in:
ChaoticByte 2025-02-23 20:57:42 +01:00
parent cff7851a73
commit a8c8dca4aa
No known key found for this signature in database
2 changed files with 57 additions and 2 deletions

View file

@ -1,7 +1,14 @@
# Copyright (c) 2025, Julian Müller (ChaoticByte)
# additional libraries
import platform
import requests
import subprocess
from enum import Enum
from typing import Tuple
# base classes and types and stuff
@ -28,3 +35,51 @@ class System:
# to be overridden
self.state = SystemState.UNKNOWN
self.state_verbose = ""
# some basic systems
class PingableSystem(System):
def __init__(self, name, description, host: str):
super().__init__(name, description)
self.host = host
def ping(self) -> Tuple[bool, str, str]:
if platform.system().lower() == "windows": p = "-n"
else: p = "-c"
s = subprocess.run(["ping", p, '1', self.host], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return s.returncode == 0, s.stdout.decode(), s.stderr.decode()
def update_state(self):
self.state = SystemState.UNKNOWN
ok, stdout, stderr = self.ping()
if ok:
self.state = SystemState.OK
self.state_verbose = stdout
else:
self.state = SystemState.FAILED
self.state_verbose = stdout + "\n" + stderr
class HTTPServer(System):
def __init__(self, name, description, url: str, expected_status_code: int = 200, allow_self_signed_cert: bool = False):
super().__init__(name, description)
self.url = url
self.expected_status = expected_status_code
self.allow_self_signed_cert = allow_self_signed_cert
def update_state(self):
self.state = SystemState.UNKNOWN
try:
r = requests.head(self.url, timeout=1.0, verify=not self.allow_self_signed_cert)
if r.status_code == 200:
self.state = SystemState.OK
else:
self.state = SystemState.FAILED
self.state_verbose = f"Status {r.status_code} {r.url}"
except requests.ConnectionError as e:
self.state = SystemState.FAILED
self.state_verbose = f"Exception: {str(e)}"