added stream checks

This commit is contained in:
Tobias Kurze
2020-02-21 07:22:26 +01:00
parent bb4db25dcd
commit 6971b4b618
10 changed files with 324 additions and 202 deletions

View File

@@ -10,7 +10,8 @@ from jinja2.exceptions import TemplateNotFound
from backend import app, db
from backend.cron import get_default_scheduler, add_default_jobs
from backend.models import room_model, recorder_model, RecorderCommand
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.websocket.base import WebSocketBase
@@ -19,8 +20,10 @@ from backend.websocket.base import WebSocketBase
def main():
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
#db.drop_all()
#db.create_all()
db.drop_all()
db.create_all()
Recorder()
room_model.pre_fill_table()
update_recorder_models_database(drop=False)
create_default_recorders()

View File

@@ -21,7 +21,11 @@ group_model = api_group.model('Group', {
'first_name': fields.String(), 'last_name': fields.String(),
'email': fields.String(), 'registered_on': fields.DateTime(),
'last_seen': fields.DateTime()})),
required=False, description='Group members.')
required=False, description='Group members.'),
'permissions': fields.List(fields.Nested(api_group.model('group_permissions',
{'id': fields.Integer,
'name': fields.String})),
required=False, description='Group permissions.'),
})

View File

@@ -1,10 +1,10 @@
"""
Import all models...
"""
from backend.models.access_control_model import *
from backend.models.example_model import *
from backend.models.user_model import *
from backend.models.post_model import *
from backend.models.recorder_model import *
from backend.models.access_control_model import *
from backend.models.room_model import *
from backend.models.user_model import *
from backend.models.virtual_command_model import *

View File

