1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

Config: Support overwrote by environment variables. (#3197)

* Support overwrite by environment virable.

* modify duplicated code

* Config: Add stat for envrionment config.

* Config: Fix utest fail.

Co-authored-by: pengfei.ma <pengfei.ma@ctechm.com>
Co-authored-by: winlin <winlin@vip.126.com>
This commit is contained in:
mapengfei53 2022-10-03 13:00:12 +08:00 committed by GitHub
parent dc20d5ddbc
commit eb04f92176
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 474 additions and 84 deletions

File diff suppressed because it is too large Load diff

View file

@ -27,6 +27,9 @@ using namespace std;
// Whether we are in docker, defined in main module.
extern bool _srs_in_docker;
// Whether setup config by environment variables.
extern bool _srs_config_by_env;
// 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"
@ -159,6 +162,7 @@ void srs_build_features(stringstream& ss)
SRS_CHECK_FEATURE(exec, ss);
SRS_CHECK_FEATURE(transcode, ss);
SRS_CHECK_FEATURE(security, ss);
SRS_CHECK_FEATURE2(_srs_config_by_env, "env", ss);
SRS_CHECK_FEATURE2(_srs_cls->enabled(), "cls", ss);
SRS_CHECK_FEATURE3(_srs_cls->nn_logs(), "logs", _srs_cls->nn_logs(), ss);

View file

@ -1421,7 +1421,7 @@ string srs_string_dumps_hex(const char* str, int length, int limit, char seperat
return string(buf, len);
}
string srs_getenv(string key)
string srs_getenv(const string& key)
{
string ekey = key;
if (srs_string_starts_with(key, "$")) {
@ -1432,6 +1432,15 @@ string srs_getenv(string key)
return "";
}
std::string::iterator it;
for (it = ekey.begin(); it != ekey.end(); ++it) {
if (*it >= 'a' && *it <= 'z') {
*it += ('A' - 'a');
} else if (*it == '.') {
*it = '_';
}
}
char* value = ::getenv(ekey.c_str());
if (value) {
return value;

View file

@ -685,7 +685,7 @@ extern std::string srs_string_dumps_hex(const char* str, int length, int limit,
// Get ENV variable, which may starts with $.
// srs_getenv("EIP") === srs_getenv("$EIP")
extern std::string srs_getenv(std::string key);
extern std::string srs_getenv(const std::string& key);
#endif

View file

@ -68,10 +68,13 @@ extern const char* _srs_version;
// @global main SRS server, for debugging
SrsServer* _srs_server = NULL;
// Whether setup config by environment variables, see https://github.com/ossrs/srs/issues/2277
bool _srs_config_by_env = false;
/**
* main entrance.
*/
srs_error_t do_main(int argc, char** argv)
srs_error_t do_main(int argc, char** argv, char** envp)
{
srs_error_t err = srs_success;
@ -129,13 +132,22 @@ srs_error_t do_main(int argc, char** argv)
if ((err = _srs_log->initialize()) != srs_success) {
return srs_error_wrap(err, "log initialize");
}
// Detect whether set SRS config by envrionment variables.
for (char** pp = envp; *pp; pp++) {
char* p = *pp;
if (p[0] == 'S' && p[1] == 'R' && p[2] == 'S' && p[3] == '_') {
_srs_config_by_env = true;
break;
}
}
// config already applied to log.
srs_trace2(TAG_MAIN, "%s, %s", RTMP_SIG_SRS_SERVER, RTMP_SIG_SRS_LICENSE);
srs_trace("%s, %s", RTMP_SIG_SRS_SERVER, RTMP_SIG_SRS_LICENSE);
srs_trace("authors: %sand %s", RTMP_SIG_SRS_AUTHORS, SRS_CONSTRIBUTORS);
srs_trace("cwd=%s, work_dir=%s, build: %s, configure: %s, uname: %s, osx: %d, pkg: %s, region: %s, source: %s",
_srs_config->cwd().c_str(), cwd.c_str(), SRS_BUILD_DATE, SRS_USER_CONFIGURE, SRS_UNAME, SRS_OSX_BOOL, SRS_PACKAGER,
srs_getenv("SRS_REGION").c_str(), srs_getenv("SRS_SOURCE").c_str());
srs_trace("cwd=%s, work_dir=%s, build: %s, configure: %s, uname: %s, osx: %d, env: %d, pkg: %s",
_srs_config->cwd().c_str(), cwd.c_str(), SRS_BUILD_DATE, SRS_USER_CONFIGURE, SRS_UNAME, SRS_OSX_BOOL,
_srs_config_by_env, SRS_PACKAGER);
srs_trace("configure detail: " SRS_CONFIGURE);
#ifdef SRS_EMBEDED_TOOL_CHAIN
srs_trace("crossbuild tool chain: " SRS_EMBEDED_TOOL_CHAIN);
@ -208,9 +220,9 @@ srs_error_t do_main(int argc, char** argv)
return err;
}
int main(int argc, char** argv)
int main(int argc, char** argv, char** envp)
{
srs_error_t err = do_main(argc, argv);
srs_error_t err = do_main(argc, argv, envp);
if (err != srs_success) {
srs_error("Failed, %s", srs_error_desc(err).c_str());

View file

@ -35,6 +35,7 @@ ISrsContext* _srs_context = NULL;
SrsConfig* _srs_config = NULL;
SrsServer* _srs_server = NULL;
bool _srs_in_docker = false;
bool _srs_config_by_env = false;
#include <srs_app_st.hpp>