working websocket communication for recorder states

This commit is contained in:
Tobias Kurze
2019-12-11 08:31:42 +01:00
parent 190f728eb7
commit da200f95b8
8 changed files with 137 additions and 668 deletions

View File

@@ -1,15 +1,17 @@
# -*- coding: utf-8 -*-
import copy
import datetime
import logging
from multiprocessing.context import TimeoutError
from multiprocessing.pool import ThreadPool
from pprint import pprint
from threading import Lock
from typing import Union, Callable, TypeVar, Generic, Set, List
from backend.models import Recorder
from backend.tools.simple_state_checker import check_capture_agent_state, ping_capture_agent
logger = logging.getLogger("mal.cron.recorder_state")
logger = logging.getLogger("lrc.cron.recorder_state")
recorder_jobs_lock = Lock()
recorder_jobs = set()
@@ -44,14 +46,18 @@ class StateChecker(Generic[T]):
"Could not add object ({}) to state check, as specified >id ({})< could not be found / object is None".format(
self.type_name, object_to_check))
return
self.lock.acquire()
if hasattr(object_to_check, 'name'):
name = object_to_check.name
else:
name = str(object_to_check)
logger.debug("Adding {} to object ({}) to state check".format(self.type_name, name))
self.jobs.add(object_to_check)
self.lock.release()
with self.lock:
if hasattr(object_to_check, 'name'):
name = object_to_check.name
else:
name = str(object_to_check)
if any([j.id == object_to_check.id for j in self.jobs]):
logger.info(
"Not adding {} ({}) ({}) to state check (already in job list)".format(object_to_check.id, name,
self.type_name))
else:
logger.debug("Adding {} to object ({}) to state check".format(self.type_name, name))
self.jobs.add(object_to_check)
def remove_recorder_from_state_check(self, object_to_check: Union[int, T]):
if isinstance(object_to_check, int):
@@ -79,11 +85,17 @@ class StateChecker(Generic[T]):
if r[0]: # ok :)
if object_states[r[2]].get('msg', "") == "unknown state!":
del object_states[r[2]]['msg']
ok = True
else:
ok = object_states[r[2]].get('state_ok', False),
object_states[r[2]] = {
'id': object_states[r[2]].get('id', None),
'msg': ", ".join([s for s in [object_states[r[2]].get('msg', None), r[1]] if s]),
'state_ok': True}
'state_ok': ok}
else:
object_states[r[2]]['msg'] = r[1]
object_states[r[2]] = {'id': object_states[r[2]].get('id', None),
'msg': r[1],
'state_ok': False}
except TimeoutError as e:
logger.error("Timeout while performing state check func! {}".format(e))
@@ -100,7 +112,7 @@ class StateChecker(Generic[T]):
return {}
logger.info("checking state of {} recorders".format(len(jobs)))
object_states = {j.name: {'state_ok': False, 'msg': 'unknown state!'} for j in jobs}
object_states = {j.name: {'id': j.id, 'state_ok': False, 'msg': 'unknown state!'} for j in jobs}
if isinstance(self.checker_func, list):
for c_f in self.checker_func:
@@ -130,7 +142,8 @@ class StateChecker(Generic[T]):
self.update_state_lock.release()
def get_current_state(self):
return self.check_object_state()
with self.update_state_lock:
return copy.deepcopy(self.state_results)
recorder_checker = StateChecker([check_capture_agent_state, ping_capture_agent], Recorder)