mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 19:00:01 +08:00
确保MediaServer主函数可以多次调用: #1838
This commit is contained in:
parent
3cb0f66093
commit
54f400a6e9
@ -17,20 +17,19 @@
|
|||||||
#endif//!defined(ANDROID)
|
#endif//!defined(ANDROID)
|
||||||
#endif//!defined(_WIN32)
|
#endif//!defined(_WIN32)
|
||||||
|
|
||||||
#include "System.h"
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <csignal>
|
#include <csignal>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "Util/logger.h"
|
|
||||||
#include "Util/NoticeCenter.h"
|
|
||||||
#include "Util/uv_errno.h"
|
|
||||||
using namespace toolkit;
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
const int MAX_STACK_FRAMES = 128;
|
#include "Util/logger.h"
|
||||||
#define BroadcastOnCrashDumpArgs int &sig,const vector<vector<string> > &stack
|
#include "Util/uv_errno.h"
|
||||||
const char kBroadcastOnCrashDump[] = "kBroadcastOnCrashDump";
|
#include "System.h"
|
||||||
|
#include "Common/macros.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace toolkit;
|
||||||
|
using namespace mediakit;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#define popen _popen
|
#define popen _popen
|
||||||
@ -53,6 +52,9 @@ string System::execute(const string &cmd) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(ANDROID) && !defined(_WIN32)
|
#if !defined(ANDROID) && !defined(_WIN32)
|
||||||
|
|
||||||
|
static constexpr int MAX_STACK_FRAMES = 128;
|
||||||
|
|
||||||
static void sig_crash(int sig) {
|
static void sig_crash(int sig) {
|
||||||
signal(sig, SIG_DFL);
|
signal(sig, SIG_DFL);
|
||||||
void *array[MAX_STACK_FRAMES];
|
void *array[MAX_STACK_FRAMES];
|
||||||
@ -76,7 +78,24 @@ static void sig_crash(int sig) {
|
|||||||
#endif//__linux
|
#endif//__linux
|
||||||
}
|
}
|
||||||
free(strings);
|
free(strings);
|
||||||
NoticeCenter::Instance().emitEvent(kBroadcastOnCrashDump,sig,stack);
|
|
||||||
|
stringstream ss;
|
||||||
|
ss << "## crash date:" << getTimeStr("%Y-%m-%d %H:%M:%S") << endl;
|
||||||
|
ss << "## exe: " << exeName() << endl;
|
||||||
|
ss << "## signal: " << sig << endl;
|
||||||
|
ss << "## version: " << kServerName << endl;
|
||||||
|
ss << "## stack: " << endl;
|
||||||
|
for (size_t i = 0; i < stack.size(); ++i) {
|
||||||
|
ss << "[" << i << "]: ";
|
||||||
|
for (auto &str : stack[i]){
|
||||||
|
ss << str << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
string stack_info = ss.str();
|
||||||
|
ofstream out(StrPrinter << exeDir() << "/crash." << getpid(), ios::out | ios::binary | ios::trunc);
|
||||||
|
out << stack_info;
|
||||||
|
out.flush();
|
||||||
|
cerr << stack_info << endl;
|
||||||
}
|
}
|
||||||
#endif // !defined(ANDROID) && !defined(_WIN32)
|
#endif // !defined(ANDROID) && !defined(_WIN32)
|
||||||
|
|
||||||
@ -149,24 +168,6 @@ void System::systemSetup(){
|
|||||||
signal(SIGABRT, sig_crash);
|
signal(SIGABRT, sig_crash);
|
||||||
//忽略挂起信号
|
//忽略挂起信号
|
||||||
signal(SIGHUP, SIG_IGN);
|
signal(SIGHUP, SIG_IGN);
|
||||||
NoticeCenter::Instance().addListener(nullptr,kBroadcastOnCrashDump,[](BroadcastOnCrashDumpArgs){
|
|
||||||
stringstream ss;
|
|
||||||
ss << "## crash date:" << getTimeStr("%Y-%m-%d %H:%M:%S") << endl;
|
|
||||||
ss << "## exe: " << exeName() << endl;
|
|
||||||
ss << "## signal: " << sig << endl;
|
|
||||||
ss << "## stack: " << endl;
|
|
||||||
for (size_t i = 0; i < stack.size(); ++i) {
|
|
||||||
ss << "[" << i << "]: ";
|
|
||||||
for (auto &str : stack[i]){
|
|
||||||
ss << str << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
string stack_info = ss.str();
|
|
||||||
ofstream out(StrPrinter << exeDir() << "/crash." << getpid(), ios::out | ios::binary | ios::trunc);
|
|
||||||
out << stack_info;
|
|
||||||
out.flush();
|
|
||||||
cerr << stack_info << endl;
|
|
||||||
});
|
|
||||||
#endif// ANDROID
|
#endif// ANDROID
|
||||||
#endif//!defined(_WIN32)
|
#endif//!defined(_WIN32)
|
||||||
}
|
}
|
||||||
|
@ -220,10 +220,12 @@ extern std::vector<size_t> getBlockTypeSize();
|
|||||||
extern uint64_t getTotalMemBlockByType(int type);
|
extern uint64_t getTotalMemBlockByType(int type);
|
||||||
extern uint64_t getThisThreadMemBlockByType(int type) ;
|
extern uint64_t getThisThreadMemBlockByType(int type) ;
|
||||||
|
|
||||||
|
static void *web_api_tag = nullptr;
|
||||||
|
|
||||||
static inline void addHttpListener(){
|
static inline void addHttpListener(){
|
||||||
GET_CONFIG(bool, api_debug, API::kApiDebug);
|
GET_CONFIG(bool, api_debug, API::kApiDebug);
|
||||||
//注册监听kBroadcastHttpRequest事件
|
//注册监听kBroadcastHttpRequest事件
|
||||||
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastHttpRequest, [](BroadcastHttpRequestArgs) {
|
NoticeCenter::Instance().addListener(&web_api_tag, Broadcast::kBroadcastHttpRequest, [](BroadcastHttpRequestArgs) {
|
||||||
auto it = s_map_api.find(parser.Url());
|
auto it = s_map_api.find(parser.Url());
|
||||||
if (it == s_map_api.end()) {
|
if (it == s_map_api.end()) {
|
||||||
return;
|
return;
|
||||||
@ -1681,6 +1683,11 @@ void unInstallWebApi(){
|
|||||||
s_ffmpegMap.clear();
|
s_ffmpegMap.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
lock_guard<recursive_mutex> lck(s_proxyPusherMapMtx);
|
||||||
|
s_proxyPusherMap.clear();
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
#if defined(ENABLE_RTPPROXY)
|
#if defined(ENABLE_RTPPROXY)
|
||||||
RtpSelector::Instance().clear();
|
RtpSelector::Instance().clear();
|
||||||
@ -1688,4 +1695,5 @@ void unInstallWebApi(){
|
|||||||
s_rtpServerMap.clear();
|
s_rtpServerMap.clear();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
NoticeCenter::Instance().delListener(&web_api_tag);
|
||||||
}
|
}
|
||||||
|
@ -288,11 +288,13 @@ static void pullStreamFromOrigin(const vector<string>& urls, size_t index, size_
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *web_hook_tag = nullptr;
|
||||||
|
|
||||||
void installWebHook(){
|
void installWebHook(){
|
||||||
GET_CONFIG(bool,hook_enable,Hook::kEnable);
|
GET_CONFIG(bool,hook_enable,Hook::kEnable);
|
||||||
GET_CONFIG(string,hook_adminparams,Hook::kAdminParams);
|
GET_CONFIG(string,hook_adminparams,Hook::kAdminParams);
|
||||||
|
|
||||||
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastMediaPublish, [](BroadcastMediaPublishArgs) {
|
NoticeCenter::Instance().addListener(&web_hook_tag, Broadcast::kBroadcastMediaPublish, [](BroadcastMediaPublishArgs) {
|
||||||
GET_CONFIG(string,hook_publish,Hook::kOnPublish);
|
GET_CONFIG(string,hook_publish,Hook::kOnPublish);
|
||||||
if (!hook_enable || args._param_strs == hook_adminparams || hook_publish.empty() || sender.get_peer_ip() == "127.0.0.1") {
|
if (!hook_enable || args._param_strs == hook_adminparams || hook_publish.empty() || sender.get_peer_ip() == "127.0.0.1") {
|
||||||
invoker("", ProtocolOption());
|
invoker("", ProtocolOption());
|
||||||
@ -354,7 +356,7 @@ void installWebHook(){
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastMediaPlayed,[](BroadcastMediaPlayedArgs){
|
NoticeCenter::Instance().addListener(&web_hook_tag,Broadcast::kBroadcastMediaPlayed,[](BroadcastMediaPlayedArgs){
|
||||||
GET_CONFIG(string,hook_play,Hook::kOnPlay);
|
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"){
|
if(!hook_enable || args._param_strs == hook_adminparams || hook_play.empty() || sender.get_peer_ip() == "127.0.0.1"){
|
||||||
invoker("");
|
invoker("");
|
||||||
@ -370,7 +372,7 @@ void installWebHook(){
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastFlowReport,[](BroadcastFlowReportArgs){
|
NoticeCenter::Instance().addListener(&web_hook_tag,Broadcast::kBroadcastFlowReport,[](BroadcastFlowReportArgs){
|
||||||
GET_CONFIG(string,hook_flowreport,Hook::kOnFlowReport);
|
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"){
|
if(!hook_enable || args._param_strs == hook_adminparams || hook_flowreport.empty() || sender.get_peer_ip() == "127.0.0.1"){
|
||||||
return;
|
return;
|
||||||
@ -390,7 +392,7 @@ void installWebHook(){
|
|||||||
static const string unAuthedRealm = "unAuthedRealm";
|
static const string unAuthedRealm = "unAuthedRealm";
|
||||||
|
|
||||||
//监听kBroadcastOnGetRtspRealm事件决定rtsp链接是否需要鉴权(传统的rtsp鉴权方案)才能访问
|
//监听kBroadcastOnGetRtspRealm事件决定rtsp链接是否需要鉴权(传统的rtsp鉴权方案)才能访问
|
||||||
NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastOnGetRtspRealm,[](BroadcastOnGetRtspRealmArgs){
|
NoticeCenter::Instance().addListener(&web_hook_tag,Broadcast::kBroadcastOnGetRtspRealm,[](BroadcastOnGetRtspRealmArgs){
|
||||||
GET_CONFIG(string,hook_rtsp_realm,Hook::kOnRtspRealm);
|
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"){
|
if(!hook_enable || args._param_strs == hook_adminparams || hook_rtsp_realm.empty() || sender.get_peer_ip() == "127.0.0.1"){
|
||||||
//无需认证
|
//无需认证
|
||||||
@ -413,7 +415,7 @@ void installWebHook(){
|
|||||||
});
|
});
|
||||||
|
|
||||||
//监听kBroadcastOnRtspAuth事件返回正确的rtsp鉴权用户密码
|
//监听kBroadcastOnRtspAuth事件返回正确的rtsp鉴权用户密码
|
||||||
NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastOnRtspAuth,[](BroadcastOnRtspAuthArgs){
|
NoticeCenter::Instance().addListener(&web_hook_tag,Broadcast::kBroadcastOnRtspAuth,[](BroadcastOnRtspAuthArgs){
|
||||||
GET_CONFIG(string,hook_rtsp_auth,Hook::kOnRtspAuth);
|
GET_CONFIG(string,hook_rtsp_auth,Hook::kOnRtspAuth);
|
||||||
if(unAuthedRealm == realm || !hook_enable || hook_rtsp_auth.empty()){
|
if(unAuthedRealm == realm || !hook_enable || hook_rtsp_auth.empty()){
|
||||||
//认证失败
|
//认证失败
|
||||||
@ -440,7 +442,7 @@ void installWebHook(){
|
|||||||
|
|
||||||
|
|
||||||
//监听rtsp、rtmp源注册或注销事件
|
//监听rtsp、rtmp源注册或注销事件
|
||||||
NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastMediaChanged,[](BroadcastMediaChangedArgs){
|
NoticeCenter::Instance().addListener(&web_hook_tag,Broadcast::kBroadcastMediaChanged,[](BroadcastMediaChangedArgs){
|
||||||
GET_CONFIG(string,hook_stream_chaned,Hook::kOnStreamChanged);
|
GET_CONFIG(string,hook_stream_chaned,Hook::kOnStreamChanged);
|
||||||
if(!hook_enable || hook_stream_chaned.empty()){
|
if(!hook_enable || hook_stream_chaned.empty()){
|
||||||
return;
|
return;
|
||||||
@ -472,7 +474,7 @@ void installWebHook(){
|
|||||||
});
|
});
|
||||||
|
|
||||||
//监听播放失败(未找到特定的流)事件
|
//监听播放失败(未找到特定的流)事件
|
||||||
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastNotFoundStream, [](BroadcastNotFoundStreamArgs) {
|
NoticeCenter::Instance().addListener(&web_hook_tag, Broadcast::kBroadcastNotFoundStream, [](BroadcastNotFoundStreamArgs) {
|
||||||
if (!origin_urls.empty()) {
|
if (!origin_urls.empty()) {
|
||||||
//设置了源站,那么尝试溯源
|
//设置了源站,那么尝试溯源
|
||||||
static atomic<uint8_t> s_index { 0 };
|
static atomic<uint8_t> s_index { 0 };
|
||||||
@ -516,7 +518,7 @@ void installWebHook(){
|
|||||||
|
|
||||||
#ifdef ENABLE_MP4
|
#ifdef ENABLE_MP4
|
||||||
//录制mp4文件成功后广播
|
//录制mp4文件成功后广播
|
||||||
NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastRecordMP4,[](BroadcastRecordMP4Args){
|
NoticeCenter::Instance().addListener(&web_hook_tag,Broadcast::kBroadcastRecordMP4,[](BroadcastRecordMP4Args){
|
||||||
GET_CONFIG(string,hook_record_mp4,Hook::kOnRecordMp4);
|
GET_CONFIG(string,hook_record_mp4,Hook::kOnRecordMp4);
|
||||||
if (!hook_enable || hook_record_mp4.empty()) {
|
if (!hook_enable || hook_record_mp4.empty()) {
|
||||||
return;
|
return;
|
||||||
@ -526,7 +528,7 @@ void installWebHook(){
|
|||||||
});
|
});
|
||||||
#endif //ENABLE_MP4
|
#endif //ENABLE_MP4
|
||||||
|
|
||||||
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastRecordTs, [](BroadcastRecordTsArgs) {
|
NoticeCenter::Instance().addListener(&web_hook_tag, Broadcast::kBroadcastRecordTs, [](BroadcastRecordTsArgs) {
|
||||||
GET_CONFIG(string,hook_record_ts,Hook::kOnRecordTs);
|
GET_CONFIG(string,hook_record_ts,Hook::kOnRecordTs);
|
||||||
if (!hook_enable || hook_record_ts.empty()) {
|
if (!hook_enable || hook_record_ts.empty()) {
|
||||||
return;
|
return;
|
||||||
@ -535,7 +537,7 @@ void installWebHook(){
|
|||||||
do_http_hook(hook_record_ts, getRecordInfo(info), nullptr);
|
do_http_hook(hook_record_ts, getRecordInfo(info), nullptr);
|
||||||
});
|
});
|
||||||
|
|
||||||
NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastShellLogin,[](BroadcastShellLoginArgs){
|
NoticeCenter::Instance().addListener(&web_hook_tag,Broadcast::kBroadcastShellLogin,[](BroadcastShellLoginArgs){
|
||||||
GET_CONFIG(string,hook_shell_login,Hook::kOnShellLogin);
|
GET_CONFIG(string,hook_shell_login,Hook::kOnShellLogin);
|
||||||
if(!hook_enable || hook_shell_login.empty() || sender.get_peer_ip() == "127.0.0.1"){
|
if(!hook_enable || hook_shell_login.empty() || sender.get_peer_ip() == "127.0.0.1"){
|
||||||
invoker("");
|
invoker("");
|
||||||
@ -554,7 +556,7 @@ void installWebHook(){
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastStreamNoneReader,[](BroadcastStreamNoneReaderArgs) {
|
NoticeCenter::Instance().addListener(&web_hook_tag,Broadcast::kBroadcastStreamNoneReader,[](BroadcastStreamNoneReaderArgs) {
|
||||||
if (!origin_urls.empty()) {
|
if (!origin_urls.empty()) {
|
||||||
//边沿站无人观看时立即停止溯源
|
//边沿站无人观看时立即停止溯源
|
||||||
sender.close(false);
|
sender.close(false);
|
||||||
@ -599,7 +601,7 @@ void installWebHook(){
|
|||||||
//如果用户客户端不支持cookie,那么ZLMediaKit会根据url参数查找cookie并追踪用户,
|
//如果用户客户端不支持cookie,那么ZLMediaKit会根据url参数查找cookie并追踪用户,
|
||||||
//如果没有url参数,客户端又不支持cookie,那么会根据ip和端口追踪用户
|
//如果没有url参数,客户端又不支持cookie,那么会根据ip和端口追踪用户
|
||||||
//追踪用户的目的是为了缓存上次鉴权结果,减少鉴权次数,提高性能
|
//追踪用户的目的是为了缓存上次鉴权结果,减少鉴权次数,提高性能
|
||||||
NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastHttpAccess,[](BroadcastHttpAccessArgs){
|
NoticeCenter::Instance().addListener(&web_hook_tag,Broadcast::kBroadcastHttpAccess,[](BroadcastHttpAccessArgs){
|
||||||
GET_CONFIG(string,hook_http_access,Hook::kOnHttpAccess);
|
GET_CONFIG(string,hook_http_access,Hook::kOnHttpAccess);
|
||||||
if(sender.get_peer_ip() == "127.0.0.1" || parser.Params() == hook_adminparams){
|
if(sender.get_peer_ip() == "127.0.0.1" || parser.Params() == hook_adminparams){
|
||||||
//如果是本机或超级管理员访问,那么不做访问鉴权;权限有效期1个小时
|
//如果是本机或超级管理员访问,那么不做访问鉴权;权限有效期1个小时
|
||||||
@ -646,4 +648,5 @@ void installWebHook(){
|
|||||||
|
|
||||||
void unInstallWebHook(){
|
void unInstallWebHook(){
|
||||||
g_keepalive_timer.reset();
|
g_keepalive_timer.reset();
|
||||||
|
NoticeCenter::Instance().delListener(&web_hook_tag);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user