示例#1
0
    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)
示例#2
0
 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})
示例#3
0
    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})
示例#4
0
    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
示例#5
0
    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
示例#6
0
    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
示例#7
0
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', '')
示例#8
0
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=[]),
})
示例#9
0
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
示例#10
0
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
})
示例#11
0
    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):
示例#12
0
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=[]),
})
示例#13
0
    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',