From ee376da0c6b49f0910b507ac6e5735b58c9dd7f3 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 7 Aug 2021 23:17:15 +0800 Subject: [PATCH] Fix #2508, Support features query by API. 4.0.149 --- CHANGELOG.md | 1 + trunk/src/app/srs_app_config.cpp | 129 ++++++++++++++++++--- trunk/src/app/srs_app_config.hpp | 9 ++ trunk/src/app/srs_app_latest_version.cpp | 141 ++++++++++++++++++++--- trunk/src/app/srs_app_latest_version.hpp | 2 +- trunk/src/core/srs_core_version4.hpp | 2 +- 6 files changed, 247 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea0815de1..741067d53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The changelog for SRS. ## SRS 4.0 Changelog +* v4.0, 2021-08-07, Fix [#2508](https://github.com/ossrs/srs/pull/2508), Support features query by API. 4.0.149 * v4.0, 2021-07-25, Fix build failed. 4.0.146 * v4.0, 2021-07-24, Merge [#2373](https://github.com/ossrs/srs/pull/2373), RTC: Fix NACK negotiation bug for Firefox. 4.0.145 * v4.0, 2021-07-24, Merge [#2483](https://github.com/ossrs/srs/pull/2483), RTC: Support statistic for HTTP-API, HTTP-Callback and Security. 4.0.144 diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index 262418621..80f6d8e4a 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -3617,6 +3617,7 @@ srs_error_t SrsConfig::check_normal_config() && n != "ff_log_level" && n != "grace_final_wait" && n != "force_grace_quit" && n != "grace_start_wait" && n != "empty_ip_ok" && n != "disable_daemon_for_docker" && n != "inotify_auto_reload" && n != "auto_reload_for_docker" && n != "tcmalloc_release_rate" + && n != "query_latest_version" && n != "circuit_breaker" && n != "is_full" ) { return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal directive %s", n.c_str()); @@ -5672,20 +5673,26 @@ int SrsConfig::get_global_chunk_size() return ::atoi(conf->arg0().c_str()); } -bool SrsConfig::get_forward_enabled(string vhost) -{ +bool SrsConfig::get_forward_enabled(string vhost) { static bool DEFAULT = false; - + SrsConfDirective* conf = get_vhost(vhost); if (!conf) { return DEFAULT; } - - conf = conf->get("forward"); + + return get_forward_enabled(conf); +} + +bool SrsConfig::get_forward_enabled(SrsConfDirective* vhost) +{ + static bool DEFAULT = false; + + SrsConfDirective* conf = vhost->get("forward"); if (!conf) { return DEFAULT; } - + conf = conf->get("enabled"); if (!conf || conf->arg0().empty()) { return DEFAULT; @@ -5723,7 +5730,19 @@ bool SrsConfig::get_vhost_http_hooks_enabled(string vhost) { static bool DEFAULT = false; - SrsConfDirective* conf = get_vhost_http_hooks(vhost); + SrsConfDirective* conf = get_vhost(vhost); + if (!conf) { + return DEFAULT; + } + + return get_vhost_http_hooks_enabled(conf); +} + +bool SrsConfig::get_vhost_http_hooks_enabled(SrsConfDirective* vhost) +{ + static bool DEFAULT = false; + + SrsConfDirective* conf = vhost->get("http_hooks"); if (!conf) { return DEFAULT; } @@ -6053,13 +6072,20 @@ bool SrsConfig::get_security_enabled(string vhost) if (!conf) { return DEFAULT; } + + return get_security_enabled(conf); +} + +bool SrsConfig::get_security_enabled(SrsConfDirective* vhost) +{ + static bool DEFAULT = false; - SrsConfDirective* security = conf->get("security"); - if (!security) { + SrsConfDirective* conf = vhost->get("security"); + if (!conf) { return DEFAULT; } - conf = security->get("enabled"); + conf = conf->get("enabled"); if (!conf || conf->arg0().empty()) { return DEFAULT; } @@ -6534,7 +6560,19 @@ bool SrsConfig::get_exec_enabled(string vhost) { static bool DEFAULT = false; - SrsConfDirective* conf = get_exec(vhost); + SrsConfDirective* conf = get_vhost(vhost); + if (!conf) { + return DEFAULT; + } + + return get_exec_enabled(conf); +} + +bool SrsConfig::get_exec_enabled(SrsConfDirective* vhost) +{ + static bool DEFAULT = false; + + SrsConfDirective* conf = vhost->get("exec"); if (!conf) { return DEFAULT; } @@ -6743,10 +6781,22 @@ SrsConfDirective* SrsConfig::get_dash(string vhost) } bool SrsConfig::get_dash_enabled(string vhost) +{ + static bool DEFAULT = false; + + SrsConfDirective* conf = get_vhost(vhost); + if (!conf) { + return DEFAULT; + } + + return get_dash_enabled(conf); +} + +bool SrsConfig::get_dash_enabled(SrsConfDirective* vhost) { static bool DEFAULT = false; - SrsConfDirective* conf = get_dash(vhost); + SrsConfDirective* conf = vhost->get("dash"); if (!conf) { return DEFAULT; } @@ -6853,8 +6903,20 @@ SrsConfDirective* SrsConfig::get_hls(string vhost) bool SrsConfig::get_hls_enabled(string vhost) { static bool DEFAULT = false; - - SrsConfDirective* conf = get_hls(vhost); + + SrsConfDirective* conf = get_vhost(vhost); + if (!conf) { + return DEFAULT; + } + + return get_hls_enabled(conf); +} + +bool SrsConfig::get_hls_enabled(SrsConfDirective* vhost) +{ + static bool DEFAULT = false; + + SrsConfDirective* conf = vhost->get("hls"); if (!conf) { return DEFAULT; @@ -7260,7 +7322,19 @@ bool SrsConfig::get_hds_enabled(const string &vhost) { static bool DEFAULT = false; - SrsConfDirective* conf = get_hds(vhost); + SrsConfDirective* conf = get_vhost(vhost); + if (!conf) { + return DEFAULT; + } + + return get_hds_enabled(conf); +} + +bool SrsConfig::get_hds_enabled(SrsConfDirective* vhost) +{ + static bool DEFAULT = false; + + SrsConfDirective* conf = vhost->get("hds"); if (!conf) { return DEFAULT; } @@ -7337,8 +7411,20 @@ SrsConfDirective* SrsConfig::get_dvr(string vhost) bool SrsConfig::get_dvr_enabled(string vhost) { static bool DEFAULT = false; - - SrsConfDirective* conf = get_dvr(vhost); + + SrsConfDirective* conf = get_vhost(vhost); + if (!conf) { + return DEFAULT; + } + + return get_dvr_enabled(conf); +} + +bool SrsConfig::get_dvr_enabled(SrsConfDirective* vhost) +{ + static bool DEFAULT = false; + + SrsConfDirective* conf = vhost->get("dvr"); if (!conf) { return DEFAULT; } @@ -8116,7 +8202,14 @@ bool SrsConfig::get_vhost_http_remux_enabled(string vhost) return DEFAULT; } - conf = conf->get("http_remux"); + return get_vhost_http_remux_enabled(conf); +} + +bool SrsConfig::get_vhost_http_remux_enabled(SrsConfDirective* vhost) +{ + static bool DEFAULT = false; + + SrsConfDirective* conf = vhost->get("http_remux"); if (!conf) { return DEFAULT; } diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index 74c193e66..4a54d51a2 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -643,6 +643,7 @@ private: public: // Whether the forwarder enabled. virtual bool get_forward_enabled(std::string vhost); + virtual bool get_forward_enabled(SrsConfDirective* vhost); // Get the forward directive of vhost. virtual SrsConfDirective* get_forwards(std::string vhost); @@ -686,6 +687,7 @@ public: // Whether vhost http-hooks enabled. // @remark, if not enabled, donot callback all http hooks. virtual bool get_vhost_http_hooks_enabled(std::string vhost); + virtual bool get_vhost_http_hooks_enabled(SrsConfDirective* vhost); // Get the on_connect callbacks of vhost. // @return the on_connect callback directive, the args is the url to callback. virtual SrsConfDirective* get_vhost_on_connect(std::string vhost); @@ -761,6 +763,7 @@ public: public: // Whether the secrity of vhost enabled. virtual bool get_security_enabled(std::string vhost); + virtual bool get_security_enabled(SrsConfDirective* vhost); // Get the security rules. virtual SrsConfDirective* get_security_rules(std::string vhost); // vhost transcode section @@ -843,6 +846,7 @@ private: public: // Whether the exec is enabled of vhost. virtual bool get_exec_enabled(std::string vhost); + virtual bool get_exec_enabled(SrsConfDirective* vhost); // Get all exec publish directives of vhost. virtual std::vector get_exec_publishs(std::string vhost); // vhost ingest section @@ -880,6 +884,7 @@ private: public: // Whether DASH is enabled. virtual bool get_dash_enabled(std::string vhost); + virtual bool get_dash_enabled(SrsConfDirective* vhost); // Get the duration of segment in srs_utime_t. virtual srs_utime_t get_dash_fragment(std::string vhost); // Get the period to update MPD in srs_utime_t. @@ -897,6 +902,7 @@ private: public: // Whether HLS is enabled. virtual bool get_hls_enabled(std::string vhost); + virtual bool get_hls_enabled(SrsConfDirective* vhost); // Get the HLS m3u8 list ts segment entry prefix info. virtual std::string get_hls_entry_prefix(std::string vhost); // Get the HLS ts/m3u8 file store path. @@ -954,6 +960,7 @@ private: public: // Whether HDS is enabled. virtual bool get_hds_enabled(const std::string &vhost); + virtual bool get_hds_enabled(SrsConfDirective* vhost); // Get the HDS file store path. virtual std::string get_hds_path(const std::string &vhost); // Get the hds fragment time, in srs_utime_t. @@ -968,6 +975,7 @@ private: public: // Whether dvr is enabled. virtual bool get_dvr_enabled(std::string vhost); + virtual bool get_dvr_enabled(SrsConfDirective* vhost); // Get the filter of dvr to apply to. // @remark user can use srs_config_apply_filter(conf, req):bool to check it. virtual SrsConfDirective* get_dvr_apply(std::string vhost); @@ -1043,6 +1051,7 @@ public: public: // Get whether vhost enabled http flv live stream virtual bool get_vhost_http_remux_enabled(std::string vhost); + virtual bool get_vhost_http_remux_enabled(SrsConfDirective* vhost); // Get the fast cache duration for http audio live stream. virtual srs_utime_t get_vhost_http_remux_fast_cache(std::string vhost); // Get the http flv live stream mount point for vhost. diff --git a/trunk/src/app/srs_app_latest_version.cpp b/trunk/src/app/srs_app_latest_version.cpp index 1d3c60221..bcaa26e87 100644 --- a/trunk/src/app/srs_app_latest_version.cpp +++ b/trunk/src/app/srs_app_latest_version.cpp @@ -42,10 +42,103 @@ using namespace std; // Whether we are in docker, defined in main module. extern bool _srs_in_docker; +// Check the feature by cond +#define SRS_CHECK_FEATURE(cond, ss) if (cond) ss << "&" << #cond << "=1" +#define SRS_CHECK_FEATURE2(cond, key, ss) if (cond) ss << "&" << key << "=1" +#define SRS_CHECK_FEATURE3(cond, key, value, ss) if (cond) ss << "&" << key << "=" << value + void srs_build_features(stringstream& ss) { - ss << "&docker=" << _srs_in_docker - << "&packager=" << SRS_PACKAGER; + if (SRS_OSX_BOOL) { + ss << "&os=mac"; + } else { + ss << "&os=linux"; + } + + SRS_CHECK_FEATURE2(_srs_in_docker, "docker", ss); + SRS_CHECK_FEATURE3(!string(SRS_PACKAGER).empty(), "packager", SRS_PACKAGER, ss); + SRS_CHECK_FEATURE2(SRS_CROSSBUILD_BOOL, "cross", ss); + + SRS_CHECK_FEATURE2(SRS_RTC_BOOL && _srs_config->get_rtc_server_enabled(), "rtc", ss); + SRS_CHECK_FEATURE2(SRS_SRT_BOOL && _srs_config->get_srt_enabled(), "srt", ss); + SRS_CHECK_FEATURE2(_srs_config->get_http_api_enabled(), "api", ss); + SRS_CHECK_FEATURE2(_srs_config->get_https_api_enabled(), "https", ss); + SRS_CHECK_FEATURE2(_srs_config->get_raw_api(), "raw", ss); + + int nn_vhosts = 0; + bool rtsp = false, forward = false, ingest = false, edge = false, hls = false, dvr = false, flv = false; + bool hooks = false, dash = false, hds = false, exec = false, transcode = false, security = false; + + SrsConfDirective* root = _srs_config->get_root(); + // Note that we limit the loop, never detect all configs. + for (int i = 0; i < (int)root->directives.size() && i < 128; i++) { + SrsConfDirective* conf = root->at(i); + + if (!rtsp && conf->is_stream_caster() && _srs_config->get_stream_caster_enabled(conf)) { + if (_srs_config->get_stream_caster_engine(conf) == "rtsp") { + rtsp = true; + } + } + + if (conf->is_vhost() && _srs_config->get_vhost_enabled(conf)) { + nn_vhosts++; + if (!forward && _srs_config->get_forward_enabled(conf)) { + forward = true; + } + if (!edge && _srs_config->get_vhost_is_edge(conf)) { + edge = true; + } + if (!hls && _srs_config->get_hls_enabled(conf)) { + hls = true; + } + if (!dvr && _srs_config->get_dvr_enabled(conf)) { + dvr = true; + } + if (!flv && _srs_config->get_vhost_http_remux_enabled(conf)) { + flv = true; + } + if (!hooks && _srs_config->get_vhost_http_hooks_enabled(conf)) { + hooks = true; + } + if (!dash && _srs_config->get_dash_enabled(conf)) { + dash = true; + } + if (!hds && _srs_config->get_hds_enabled(conf)) { + hds = true; + } + if (!exec && _srs_config->get_exec_enabled(conf)) { + exec = true; + } + if (!security && _srs_config->get_security_enabled(conf)) { + security = true; + } + + for (int j = 0; j < (int)conf->directives.size(); j++) { + SrsConfDirective* prop = conf->directives.at(j); + if (!ingest && prop->name == "ingest" && _srs_config->get_ingest_enabled(prop)) { + ingest = true; + } + if (!transcode && prop->name == "transcode" && _srs_config->get_transcode_enabled(prop)) { + transcode = true; + } + } + } + } + + SRS_CHECK_FEATURE2(nn_vhosts, "vhosts", ss); + SRS_CHECK_FEATURE(rtsp, ss); + SRS_CHECK_FEATURE(forward, ss); + SRS_CHECK_FEATURE(ingest, ss); + SRS_CHECK_FEATURE(edge, ss); + SRS_CHECK_FEATURE(hls, ss); + SRS_CHECK_FEATURE(dvr, ss); + SRS_CHECK_FEATURE(flv, ss); + SRS_CHECK_FEATURE(hooks, ss); + SRS_CHECK_FEATURE(dash, ss); + SRS_CHECK_FEATURE(hds, ss); + SRS_CHECK_FEATURE(exec, ss); + SRS_CHECK_FEATURE(transcode, ss); + SRS_CHECK_FEATURE(security, ss); } SrsLatestVersion::SrsLatestVersion() @@ -82,34 +175,48 @@ srs_error_t SrsLatestVersion::cycle() { srs_error_t err = srs_success; - srs_utime_t starttime = srs_update_system_time(); - if ((err = query_latest_version()) != srs_success) { - srs_warn("query err %s", srs_error_desc(err).c_str()); - srs_freep(err); // Ignore any error. - } + if (true) { + string url; + srs_utime_t starttime = srs_update_system_time(); + if ((err = query_latest_version(url)) != srs_success) { + srs_warn("query err %s", srs_error_desc(err).c_str()); + srs_freep(err); // Ignore any error. + } - srs_utime_t first_random_wait = 0; - srs_random_generate((char*)&first_random_wait, 8); - first_random_wait = srs_utime_t(uint64_t((first_random_wait + starttime + getpid())) % (60 * 60)) * SRS_UTIME_SECONDS; // in s. + srs_utime_t first_random_wait = 0; + srs_random_generate((char *) &first_random_wait, 8); + first_random_wait = srs_utime_t(uint64_t((first_random_wait + starttime + getpid())) % (60 * 60)) * SRS_UTIME_SECONDS; // in s. - srs_trace("Startup query id=%s, eip=%s, match=%s, stable=%s, wait=%ds, cost=%dms", server_id_.c_str(), srs_get_public_internet_address().c_str(), match_version_.c_str(), stable_version_.c_str(), srsu2msi(first_random_wait)/1000, srsu2msi(srs_update_system_time() - starttime)); - srs_usleep(first_random_wait); + srs_trace("Startup query id=%s, eip=%s, match=%s, stable=%s, wait=%ds, cost=%dms, url=%s", + server_id_.c_str(), srs_get_public_internet_address().c_str(), match_version_.c_str(), + stable_version_.c_str(), srsu2msi(first_random_wait) / 1000, srsu2msi(srs_update_system_time() - starttime), + url.c_str()); + srs_usleep(first_random_wait); + } while (true) { - starttime = srs_update_system_time(); - if ((err = query_latest_version()) != srs_success) { + if ((err = trd_->pull()) != srs_success) { + break; + } + + string url; + srs_utime_t starttime = srs_update_system_time(); + if ((err = query_latest_version(url)) != srs_success) { srs_warn("query err %s", srs_error_desc(err).c_str()); srs_freep(err); // Ignore any error. } - srs_trace("Finish query id=%s, eip=%s, match=%s, stable=%s, cost=%dms", server_id_.c_str(), srs_get_public_internet_address().c_str(), match_version_.c_str(), stable_version_.c_str(), srsu2msi(srs_update_system_time() - starttime)); + srs_trace("Finish query id=%s, eip=%s, match=%s, stable=%s, cost=%dms, url=%s", + server_id_.c_str(), srs_get_public_internet_address().c_str(), match_version_.c_str(), + stable_version_.c_str(), srsu2msi(srs_update_system_time() - starttime), url.c_str()); + srs_usleep(3600 * SRS_UTIME_SECONDS); // Every an hour. } return err; } -srs_error_t SrsLatestVersion::query_latest_version() +srs_error_t SrsLatestVersion::query_latest_version(string& url) { srs_error_t err = srs_success; @@ -121,7 +228,7 @@ srs_error_t SrsLatestVersion::query_latest_version() << "&eip=" << srs_get_public_internet_address() << "&ts=" << srsu2ms(srs_get_system_time()); srs_build_features(ss); - string url = ss.str(); + url = ss.str(); SrsHttpUri uri; if ((err = uri.initialize(url)) != srs_success) { diff --git a/trunk/src/app/srs_app_latest_version.hpp b/trunk/src/app/srs_app_latest_version.hpp index 6c1d19b0a..8aa81db81 100644 --- a/trunk/src/app/srs_app_latest_version.hpp +++ b/trunk/src/app/srs_app_latest_version.hpp @@ -51,7 +51,7 @@ public: public: virtual srs_error_t cycle(); private: - srs_error_t query_latest_version(); + srs_error_t query_latest_version(std::string& url); }; #endif diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index b7a0daa10..e74d7a919 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 0 -#define VERSION_REVISION 148 +#define VERSION_REVISION 149 #endif