Watchdog added, managing multiple browser instances
This commit is contained in:
parent
704bf29892
commit
993d542610
105
server-web.py
105
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/<int:id>')
|
||||
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
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
# 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)
|
||||
|
||||
|
||||
driver.get('https://dus-travis.dus.com/')
|
||||
|
||||
app.run(host='0.0.0.0', port=80, debug=False)
|
||||
|
|
Loading…
Reference in a new issue