state api now working
This commit is contained in:
@@ -132,12 +132,6 @@ jwt_extended = JWTManager(app)
|
||||
jwt_auth = HTTPTokenAuth('Bearer')
|
||||
|
||||
|
||||
@jwt_extended.invalid_token_loader
|
||||
def unauthorized_jwt(token):
|
||||
main_logger.info("Unauthorized access; invalid token provided: {}".format(token))
|
||||
abort(401)
|
||||
|
||||
|
||||
@jwt_auth.verify_token
|
||||
def verify_token(token):
|
||||
"""This function (and HTTPTokenAuth('Bearer')) has been defined to be used together with MultiAuth. For API calls
|
||||
@@ -178,5 +172,17 @@ app.register_blueprint(fe_bp)
|
||||
CORS(app)
|
||||
CORS(api_bp)
|
||||
|
||||
# Fix jwt_extended by duck typing error handlers
|
||||
jwt_extended._set_error_handler_callbacks(api_v1)
|
||||
# Fix jwt_extended by 'duck typing' error handlers
|
||||
# jwt_extended._set_error_handler_callbacks(api_v1) # removed for the moment, might raise new (old) problems
|
||||
|
||||
|
||||
@jwt_extended.invalid_token_loader
|
||||
def unauthorized_jwt(token):
|
||||
main_logger.info("Unauthorized access; invalid token provided: {}".format(token))
|
||||
abort(401)
|
||||
|
||||
|
||||
@jwt_extended.expired_token_loader
|
||||
def unauthorized_jwt(token):
|
||||
main_logger.info("Unauthorized access; expired token provided: {}".format(token))
|
||||
abort(401)
|
||||
|
||||
@@ -13,7 +13,7 @@ from backend.cron import get_default_scheduler, add_default_jobs
|
||||
from backend.models import *
|
||||
from backend.models import room_model, recorder_model, RecorderCommand, Recorder
|
||||
from backend.recorder_adapters import get_defined_recorder_adapters
|
||||
from backend.tools.model_updater import update_recorder_models_database, create_default_recorders
|
||||
from backend.tools.model_updater import update_recorder_models_database, create_default_recorders, add_test_recorder
|
||||
from backend.websocket.base import WebSocketBase
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ def main():
|
||||
room_model.pre_fill_table()
|
||||
update_recorder_models_database(drop=False)
|
||||
create_default_recorders()
|
||||
add_test_recorder()
|
||||
|
||||
print(app.config.get("SERVER_NAME", None))
|
||||
server_name = app.config.get("SERVER_NAME", None)
|
||||
|
||||
@@ -103,5 +103,15 @@ recorder_model_model = api_recorder.model('Recorder Model', {
|
||||
'commands': fields.List(fields.Nested(recorder_command_model), attribute="recorder_commands")
|
||||
})
|
||||
|
||||
state_model = api_state.model('Recorder', {
|
||||
state_model = api_state.model('Recorder State', {
|
||||
'id': fields.String(required=False, description='The recorder model\'s identifier'),
|
||||
'name': fields.String(description='The recorder model\'s name'),
|
||||
'msg': fields.String(),
|
||||
'state_ok': fields.Boolean(),
|
||||
'time_stamp': fields.String(required=False),
|
||||
'previous': fields.Nested(api_state.model('Previous Recorder State', {
|
||||
'msg': fields.String(),
|
||||
'state_ok': fields.Boolean(),
|
||||
'time_stamp': fields.String()}, required=False)
|
||||
)
|
||||
})
|
||||
|
||||
@@ -11,13 +11,12 @@ from flask_restx import fields, Resource, inputs
|
||||
from backend import db, app
|
||||
from backend.api import api_state
|
||||
from backend.api.models import recorder_model, recorder_model_model, recorder_command_model, state_model
|
||||
from backend.cron import async_cron_recorder_checker
|
||||
from backend.cron import async_cron_recorder_checker, async_permanent_cron_recorder_checker
|
||||
from backend.cron.cron_state_checker import StateChecker
|
||||
from backend.models.recorder_model import Recorder, RecorderModel, RecorderCommand
|
||||
from backend.models.room_model import Room
|
||||
import backend.recorder_adapters as r_a
|
||||
|
||||
|
||||
# ==
|
||||
from backend.tools.recorder_state_checker import get_recorder_adapter, check_capture_agent_state, check_stream_sanity
|
||||
|
||||
@@ -35,33 +34,29 @@ class RecorderStateResource(Resource):
|
||||
if recorder is None:
|
||||
api_state.abort(404)
|
||||
|
||||
current_states_by_checker = async_cron_recorder_checker.get_current_state()
|
||||
state = async_cron_recorder_checker.get_current_state_for_recorder_id(recorder.id)
|
||||
# current_states_by_checker = async_cron_recorder_checker.get_current_state()
|
||||
state = async_permanent_cron_recorder_checker.get_current_state_for_recorder_id(recorder.id)
|
||||
if state is None:
|
||||
state_checker = StateChecker([check_capture_agent_state], Recorder)
|
||||
state_checker.add_object_to_state_check(recorder)
|
||||
state_checker.check_object_state()
|
||||
state = state_checker.get_current_state_for_recorder_id(recorder.id)
|
||||
if not state.get('state_ok', False): # if state is not OK, return state -> no more checks!
|
||||
return state
|
||||
|
||||
# do additional checks, such as: check for single color, sound check, etc.
|
||||
stream_state = check_stream_sanity(recorder)
|
||||
print(stream_state)
|
||||
|
||||
return stream_state
|
||||
|
||||
|
||||
print("lalala")
|
||||
print(state)
|
||||
return state
|
||||
|
||||
|
||||
@api_state.route('/recorder')
|
||||
class RecorderStateList(Resource):
|
||||
@jwt_required
|
||||
@api_state.doc('get_recorders_states')
|
||||
@api_state.marshal_list_with(state_model, skip_none=False)
|
||||
@api_state.marshal_list_with(state_model, skip_none=True)
|
||||
def get(self):
|
||||
"""
|
||||
Get state of all recorders
|
||||
:return: state
|
||||
"""
|
||||
return Recorder.get_all()
|
||||
rec_states = async_permanent_cron_recorder_checker.get_current_state()
|
||||
print(rec_states)
|
||||
res = [{**{'name': rec_state_name}, **rec_states[rec_state_name]} for rec_state_name in rec_states]
|
||||
return res
|
||||
|
||||
@@ -12,7 +12,7 @@ from backend import app, main_logger
|
||||
|
||||
from apscheduler.schedulers.background import BackgroundScheduler
|
||||
|
||||
from backend.cron.cron_state_checker import async_cron_recorder_checker
|
||||
from backend.cron.cron_state_checker import async_cron_recorder_checker, async_permanent_cron_recorder_checker
|
||||
from backend.websocket.handlers import send_state_update_to_recorders
|
||||
|
||||
cron_log_handler = TimedRotatingFileHandler(app.config.get('CRON_LOG_FILE'), interval=1, when='d', backupCount=3)
|
||||
@@ -42,10 +42,14 @@ def add_default_jobs(sched=None, testing=False):
|
||||
if testing:
|
||||
check_recorder_state_job = sched.add_job(async_cron_recorder_checker.check_object_state, 'interval', seconds=40,
|
||||
id="check_recorder_state_job")
|
||||
check_all_recorders_state_job = sched.add_job(async_permanent_cron_recorder_checker, 'interval', minutes=5,
|
||||
id="check_all_recorders_state_job")
|
||||
|
||||
else:
|
||||
check_recorder_state_job = sched.add_job(async_cron_recorder_checker.check_object_state, 'interval', minutes=2,
|
||||
id="check_recorder_state_job")
|
||||
check_all_recorders_state_job = sched.add_job(async_permanent_cron_recorder_checker.check_object_state, 'interval', minutes=30,
|
||||
id="check_all_recorders_state_job")
|
||||
|
||||
"""
|
||||
Job regularly sending the state to "frontend recorders" through websocket
|
||||
@@ -54,7 +58,7 @@ def add_default_jobs(sched=None, testing=False):
|
||||
lambda: send_state_update_to_recorders(async_cron_recorder_checker.get_current_state()), 'interval', minutes=1,
|
||||
id="send_update_state_to_recorder_job")
|
||||
|
||||
return [check_recorder_state_job, send_update_state_to_recorder_job]
|
||||
return [check_recorder_state_job, send_update_state_to_recorder_job, check_all_recorders_state_job]
|
||||
|
||||
|
||||
def signal_handler(sig, frame):
|
||||
|
||||
@@ -9,7 +9,7 @@ from threading import Lock
|
||||
from typing import Union, Callable, TypeVar, Generic, Set, List
|
||||
|
||||
from backend.models import Recorder
|
||||
from backend.tools.recorder_state_checker import check_capture_agent_state, ping_capture_agent
|
||||
from backend.tools.recorder_state_checker import check_capture_agent_state, ping_capture_agent, check_stream_sanity
|
||||
|
||||
logger = logging.getLogger("lrc.cron.recorder_state")
|
||||
|
||||
@@ -97,10 +97,14 @@ class StateChecker(Generic[T]):
|
||||
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]),
|
||||
'time_stamp': datetime.datetime.now(datetime.timezone.utc).strftime(
|
||||
"%d.%m.%Y - %H:%M:%S %Z"),
|
||||
'state_ok': ok}
|
||||
else:
|
||||
object_states[r[2]] = {'id': object_states[r[2]].get('id', None),
|
||||
'msg': r[1],
|
||||
'time_stamp': datetime.datetime.now(datetime.timezone.utc).strftime(
|
||||
"%d.%m.%Y - %H:%M:%S %Z"),
|
||||
'state_ok': False}
|
||||
except TimeoutError as e:
|
||||
logger.error("Timeout while performing state check func! {}".format(e))
|
||||
@@ -163,3 +167,9 @@ class StateChecker(Generic[T]):
|
||||
|
||||
|
||||
async_cron_recorder_checker = StateChecker([check_capture_agent_state, ping_capture_agent], Recorder)
|
||||
async_permanent_cron_recorder_checker = StateChecker(
|
||||
[check_capture_agent_state, ping_capture_agent, check_stream_sanity], Recorder)
|
||||
|
||||
for r in Recorder.get_all():
|
||||
async_permanent_cron_recorder_checker.add_object_to_state_check(r.id)
|
||||
async_permanent_cron_recorder_checker.check_object_state() # initial check of all recorders
|
||||
|
||||
@@ -170,6 +170,22 @@ def create_default_recorders():
|
||||
db.session.commit()
|
||||
|
||||
|
||||
def add_test_recorder():
|
||||
test_rec_mac = "00:05:A6:16:A3:E4"
|
||||
rec = Recorder.get_by_mac(test_rec_mac)
|
||||
if rec is None:
|
||||
rec = Recorder()
|
||||
rec.mac = test_rec_mac
|
||||
rec.name = "Test SMP (MZ)"
|
||||
rec.model_name = "SMP 352"
|
||||
rec.recorder_model = RecorderModel.get_where_adapter_id_contains("SMP 35")
|
||||
rec.username = "admin"
|
||||
rec.password = "123mzsmp"
|
||||
rec.firmware_version = "2.11b0"
|
||||
rec.ip = "172.22.246.207"
|
||||
db.session.commit()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# for r in Room.get_all():
|
||||
# print(r)
|
||||
|
||||
Reference in New Issue
Block a user