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 | ||||
| 
 | ||||
| 
 | ||||
| @@ -7,11 +5,11 @@ class service: | ||||
|     url: str | ||||
|     status: Optional[int] | ||||
|     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.private = private | ||||
|         self.public = public | ||||
| 
 | ||||
|         self.online = False | ||||
|         self.status = None | ||||
| @@ -20,7 +18,7 @@ class service: | ||||
|         return { | ||||
|             "url": self.url, | ||||
|             "status": self.status, | ||||
|             "private": self.private, | ||||
|             "public": self.public, | ||||
|             "online": self.online, | ||||
|         } | ||||
| 
 | ||||
| @@ -31,18 +29,5 @@ class service: | ||||
| services: list[service] = [ | ||||
|     service("https://git.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