def _handle_trickle(self, request): trickle_params_schema = Schema({ Optional('candidate'): dict, Optional('candidates'): [dict], AutoDel(str): object # for all other key we don't care }) params = trickle_params_schema.validate(request.message) candidate = params.get('candidate') candidates = params.get('candidates') if candidate is None and candidates is None: raise JanusCloudError( 'Missing mandatory element (candidate|candidates)', JANUS_ERROR_MISSING_MANDATORY_ELEMENT) if candidate and candidates: raise JanusCloudError('Can\'t have both candidate and candidates', JANUS_ERROR_INVALID_JSON) # dispatch to plugin handle handle = self._get_plugin_handle(request) handle.handle_trickle(candidate=candidate, candidates=candidates) return create_janus_msg('ack', request.session_id, request.transaction)
def _handle_attach(self, request): session = self._get_session(request) attach_params_schema = Schema({ 'plugin': StrVal(max_len=64), Optional('opaque_id'): StrVal(max_len=64), AutoDel(str): object # for all other key we don't care }) params = attach_params_schema.validate(request.message) handle = session.attach_handle(**params) return create_janus_msg('success', request.session_id, request.transaction, data={'id': handle.handle_id})
def _handle_create(self, request): create_params_schema = Schema({ Optional('id'): IntVal(min=1, max=9007199254740992), AutoDel(str): object # for all other key we don't care }) params = create_params_schema.validate(request.message) session_id = params.get('id', 0) session = self._frontend_session_mgr.create_new_session( session_id, request.transport) return create_janus_msg('success', 0, request.transaction, data={'id': session.session_id})
def read_config(config_file): p2pcall_config_schema = Schema({ Optional("general"): Default({ Optional("user_db"): Default(StrVal(), default='memory'), AutoDel(str): object # for all other key we don't care }, default={}), DoNotCare(str): object # for all other key we don't care }) #print('config file:', config_file) if config_file is None or config_file == '': config = p2pcall_config_schema.validate({}) else: log.info('P2Pcall plugin loads the config file: {}'.format(os.path.abspath(config_file))) config = parse_config(config_file, p2pcall_config_schema) # check other configure option is valid or not return config
def read_config(config_file): videocall_config_schema = Schema({ Optional("general"): Default( { Optional("user_db"): Default(StrVal(), default='memory'), AutoDel(str): object # for all other key we don't care }, default={}), DoNotCare(str): object # for all other key we don't care }) #print('config file:', config_file) if config_file is None or config_file == '': config = videocall_config_schema.validate({}) else: config = parse_config(config_file, videocall_config_schema) # check other configure option is valid or not return config
def _handle_message(self, request): message_params_schema = Schema({ 'body': dict, Optional('jsep'): dict, AutoDel(str): object # for all other key we don't care }) params = message_params_schema.validate(request.message) # dispatch to plugin handle handle = self._get_plugin_handle(request) result, content = handle.handle_message(request.transaction, **params) if result == JANUS_PLUGIN_OK: if content is None or not isinstance(content, dict): raise JanusCloudError( "Plugin didn't provide any content for this synchronous response" if content is None else "Plugin returned an invalid JSON response", JANUS_ERROR_PLUGIN_MESSAGE) response = create_janus_msg('success', request.session_id, request.transaction, sender=request.handle_id) if handle.opaque_id: response['opaque_id'] = handle.opaque_id response['plugindata'] = { 'plugin': handle.plugin_package_name, 'data': content } elif result == JANUS_PLUGIN_OK_WAIT: response = create_janus_msg('ack', request.session_id, request.transaction) if content: response['hint'] = content else: raise JanusCloudError('Plugin returned a severe (unknown) error', JANUS_ERROR_PLUGIN_MESSAGE) return response
class Request(object): request_schema = Schema({ "janus": StrRe(r"^\S+$"), "transaction": StrRe(r"^\S+$"), Optional("session_id"): IntVal(), Optional("handle_id"): IntVal(), Optional("apisecret"): StrVal(), DoNotCare(str): object # for all other key we don't care }) def __init__(self, transport_session, message): message = self.request_schema.validate(message) self.transport = transport_session self.message = message self.janus = message['janus'] self.transaction = message['transaction'] self.session_id = message.get('session_id', 0) self.handle_id = message.get('handle_id', 0) self.apisecret = message.get('apisecret', '')
config_schema = Schema({ Optional("general"): Default( { Optional("daemonize"): Default(BoolVal(), default=False), AutoDel(str): object # for all other key remove }, default={}), Optional("log"): Default( { Optional('log_to_stdout'): Default(BoolVal(), default=True), Optional('log_to_file'): Default(StrVal(), default=''), Optional('debug_level'): Default(EnumVal(['DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL']), default='DEBUG'), Optional('log_file_size'): Default(IntVal(), default=104857600), Optional('log_file_rotate'): Default(IntVal(), default=10), AutoDel(str): object # for all other key remove }, default={}), Optional("janus"): Default( { Optional("server_name"): Default(StrVal(min_len=0, max_len=64), default=''), Optional("server_ip"): Default(StrVal(), default='127.0.0.1'), Optional("ws_port"): Default(IntVal(min=0, max=65536), default=8188), Optional("admin_ws_port"): Default(IntVal(min=0, max=65536), default=0), Optional("pingpong_interval"): Default(IntVal(min=1, max=3600), default=5), Optional("statistic_interval"): Default(IntVal(min=1, max=3600), default=10), Optional("request_timeout"): Default(IntVal(min=1, max=3600), default=10), Optional("hwm_threshold"): Default(IntVal(min=0, max=300), default=0), Optional('admin_secret'): Default(StrVal(), default=''), AutoDel(str): object # for all other key remove }, default={}), Optional("proc_watcher"): Default( { Optional("cmdline"): Default(StrVal(), default=''), Optional("error_restart_interval"): Default(IntVal(min=0, max=86400), default=30), Optional("poll_interval"): Default(IntVal(min=1, max=3600), default=1), AutoDel(str): object # for all other key remove }, default={}), Optional("admin_api"): Default( { Optional("json"): Default(EnumVal(['indented', 'plain', 'compact']), default='indented'), Optional("http_listen"): Default(StrRe('^\S+:\d+$'), default='0.0.0.0:8200'), AutoDel(str): object # for all other key we don't care }, default={}), Optional("posters"): Default( [{ "post_type": StrVal(min_len=1, max_len=64), "name": StrVal(min_len=0, max_len=64), DoNotCare(str): object # for all other key we don't care }], default=[]), })
JANUS_P2PCALL_ERROR_USE_ECHO_TEST = 479 JANUS_P2PCALL_ERROR_NO_CALL = 481 JANUS_P2PCALL_ERROR_MISSING_SDP = 482 JANUS_P2PCALL_VERSION = 6 JANUS_P2PCALL_VERSION_STRING = '0.0.6' JANUS_P2PCALL_DESCRIPTION = 'This is a simple P2P video call plugin for Janus-cloud, ' \ 'allow two WebRTC peer communicate with each other in P2P mode' JANUS_P2PCALL_NAME = 'JANUS P2PCall plugin' JANUS_P2PCALL_AUTHOR = 'opensight.cn' JANUS_P2PCALL_PACKAGE = 'janus.plugin.p2pcall' JANUS_P2PCALL_API_BASE_PATH = '/plugins/p2pcall' username_schema = Schema({ 'username': StrRe('^\w{1,128}$'), DoNotCare(str): object # for all other key we don't care }) class P2PCallUser(object): def __init__(self, username, handle=None, incall=False, peer_name='', api_url=''): self.username = username self.incall = incall self.peer_name = peer_name self.handle = handle self.api_url = api_url
JANUS_VIDEOCALL_VERSION = 6 JANUS_VIDEOCALL_VERSION_STRING = '0.0.6' JANUS_VIDEOCALL_DESCRIPTION = 'This is a a simple video call plugin for Janus-cloud, ' \ 'which allow two WebRTC peer communicate with each other through Janus server. ' \ 'Its API is kept sync with videocall of Janus-server until ' + \ JANUS_VIDEOCALL_API_SYNC_VERSION JANUS_VIDEOCALL_NAME = 'JANUS VideoCall plugin' JANUS_VIDEOCALL_AUTHOR = 'opensight.cn' JANUS_VIDEOCALL_PACKAGE = 'janus.plugin.videocall' JANUS_VIDEOCALL_API_BASE_PATH = '/plugins/videocall' INCOMMING_CALL_TIMEOUT = 10 username_schema = Schema({ 'username': StrRe('^\w{1,128}$'), DoNotCare(str): object # for all other key we don't care }) set_schema = Schema({ Optional('audio'): BoolVal(), Optional('video'): BoolVal(), Optional('bitrate'): IntVal(min=1), Optional('record'): BoolVal(), Optional('restart'): BoolVal(), Optional('filename'): StrVal(), Optional('substream'): IntVal(min=0, max=2), Optional('temporal'): IntVal(min=0, max=2), Optional('fallback'): IntVal(min=0), AutoDel(str): object # for all other key we must delete })
server_list = backend_server_manager.get_all_server_list() return server_list server_update_schema = Schema({ 'name': StrRe('^\S{1,64}$'), 'url': StrRe('^(ws|wss)://\S+$'), 'status': IntVal(values=(JANUS_SERVER_STATUS_NORMAL, JANUS_SERVER_STATUS_ABNORMAL, JANUS_SERVER_STATUS_MAINTENANCE)), Optional("session_timeout"): IntVal(min=0, max=86400), Optional("session_num"): IntVal(min=0, max=10000), Optional("handle_num"): IntVal(min=0, max=100000), Optional("location"): StrVal(min_len=0, max_len=64), Optional("isp"): StrVal(min_len=0, max_len=64), Optional("expire"): IntVal(min=0, max=86400), AutoDel(str): object # for all other key we must delete }) @post_view(route_name='sentinel_callback') def post_sentinel_callback(request):
config_schema = Schema({ Optional("general"): Default({ Optional("daemonize"): Default(BoolVal(), default=False), Optional("configs_folder"): Default(StrVal(), default=''), Optional("server_name"): Default(StrRe(r'^\S*$'), default=''), Optional("session_timeout"): Default(IntVal(min=0, max=86400), default=60), Optional("server_db"): Default(StrVal(), default='memory'), Optional("server_select"): Default(StrVal(), default='rr'), Optional('api_secret'): Default(StrVal(), default=''), AutoDel(str): object # for all other key we don't care }, default={}), Optional("log"): Default({ Optional('log_to_stdout'): Default(BoolVal(), default=True), Optional('log_to_file'): Default(StrVal(), default=''), Optional('debug_level'): Default(EnumVal(['DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL']), default='DEBUG'), Optional('log_file_size'): Default(IntVal(), default=104857600), Optional('log_file_rotate'): Default(IntVal(), default=10), AutoDel(str): object # for all other key we don't care }, default={}), Optional("certificates"): Default({ Optional("cert_pem"): StrVal(), Optional("cert_key"): StrVal(), Optional("cert_pwd"): StrVal(), AutoDel(str): object # for all other key we don't care }, default={}), Optional("plugins"): Default([StrRe('^\S+:\S+$')], default=[]), Optional("ws_transport"): Default({ Optional("json"): Default(EnumVal(['indented', 'plain', 'compact']), default='indented'), Optional("pingpong_trigger"): Default(IntVal(min=0, max=3600), default=0), Optional("pingpong_timeout"): Default(IntVal(min=1, max=3600), default=30), Optional("ws"): Default(BoolVal(), default=False), Optional("ws_listen"): Default(StrRe('^\S+:\d+$'), default='0.0.0.0:8288'), Optional("wss"): Default(BoolVal(), default=False), Optional("wss_listen"): Default(StrRe('^\S+:\d+$'), default='0.0.0.0:8289'), Optional("max_greenlet_num"): Default(IntVal(min=0, max=10000), default=1000), AutoDel(str): object # for all other key we don't care }, default={}), Optional("admin_api"): Default({ Optional("json"): Default(EnumVal(['indented', 'plain', 'compact']), default='indented'), Optional("http_listen"): Default(StrRe('^\S+:\d+$'), default='0.0.0.0:8100'), AutoDel(str): object # for all other key we don't care }, default={}), Optional("janus_server"): Default([{ "name": StrRe('^\w{1,64}$'), "url": StrRe('^(ws|wss)://\S+$'), Optional("status"): Default(IntVal(values=(0, 1)), default=0), Optional("session_timeout"): Default(IntVal(min=0, max=86400), default=60), Optional("session_num"): Default(IntVal(min=0, max=10000), default=0), Optional("handle_num"): Default(IntVal(min=0, max=100000), default=0), Optional("location"): Default(StrVal(min_len=0, max_len=64), default=''), Optional("isp"): Default(StrVal(min_len=0, max_len=64), default=''), AutoDel(str): object # for all other key we don't care }], default=[]), })
if janus_watcher: info['janus_watcher'] = { 'args': janus_watcher.args, 'process_status': janus_watcher.process_status, 'pid': janus_watcher.pid, 'process_running_time': janus_watcher.process_running_time, 'auto_restart_count': janus_watcher.auto_restart_count, 'last_exit_time': str(datetime.datetime.fromtimestamp(janus_watcher.process_exit_time)), 'last_return_code': janus_watcher.process_return_code, } return info op_schema = Schema({ 'op': EnumVal(['start_maintenance', 'stop_maintenance', 'restart_process']), AutoDel(str): object # for all other key we must delete }) @post_view(route_name='sentinel_op') def post_sentinel_op(request): params = get_params_from_request(request, op_schema) janus_server = request.registry.janus_server janus_watcher = request.registry.janus_watcher if params['op'] == 'start_maintenance': janus_server.start_maintenance() elif params['op'] == 'stop_maintenance': janus_server.stop_maintenance() elif params['op'] == 'restart_process': if janus_watcher is None: raise JanusCloudError('janus_watcher not enable',