from flask import Flask, send_file, redirect, render_template import threading import requests import logging import time import toml config = toml.load('config.toml') app = Flask('velping') logging.disable(logging.CRITICAL) uptime = {} def ping(service): while True: print(f'[I] Pinging {service}') try: resp = requests.get(config['services'][service]) resp.raise_for_status() if uptime[service][config['frontend']['pings'] - 1] != 'I' and config['ntfy']['enabled']: requests.post(f'https://{config['ntfy']['server']}/{config['ntfy']['topic']}', data=f'Service {service} is online') uptime[service].pop(0) uptime[service].append('I') print(f'[I] Pinging {service} worked!') except Exception as e: if 'Remote end closed connection without response' in str(e) and config['pinging']['allow_empty_responses']: uptime[service].pop(0) uptime[service].append('I') print(f'[I] Pinging {service} worked!') else: if uptime[service][config['frontend']['pings'] - 1] != 'O' and config['ntfy']['enabled']: requests.post(f'https://{config['ntfy']['server']}/{config['ntfy']['topic']}', data=f'Service {service} is offline') uptime[service].pop(0) uptime[service].append('O') print(f'[E] An error happened while pinging for {service}: {e}') time.sleep(config['pinging']['seconds_between_ping']) for service in config['services']: uptime[service] = [] for ping_but_different in range(config['frontend']['pings']): uptime[service].append('?') threading.Thread(target=ping, args=(service,)).start() @app.errorhandler(404) def not_found(error): return redirect('/', 303) @app.errorhandler(500) def internal_error(error): return render_template('internal_error.xht', config=config), 500 @app.route('/style.css') def css(): return send_file('assets/style.css') @app.route('/') def root(): return render_template('index.xht', config=config, services=config['services'], uptime=uptime), 200 app.run(port=config['frontend']['port'], host='::')