added stream checks
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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.'),
|
||||
})
|
||||
|
||||
|
||||
|
||||
@@ -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 *
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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']))
|
||||
|
||||
15
backend/tools/stream_handling.py
Normal file
15
backend/tools/stream_handling.py
Normal 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)
|
||||
Reference in New Issue
Block a user