mirror of
https://github.com/StefBuwalda/dashboard_test.git
synced 2025-10-30 11:19:58 +00:00
Split up the updating of service status and serving requests into two threads.
This commit is contained in:
22
main.py
Normal file
22
main.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# import requests as r
|
||||||
|
from flask import jsonify, Flask
|
||||||
|
from poll_services import update_services
|
||||||
|
from mem import services
|
||||||
|
import threading
|
||||||
|
|
||||||
|
|
||||||
|
# Flask app to serve status
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def status():
|
||||||
|
return jsonify([s.to_dict() for s in services])
|
||||||
|
|
||||||
|
|
||||||
|
# Only run if directly running file
|
||||||
|
if __name__ == "__main__":
|
||||||
|
threading.Thread(target=update_services, daemon=True).start()
|
||||||
|
|
||||||
|
# Run flask app
|
||||||
|
app.run(debug=True, use_reloader=False)
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
# import requests as r
|
|
||||||
from flask import jsonify, Flask
|
|
||||||
from typing import Any, Optional
|
from typing import Any, Optional
|
||||||
|
|
||||||
|
|
||||||
@@ -7,11 +5,11 @@ class service:
|
|||||||
url: str
|
url: str
|
||||||
status: Optional[int]
|
status: Optional[int]
|
||||||
online: bool
|
online: bool
|
||||||
private: bool
|
public: bool
|
||||||
|
|
||||||
def __init__(self, url: str = "", private: bool = False):
|
def __init__(self, url: str = "", public: bool = True):
|
||||||
self.url = url
|
self.url = url
|
||||||
self.private = private
|
self.public = public
|
||||||
|
|
||||||
self.online = False
|
self.online = False
|
||||||
self.status = None
|
self.status = None
|
||||||
@@ -20,7 +18,7 @@ class service:
|
|||||||
return {
|
return {
|
||||||
"url": self.url,
|
"url": self.url,
|
||||||
"status": self.status,
|
"status": self.status,
|
||||||
"private": self.private,
|
"public": self.public,
|
||||||
"online": self.online,
|
"online": self.online,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,18 +29,5 @@ class service:
|
|||||||
services: list[service] = [
|
services: list[service] = [
|
||||||
service("https://git.ihatemen.uk"),
|
service("https://git.ihatemen.uk"),
|
||||||
service("https://plex.ihatemen.uk"),
|
service("https://plex.ihatemen.uk"),
|
||||||
service("https://truenas.local", True),
|
service("https://truenas.local", False),
|
||||||
]
|
]
|
||||||
|
|
||||||
# Flask app to serve status
|
|
||||||
app = Flask(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
@app.route("/")
|
|
||||||
def status():
|
|
||||||
return jsonify([s.to_dict() for s in services])
|
|
||||||
|
|
||||||
|
|
||||||
# Only run if directly running file
|
|
||||||
if __name__ == "__main__":
|
|
||||||
app.run(debug=True)
|
|
||||||
24
poll_services.py
Normal file
24
poll_services.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
from mem import services
|
||||||
|
import requests
|
||||||
|
import urllib3
|
||||||
|
import time
|
||||||
|
|
||||||
|
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||||
|
|
||||||
|
|
||||||
|
def update_services() -> None:
|
||||||
|
print("Updating Service Status")
|
||||||
|
while True:
|
||||||
|
for s in services:
|
||||||
|
try:
|
||||||
|
r = requests.head(
|
||||||
|
url=s.url,
|
||||||
|
verify=s.public,
|
||||||
|
allow_redirects=True,
|
||||||
|
timeout=1,
|
||||||
|
)
|
||||||
|
s.set_status(r.ok)
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
print(e)
|
||||||
|
s.set_status(False)
|
||||||
|
time.sleep(3)
|
||||||
76
test.py
76
test.py
@@ -1,76 +0,0 @@
|
|||||||
import time
|
|
||||||
import requests
|
|
||||||
import traceback
|
|
||||||
import urllib3
|
|
||||||
from urllib.parse import urlparse
|
|
||||||
from flask import Flask, jsonify
|
|
||||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
||||||
from typing import Any
|
|
||||||
|
|
||||||
# Start background checker
|
|
||||||
import threading
|
|
||||||
|
|
||||||
# Disable warnings for self-signed certificates
|
|
||||||
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
||||||
|
|
||||||
services = [
|
|
||||||
"https://truenas.local/",
|
|
||||||
"https://example.com/",
|
|
||||||
"https://git.ihatemen.uk/",
|
|
||||||
]
|
|
||||||
|
|
||||||
services_status = {}
|
|
||||||
|
|
||||||
|
|
||||||
# Determine SSL verification based on hostname
|
|
||||||
def should_verify_ssl(url: str):
|
|
||||||
hostname = urlparse(url).hostname
|
|
||||||
return not (hostname and hostname.endswith(".local"))
|
|
||||||
|
|
||||||
|
|
||||||
# Function to check a single service
|
|
||||||
def check_service(url: str) -> tuple[str, dict[str, Any]]:
|
|
||||||
try:
|
|
||||||
start = time.time()
|
|
||||||
r = requests.head(
|
|
||||||
url, allow_redirects=True, timeout=5, verify=should_verify_ssl(url)
|
|
||||||
)
|
|
||||||
latency = int((time.time() - start) * 1000)
|
|
||||||
return url, {
|
|
||||||
"status": "up" if r.ok else "down",
|
|
||||||
"latency": latency,
|
|
||||||
"error": None,
|
|
||||||
}
|
|
||||||
except requests.exceptions.RequestException as e:
|
|
||||||
return url, {
|
|
||||||
"status": "down",
|
|
||||||
"latency": None,
|
|
||||||
"error": str(e),
|
|
||||||
"trace": traceback.format_exc(),
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# Background thread that checks all services in parallel
|
|
||||||
def check_services_periodically(interval: int = 5):
|
|
||||||
while True:
|
|
||||||
with ThreadPoolExecutor(max_workers=len(services)) as executor:
|
|
||||||
futures = [executor.submit(check_service, url) for url in services]
|
|
||||||
for future in as_completed(futures):
|
|
||||||
url, result = future.result()
|
|
||||||
services_status[url] = result
|
|
||||||
time.sleep(interval)
|
|
||||||
|
|
||||||
|
|
||||||
threading.Thread(target=check_services_periodically, daemon=True).start()
|
|
||||||
|
|
||||||
# Flask app to serve status
|
|
||||||
app = Flask(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
@app.route("/status")
|
|
||||||
def status():
|
|
||||||
return jsonify(services_status)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
app.run(debug=True)
|
|
||||||
Reference in New Issue
Block a user