From 993d5426106f8922315b8bbb98cbabe9c7f1e377 Mon Sep 17 00:00:00 2001 From: Bla Date: Thu, 26 Oct 2023 13:57:20 +0000 Subject: [PATCH] Watchdog added, managing multiple browser instances --- server-web.py | 105 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 86 insertions(+), 19 deletions(-) diff --git a/server-web.py b/server-web.py index c410896..db96478 100644 --- a/server-web.py +++ b/server-web.py @@ -1,30 +1,30 @@ from seleniumwire import webdriver # Import from seleniumwire from seleniumwire.utils import decode from time import sleep -from collections import deque from flask import Flask as f from flask import Response from dateutil import parser from datetime import datetime, timedelta, timezone import json import re +import asyncio +import logging +import threading +import os + +#log = logging.getLogger('werkzeug') +#log.setLevel(logging.ERROR) +#log.disabled = True + -options = webdriver.ChromeOptions() -options.add_argument('--headless') -options.add_argument("--incognito") -options.add_argument("--nogpu") -options.add_argument("--disable-gpu") -options.add_argument("--window-size=1280,1280") -options.add_argument("--no-sandbox") -options.add_argument("--enable-javascript") -options.add_argument('--disable-dev-shm-usage') # Create a new instance of the Chrome driver -driver = webdriver.Chrome(options=options) -q = deque() valuestore = {} datestore = {} +lastUpdate = datetime.now(timezone.utc) + app = f("web") +#app.logger.disabled = True h2 = timedelta(hours=2) def interceptor(request, response): # A response interceptor takes two args @@ -37,12 +37,30 @@ def interceptor(request, response): # A response interceptor takes two args handleJson(j) except ValueError: if i.find("online-level") > 0: - print ("Fixed: ", i) + #print ("Fixed: ", i) j = json.loads(i[:i.rfind(']') + 1]) handleJson(j) - else: - print ("Err: ", i) + #else: + #print ("Err: ", i) +# StackOverflow +def killChildren(driver): + print('Quitting session: ', driver.session_id) + driver.quit() + try: + pid = True + while pid: + pid = os.waitpid(-1, os.WNOHANG) + print("Reaped child: ", str(pid)) + + try: + if pid[0] == 0: + pid = False + except: + pass + + except ChildProcessError: + pass def idIsRecent(id): return id in valuestore and datetime.now(timezone.utc) - parser.parse(datestore[id]) < timedelta(seconds=30) @@ -60,7 +78,7 @@ def handleJson(jsonObj): # Gibt den letzten bekannten Wert fuer die NMTID zurueck @app.route('/nmt/') def nmtid(id): - if id in valuestore and datetime.now(timezone.utc) - parser.parse(datestore[id]) < timedelta(seconds=30): + if idIsRecent(id): return format( valuestore[id], '.1f') else: return "E_NA" # Entweder out of date oder nicht existent @@ -71,9 +89,58 @@ def ids(): l = filter(idIsRecent,list(valuestore.keys())) return ','.join(map(str,l)) -if __name__ == '__main__': +def createDriver(): + options = webdriver.ChromeOptions() + options.add_argument('--headless') + options.add_argument("--incognito") + options.add_argument("--nogpu") + options.add_argument("--disable-gpu") + options.add_argument("--window-size=1280,1280") + options.add_argument("--no-sandbox") + options.add_argument("--enable-javascript") + options.add_argument('--disable-dev-shm-usage') + driver = webdriver.Chrome(options=options) driver.response_interceptor = interceptor + return driver - driver.get('https://dus-travis.dus.com/') +if __name__ == '__main__': - app.run(host='0.0.0.0', port=80, debug=False) + # start flask server + threading.Thread(target=lambda: app.run(host='0.0.0.0', port=80, debug=False, use_reloader=False)).start() + + # wait time to restart will be dynamically adapted, + # if unexpected things happen in chrome or the real world + restartWait = timedelta(hours=4) + + # setup webdriver + d0 = createDriver() + + # start initial driver + d0.get('https://dus-travis.dus.com/') + lastaccess = datetime.now(timezone.utc) + + # loop and restart with restartWait Interval + while True: + sleep(10) + if datetime.now(timezone.utc) > lastaccess + restartWait: + d1 = createDriver() + d1.get('https://dus-travis.dus.com/') + print ("New Failover Driver started, waiting 10 seconds ...") + sleep(10) + killChildren(d0) + del d0 + print ("Original driver deleted") + d0 = createDriver() + d0.get('https://dus-travis.dus.com/') + print ("Recreating original driver and waiting 10 seconds ...") + sleep(10) + killChildren(d1) + del d1 + print ("Failover Driver deleted") + lastaccess = datetime.now(timezone.utc) + l = filter(idIsRecent,list(valuestore.keys())) + if len(l) < 1: + restartWait = timedelta(seconds=60) + + +