@@ -9,8 +9,6 @@
*/
# include <sstream>
# include <unordered_map>
# include <mutex>
# include "jsoncpp/json.h"
# include "Util/logger.h"
# include "Util/util.h"
@@ -67,22 +65,23 @@ const string kOnProxyPusherFailed = HOOK_FIELD"on_proxy_pusher_failed";
onceToken token ( [ ] ( ) {
mINI : : Instance ( ) [ kEnable ] = false ;
mINI : : Instance ( ) [ kTimeoutSec ] = 10 ;
mINI : : Instance ( ) [ kOnPublish ] = " https://127.0.0.1/index/hook/on_publish " ;
mINI : : Instance ( ) [ kOnPlay ] = " https://127.0.0.1/index/hook/on_play ";
mINI : : Instance ( ) [ kOnFlowReport ] = " https://127.0.0.1/index/hook/on_flow_report ";
mINI : : Instance ( ) [ kOnRtspRealm ] = " https://127.0.0.1/index/hook/on_rtsp_realm ";
mINI : : Instance ( ) [ kOnRtspAuth ] = " https://127.0.0.1/index/hook/on_rtsp_auth ";
mINI : : Instance ( ) [ kOnStreamChanged ] = " https://127.0.0.1/index/hook/on_stream_changed " ;
mINI : : Instance ( ) [ kOnStreamNotFoun d ] = " https://127.0.0.1/index/hook/on_stream_not_found ";
mINI : : Instance ( ) [ kOnRecordMp4 ] = " https://127.0.0.1/index/hook/on_record_mp4 " ;
mINI : : Instance ( ) [ kOnRecordTs ] = " https://127.0.0.1/index/hook/on_record_ts ";
mINI : : Instance ( ) [ kOnShellLogin ] = " https://127.0.0.1/index/hook/on_shell_login ";
mINI : : Instance ( ) [ kOnStreamNoneReader ] = " https://127.0.0.1/index/hook/on_stream_none_reader " ;
mINI : : Instance ( ) [ kOnHttpAccess ] = " https://127.0.0.1/index/hook/on_http_access " ;
mINI : : Instance ( ) [ kOnServerStarted ] = " https://127.0.0.1/index/hook/on_server_started " ;
//默认hook地址设置为空, 采用默认行为(例如不鉴权)
mINI : : Instance ( ) [ kOnPublish ] = " " ;
mINI : : Instance ( ) [ kOnPlay ] = " " ;
mINI : : Instance ( ) [ kOnFlowReport ] = " " ;
mINI : : Instance ( ) [ kOnRtspRealm ] = " " ;
mINI : : Instance ( ) [ kOnRtspAuth ] = " " ;
mINI : : Instance ( ) [ kOnStreamChange d ] = " " ;
mINI : : Instance ( ) [ kOnStreamNotFound ] = " " ;
mINI : : Instance ( ) [ kOnRecordMp4 ] = " " ;
mINI : : Instance ( ) [ kOnRecordTs ] = " " ;
mINI : : Instance ( ) [ kOnShellLogin ] = " " ;
mINI : : Instance ( ) [ kOnStreamNoneReader ] = " " ;
mINI : : Instance ( ) [ kOnHttpAccess ] = " " ;
mINI : : Instance ( ) [ kOnServerStarted ] = " " ;
mINI : : Instance ( ) [ kOnRecordHls ] = " " ;
mINI : : Instance ( ) [ kOnProxyPusherFailed ] = " " ;
mINI : : Instance ( ) [ kAdminParams ] = " secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc " ;
mINI : : Instance ( ) [ kOnRecordHls ] = " https://127.0.0.1/index/hook/on_record_hls " ;
mINI : : Instance ( ) [ kOnProxyPusherFailed ] = " https://127.0.0.1/index/hook/on_proxy_pusher_failed " ;
} , nullptr ) ;
} //namespace Hook
@@ -191,24 +190,11 @@ static void reportServerStarted(){
void installWebHook ( ) {
GET_CONFIG ( bool , hook_enable , Hook : : kEnable ) ;
GET_CONFIG ( string , hook_publish , Hook : : kOnPublish ) ;
GET_CONFIG ( string , hook_play , Hook : : kOnPlay ) ;
GET_CONFIG ( string , hook_flowreport , Hook : : kOnFlowReport ) ;
GET_CONFIG ( string , hook_adminparams , Hook : : kAdminParams ) ;
GET_CONFIG ( string , hook_rtsp_realm , Hook : : kOnRtspRealm ) ;
GET_CONFIG ( string , hook_rtsp_auth , Hook : : kOnRtspAuth ) ;
GET_CONFIG ( string , hook_stream_chaned , Hook : : kOnStreamChanged ) ;
GET_CONFIG ( string , hook_stream_not_found , Hook : : kOnStreamNotFound ) ;
GET_CONFIG ( string , hook_record_mp4 , Hook : : kOnRecordMp4 ) ;
GET_CONFIG ( string , hook_record_ts , Hook : : kOnRecordTs ) ;
GET_CONFIG ( string , hook_shell_login , Hook : : kOnShellLogin ) ;
GET_CONFIG ( string , hook_stream_none_reader , Hook : : kOnStreamNoneReader ) ;
GET_CONFIG ( string , hook_http_access , Hook : : kOnHttpAccess ) ;
GET_CONFIG ( string , hook_record_hls , Hook : : kOnRecordHls ) ;
GET_CONFIG ( string , hook_proxy_pusher_failed , Hook : : kOnProxyPusherFailed ) ;
//录制hls文件成功后广播
NoticeCenter : : Instance ( ) . addListener ( nullptr , Broadcast : : kBroadcastRecordHls , [ ] ( BroadcastRecordHlsArgs ) {
GET_CONFIG ( string , hook_record_hls , Hook : : kOnRecordHls ) ;
if ( ! hook_enable | | hook_record_hls . empty ( ) ) {
return ;
}
@@ -225,6 +211,7 @@ void installWebHook(){
//转推流失败后广播
NoticeCenter : : Instance ( ) . addListener ( nullptr , Broadcast : : kBroadcaseProxyPusherFailed , [ ] ( BroadcaseProxyPusherFailedArgs ) {
GET_CONFIG ( string , hook_proxy_pusher_failed , Hook : : kOnProxyPusherFailed ) ;
if ( ! hook_enable | | hook_proxy_pusher_failed . empty ( ) ) {
return ;
}
@@ -237,6 +224,7 @@ void installWebHook(){
} ) ;
NoticeCenter : : Instance ( ) . addListener ( nullptr , Broadcast : : kBroadcastMediaPublish , [ ] ( BroadcastMediaPublishArgs ) {
GET_CONFIG ( string , hook_publish , Hook : : kOnPublish ) ;
GET_CONFIG ( bool , toHls , General : : kPublishToHls ) ;
GET_CONFIG ( bool , toMP4 , General : : kPublishToMP4 ) ;
if ( ! hook_enable | | args . _param_strs = = hook_adminparams | | hook_publish . empty ( ) | | sender . get_peer_ip ( ) = = " 127.0.0.1 " ) {
@@ -272,6 +260,7 @@ void installWebHook(){
} ) ;
NoticeCenter : : Instance ( ) . addListener ( nullptr , Broadcast : : kBroadcastMediaPlayed , [ ] ( BroadcastMediaPlayedArgs ) {
GET_CONFIG ( string , hook_play , Hook : : kOnPlay ) ;
if ( ! hook_enable | | args . _param_strs = = hook_adminparams | | hook_play . empty ( ) | | sender . get_peer_ip ( ) = = " 127.0.0.1 " ) {
invoker ( " " ) ;
return ;
@@ -287,6 +276,7 @@ void installWebHook(){
} ) ;
NoticeCenter : : Instance ( ) . addListener ( nullptr , Broadcast : : kBroadcastFlowReport , [ ] ( BroadcastFlowReportArgs ) {
GET_CONFIG ( string , hook_flowreport , Hook : : kOnFlowReport ) ;
if ( ! hook_enable | | args . _param_strs = = hook_adminparams | | hook_flowreport . empty ( ) | | sender . get_peer_ip ( ) = = " 127.0.0.1 " ) {
return ;
}
@@ -306,6 +296,7 @@ void installWebHook(){
//监听kBroadcastOnGetRtspRealm事件决定rtsp链接是否需要鉴权(传统的rtsp鉴权方案)才能访问
NoticeCenter : : Instance ( ) . addListener ( nullptr , Broadcast : : kBroadcastOnGetRtspRealm , [ ] ( BroadcastOnGetRtspRealmArgs ) {
GET_CONFIG ( string , hook_rtsp_realm , Hook : : kOnRtspRealm ) ;
if ( ! hook_enable | | args . _param_strs = = hook_adminparams | | hook_rtsp_realm . empty ( ) | | sender . get_peer_ip ( ) = = " 127.0.0.1 " ) {
//无需认证
invoker ( " " ) ;
@@ -328,6 +319,7 @@ void installWebHook(){
//监听kBroadcastOnRtspAuth事件返回正确的rtsp鉴权用户密码
NoticeCenter : : Instance ( ) . addListener ( nullptr , Broadcast : : kBroadcastOnRtspAuth , [ ] ( BroadcastOnRtspAuthArgs ) {
GET_CONFIG ( string , hook_rtsp_auth , Hook : : kOnRtspAuth ) ;
if ( unAuthedRealm = = realm | | ! hook_enable | | hook_rtsp_auth . empty ( ) ) {
//认证失败
invoker ( false , makeRandStr ( 12 ) ) ;
@@ -354,6 +346,7 @@ void installWebHook(){
//监听rtsp、rtmp源注册或注销事件
NoticeCenter : : Instance ( ) . addListener ( nullptr , Broadcast : : kBroadcastMediaChanged , [ ] ( BroadcastMediaChangedArgs ) {
GET_CONFIG ( string , hook_stream_chaned , Hook : : kOnStreamChanged ) ;
if ( ! hook_enable | | hook_stream_chaned . empty ( ) ) {
return ;
}
@@ -369,8 +362,10 @@ void installWebHook(){
//监听播放失败(未找到特定的流)事件
NoticeCenter : : Instance ( ) . addListener ( nullptr , Broadcast : : kBroadcastNotFoundStream , [ ] ( BroadcastNotFoundStreamArgs ) {
GET_CONFIG ( string , hook_stream_not_found , Hook : : kOnStreamNotFound ) ;
if ( ! hook_enable | | hook_stream_not_found . empty ( ) ) {
// closePlayer();
//如果确定这个流不存在,可以 closePlayer()返回播放器流不存在
//closePlayer();
return ;
}
auto body = make_json ( args ) ;
@@ -399,6 +394,7 @@ void installWebHook(){
# ifdef ENABLE_MP4
//录制mp4文件成功后广播
NoticeCenter : : Instance ( ) . addListener ( nullptr , Broadcast : : kBroadcastRecordMP4 , [ ] ( BroadcastRecordMP4Args ) {
GET_CONFIG ( string , hook_record_mp4 , Hook : : kOnRecordMp4 ) ;
if ( ! hook_enable | | hook_record_mp4 . empty ( ) ) {
return ;
}
@@ -408,6 +404,7 @@ void installWebHook(){
# endif //ENABLE_MP4
NoticeCenter : : Instance ( ) . addListener ( nullptr , Broadcast : : kBroadcastRecordTs , [ ] ( BroadcastRecordTsArgs ) {
GET_CONFIG ( string , hook_record_ts , Hook : : kOnRecordTs ) ;
if ( ! hook_enable | | hook_record_ts . empty ( ) ) {
return ;
}
@@ -416,6 +413,7 @@ void installWebHook(){
} ) ;
NoticeCenter : : Instance ( ) . addListener ( nullptr , Broadcast : : kBroadcastShellLogin , [ ] ( BroadcastShellLoginArgs ) {
GET_CONFIG ( string , hook_shell_login , Hook : : kOnShellLogin ) ;
if ( ! hook_enable | | hook_shell_login . empty ( ) | | sender . get_peer_ip ( ) = = " 127.0.0.1 " ) {
invoker ( " " ) ;
return ;
@@ -434,6 +432,7 @@ void installWebHook(){
} ) ;
NoticeCenter : : Instance ( ) . addListener ( nullptr , Broadcast : : kBroadcastStreamNoneReader , [ ] ( BroadcastStreamNoneReaderArgs ) {
GET_CONFIG ( string , hook_stream_none_reader , Hook : : kOnStreamNoneReader ) ;
if ( ! hook_enable | | hook_stream_none_reader . empty ( ) ) {
return ;
}
@@ -471,6 +470,7 @@ void installWebHook(){
//如果没有url参数, 客户端又不支持cookie, 那么会根据ip和端口追踪用户
//追踪用户的目的是为了缓存上次鉴权结果,减少鉴权次数,提高性能
NoticeCenter : : Instance ( ) . addListener ( nullptr , Broadcast : : kBroadcastHttpAccess , [ ] ( BroadcastHttpAccessArgs ) {
GET_CONFIG ( string , hook_http_access , Hook : : kOnHttpAccess ) ;
if ( sender . get_peer_ip ( ) = = " 127.0.0.1 " | | parser . Params ( ) = = hook_adminparams ) {
//如果是本机或超级管理员访问, 那么不做访问鉴权; 权限有效期1个小时
invoker ( " " , " " , 60 * 60 ) ;