from flask import Flask, render_template, jsonify import requests from concurrent.futures import ThreadPoolExecutor import socket import subprocess import platform app = Flask(__name__) def check_status(site): url = site['url'] if url.startswith('http'): return check_http_status(site) elif ':22' in url: return check_ssh_status(site) else: return check_ping_status(site) def check_http_status(site): try: response = requests.get(site['url'], timeout=5) return {'url': site['url'], 'title': site['title'], 'status': response.status_code == 200} except: return {'url': site['url'], 'title': site['title'], 'status': False} def check_ssh_status(site): host = site['url'].split(':')[0] try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(2) result = sock.connect_ex((host, 22)) status = result == 0 sock.close() return {'url': site['url'], 'title': site['title'], 'status': status} except: return {'url': site['url'], 'title': site['title'], 'status': False} def check_ping_status(site): host = site['url'].split(':')[0] param = '-n' if platform.system().lower() == 'windows' else '-c' command = ['ping', param, '1', host] try: output = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) status = output.returncode == 0 return {'url': site['url'], 'title': site['title'], 'status': status} except Exception as e: return {'url': site['url'], 'title': site['title'], 'status': False} #Add your URL´s here. #For SSH-URL´s please don´t add the http:// and check the Port the SSH Server is running on #For Normal URL´s please use http:// and the Port the Website runs on websites = [ {'url': '1.1.1.1', 'title': 'WAN'}, {'url': '192.168.3.11:22', 'title': 'PVE Main'}, {'url': '192.168.3.12:22', 'title': 'PVE Small'}, {'url': 'http://192.168.3.10:80', 'title': 'WLED'}, {'url': 'http://192.168.2.6:8123', 'title': 'HomeAssistant'}, {'url': 'http://192.168.2.3:9999', 'title': 'Stash'}, {'url': 'http://192.168.2.4:3000', 'title': 'GitTea'}, {'url': 'http://192.168.2.8:81', 'title': 'Proxymanager'}, {'url': '192.168.3.14:22', 'title': 'Docker'}, {'url': 'http://192.168.3.17:5000', 'title': 'FoxNAS'}, {'url': '192.168.3.20:22', 'title': 'BackupNAS'}, {'url': 'http://192.168.3.21:8080', 'title': 'AMP'}, {'url': '192.168.100.16:22', 'title': 'VPN Tunnel'}, {'url': '192.168.3.30:22', 'title': 'Nextcloud'}, ] # Add the second Row of URL´s in the same Sceme websites2 = [ {'url': '192.168.100.65', 'title': 'MacBook'}, {'url': '192.168.100.68', 'title': 'Desktop'}, {'url': '192.168.100.80', 'title': 'iPhone'}, {'url': '192.168.100.84', 'title': 'iPad'}, {'url': '192.168.100.2', 'title': 'MacBookPro 2017'}, ] @app.route('/') def status_page(): return render_template('status.html', websites=websites, websites2=websites2) @app.route('/update_status') def update_status(): with ThreadPoolExecutor(max_workers=10) as executor: results1 = list(executor.map(check_status, websites)) results2 = list(executor.map(check_status, websites2)) # Combine results from both lists combined_results = results1 + results2 return jsonify(combined_results) if __name__ == '__main__': app.run(debug=True)