@@ -10,7 +10,7 @@ import os
import re
from typing import Union
from sqlalchemy import MetaData
from sqlalchemy import MetaData, ForeignKeyConstraint
from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.orm import validates
@@ -24,6 +24,41 @@ from backend.models.virtual_command_model import virtual_command_recorder_comman
metadata = MetaData()
# This is the association table for the many-to-many relationship between
# recorders and permissions.
recorder_permission_table = db.Table('recorder_permission',
db.Column('recorder_id', db.Integer,
db.ForeignKey('recorder.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True),
db.Column('permission_id', db.Integer,
db.ForeignKey('permission.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True),
extend_existing=True)
# This is the association table for the many-to-many relationship between
# recorders and recorderCommands and permissions.
recorder_rec_commands_permission_table = db.Table('recorder_rec_command_permission',
db.Column('recorder_id', db.Integer,
db.ForeignKey('recorder.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True),
db.Column('recorder_command_id', db.Integer,
db.ForeignKey('recorder_command.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True),
db.Column('permission_id', db.Integer,
db.ForeignKey('permission.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True),
extend_existing=True)
class RecorderModel(db.Model, ModelBase):
__table_args__ = {'extend_existing': True}
@@ -116,6 +151,9 @@ class Recorder(db.Model, ModelBase):
virtual_commands = db.relationship('VirtualCommand', secondary=virtual_command_recorder_table,
back_populates='recorders')
required_read_permissions = db.relationship('Permission', secondary=recorder_permission_table)
required_write_permissions = db.relationship('Permission', secondary=recorder_permission_table)
def __init__(self, **kwargs):
super(Recorder, self).__init__(**kwargs)
@@ -215,9 +253,19 @@ class Recorder(db.Model, ModelBase):
sort_keys=True, indent=4)
class RecorderCommandPermission(db.Model, ModelBase):
__table_args__ = {'extend_existing': True}
id = db.Column(db.Integer, autoincrement=True, primary_key=True)
recorder = db.relationship('Recorder')
recorder_id = db.Column(db.Integer, db.ForeignKey('recorder.id'))
recorder_command = db.relationship('RecorderCommand')
recorder_command_id = db.Column(db.Integer, db.ForeignKey('recorder_command.id'))
permission = db.relationship('Permission')
permission_id = db.Column(db.Integer, db.ForeignKey('permission.id'))
class RecorderCommand(db.Model, ModelBase):
__table_args__ = {'extend_existing': True}
"""Table containing permissions associated with groups."""
id = db.Column(db.Integer, autoincrement=True, primary_key=True)
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow())
last_time_modified = db.Column(db.DateTime, nullable=True, default=datetime.utcnow())
@@ -231,6 +279,9 @@ class RecorderCommand(db.Model, ModelBase):
virtual_commands = db.relationship('VirtualCommand', secondary=virtual_command_recorder_command_table,
back_populates='recorder_commands')
required_show_permissions = db.relationship('RecorderCommandPermission')
required_execute_permissions = db.relationship('RecorderCommandPermission')
@staticmethod
def get_all():
return RecorderCommand.query.all()
@@ -248,3 +299,7 @@ class RecorderCommand(db.Model, ModelBase):
@parameters.setter
def parameters(self, parameters_dict: dict):
self.parameters_string = json.dumps(parameters_dict)
if __name__ == '__main__':
Recorder(name="RecTest")

View File

@@ -71,6 +71,20 @@ group_permission_table = db.Table('group_permission',
ondelete="CASCADE"),
primary_key=True))
# This is the association table for the many-to-many relationship between
# users and permissions.
user_permission_table = db.Table('user_permission',
db.Column('user_id', db.Integer,
db.ForeignKey('user.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True),
db.Column('permission_id', db.Integer,
db.ForeignKey('permission.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True))
class User(UserMixin, db.Model):
"""
@@ -90,6 +104,7 @@ class User(UserMixin, db.Model):
about_me = db.Column(db.Unicode(255))
role = db.Column(db.Unicode(63))
groups = db.relationship('Group', secondary=user_group_table, back_populates='users')
permissions = db.relationship('Permission', secondary=user_permission_table, back_populates='users')
password = db.Column(db.String(255), nullable=True)
registered_on = db.Column(db.DateTime, nullable=False, default=datetime.utcnow())
external_user = db.Column(db.Boolean, default=False)
@@ -482,10 +497,14 @@ class Permission(db.Model):
id = db.Column(db.Integer, autoincrement=True, primary_key=True)
name = db.Column(db.Unicode(63), unique=True, nullable=False)
description = db.Column(db.Unicode(511))
#read_only = db.Column(db.Boolean, default=False)
groups = db.relationship(Group, secondary=group_permission_table,
back_populates='permissions')
users = db.relationship(User, secondary=user_permission_table,
back_populates='permissions')
access_control_entry = db.relationship('AccessControlEntry', back_populates='required_permission')
@staticmethod
def get_by_name(name):
"""

View File

@@ -18,12 +18,12 @@ REQUIRES_PW = True
# HOST = "129.13.51.102" # Audimax SMP 351
# HOST = "129.13.51.106" # Tulla SMP 351
HOST = "172.22.246.207" # Test SMP MZ
HOST = "129.13.51.109" # Hertz
# HOST = "129.13.51.109" # Hertz
USER = "admin"
PW = "123mzsmp"
# PW = "audimaxsmp"
PW = "smphertz"
# PW = "smphertz"
class SMP35x(TelnetAdapter, RecorderAdapter):
@@ -359,7 +359,7 @@ class SMP35x(TelnetAdapter, RecorderAdapter):
self.tn.write("{}{}NI\n".format(self.esc_char, input_num))
return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line())
def get_input_selction_per_channel(self):
def get_input_selection_per_channel(self):
self.tn.write("32I\n")
return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line())
@@ -795,6 +795,9 @@ def main():
print(smp)
print(smp.get_recording_status())
print(smp.is_recording())
print(smp.get_input_presets())
print(smp.get_input_selection_per_channel())
print(smp.get_recording_status_text())
exit()
smp._login()

View File

@@ -69,9 +69,12 @@ def update_recorder_models_database(drop: bool = False):
for r_a in r_as:
if r_a.get('class') is None: # skip modules without class (helpers.py, e.g.)
continue
logger.info("Checking Recorder Adapter {} for possible updates".format(r_a["id"]))
try:
r_m = RecorderModel.get_by_adapter_id(r_a["id"])
model_checksum = calculate_md5_checksum(dumps(r_a["commands"]))
logger.debug("Recorder Adapter commands checksum: {}".format(model_checksum))
logger.debug(r_m)
if r_m is None:
r_m = RecorderModel(record_adapter_id=r_a["id"], model_name=r_a["name"], checksum=model_checksum,
**r_a.get('class').get_recorder_params())
@@ -81,22 +84,23 @@ def update_recorder_models_database(drop: bool = False):
logger.debug("Creating command definitions for rec mod adapter {}".format(r_m.record_adapter_id))
create_recorder_commands_for_recorder_adapter(r_a["commands"], r_m)
else:
logger.debug("Model command checksum already in db: {}".format(r_m.checksum))
if r_m.model_name != r_a["name"]:
r_m.model_name = r_a["name"]
r_m.last_time_modified = datetime.utcnow()
if model_checksum != r_m.checksum:
create_recorder_commands_for_recorder_adapter(r_a["commands"], r_m)
r_m.last_time_modified = datetime.utcnow()
r_m.checksum = model_checksum
r_m.last_checksum_change = datetime.utcnow()
logger.debug("Updating command definitions for rec mod adapter {}".format(r_m.record_adapter_id))
create_recorder_commands_for_recorder_adapter(r_a["commands"], r_m)
except IntegrityError as e:
logger.error(e)
db.session.rollback()
db.session.commit()
def get_recorder_room(rec: dict) -> Room():
def get_recorder_room(rec: dict):
rooms = Room.get_by_building_number(rec.get('building', None))
if rooms.count() <= 0:
logger.warning("Building {} unknown! Can not find room for recorder {}.".format(rec['building'], rec['name']))

View File

@@ -0,0 +1,15 @@
import ffmpeg
packet_size = 4096
process = (
ffmpeg
.input('rtsp://172.22.246.207/extron1')
#.input('rtsp://172.22.246.207/extron3')
.output('/tmp/test.jpg', vframes=1)
#.output('-', format='h264')
.run_async(pipe_stdout=True)
)
while process.poll() is None:
packet = process.stdout.read(packet_size)