|
|
@ -902,7 +902,7 @@ srs_error_t SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage*
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
// the rpc is required.
|
|
|
|
// the rpc is required.
|
|
|
|
// the allowd rpc method check.
|
|
|
|
// the allowd rpc method check.
|
|
|
|
if (rpc.empty() || (rpc != "reload" && rpc != "query" && rpc != "raw" && rpc != "update")) {
|
|
|
|
if (rpc.empty() || rpc != "reload") {
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW);
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -916,312 +916,6 @@ srs_error_t SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage*
|
|
|
|
return srs_api_response_code(w, r, ERROR_SUCCESS);
|
|
|
|
return srs_api_response_code(w, r, ERROR_SUCCESS);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// for rpc=query, to get the configs of server.
|
|
|
|
|
|
|
|
// @param scope the scope to query for config, it can be:
|
|
|
|
|
|
|
|
// global, the configs belongs to the root, donot includes any sub directives.
|
|
|
|
|
|
|
|
// minimal, the minimal summary of server, for preview stream to got the port serving.
|
|
|
|
|
|
|
|
// vhost, the configs for specified vhost by @param vhost.
|
|
|
|
|
|
|
|
// @param vhost the vhost name for @param scope is vhost to query config.
|
|
|
|
|
|
|
|
// for the default vhost, must be __defaultVhost__
|
|
|
|
|
|
|
|
if (rpc == "query") {
|
|
|
|
|
|
|
|
if (!allow_query) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_DISABLED);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::string scope = r->query_get("scope");
|
|
|
|
|
|
|
|
std::string vhost = r->query_get("vhost");
|
|
|
|
|
|
|
|
if (scope.empty() || (scope != "global" && scope != "vhost" && scope != "minimal")) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_NOT_ALLOWED);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (scope == "vhost") {
|
|
|
|
|
|
|
|
// query vhost scope.
|
|
|
|
|
|
|
|
if (vhost.empty()) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SrsConfDirective* root = _srs_config->get_root();
|
|
|
|
|
|
|
|
SrsConfDirective* conf = root->get("vhost", vhost);
|
|
|
|
|
|
|
|
if (!conf) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SrsJsonObject* data = SrsJsonAny::object();
|
|
|
|
|
|
|
|
obj->set("vhost", data);
|
|
|
|
|
|
|
|
if ((err = _srs_config->vhost_to_json(conf, data)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (scope == "minimal") {
|
|
|
|
|
|
|
|
SrsJsonObject* data = SrsJsonAny::object();
|
|
|
|
|
|
|
|
obj->set("minimal", data);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// query minimal scope.
|
|
|
|
|
|
|
|
if ((err = _srs_config->minimal_to_json(data)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
SrsJsonObject* data = SrsJsonAny::object();
|
|
|
|
|
|
|
|
obj->set("global", data);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// query global scope.
|
|
|
|
|
|
|
|
if ((err = _srs_config->global_to_json(data)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return srs_api_response(w, r, obj->dumps());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// for rpc=update, to update the configs of server.
|
|
|
|
|
|
|
|
// @scope the scope to update for config.
|
|
|
|
|
|
|
|
// @value the updated value for scope.
|
|
|
|
|
|
|
|
// @param the extra param for scope.
|
|
|
|
|
|
|
|
// @data the extra data for scope.
|
|
|
|
|
|
|
|
// possible updates:
|
|
|
|
|
|
|
|
// @scope @value value-description
|
|
|
|
|
|
|
|
// listen 1935,1936 the port list.
|
|
|
|
|
|
|
|
// pid ./objs/srs.pid the pid file of srs.
|
|
|
|
|
|
|
|
// chunk_size 60000 the global RTMP chunk_size.
|
|
|
|
|
|
|
|
// ff_log_dir ./objs the dir for ffmpeg log.
|
|
|
|
|
|
|
|
// srs_log_tank file the tank to log, file or console.
|
|
|
|
|
|
|
|
// srs_log_level trace the level of log, verbose, info, trace, warn, error.
|
|
|
|
|
|
|
|
// srs_log_file ./objs/srs.log the log file when tank is file.
|
|
|
|
|
|
|
|
// max_connections 1000 the max connections of srs.
|
|
|
|
|
|
|
|
// utc_time false whether enable utc time.
|
|
|
|
|
|
|
|
// pithy_print_ms 10000 the pithy print interval in ms.
|
|
|
|
|
|
|
|
// vhost specified updates:
|
|
|
|
|
|
|
|
// @scope @value @param @data description
|
|
|
|
|
|
|
|
// vhost ossrs.net create - create vhost ossrs.net
|
|
|
|
|
|
|
|
// vhost ossrs.net update new.ossrs.net the new name to update vhost
|
|
|
|
|
|
|
|
// dvr specified updates:
|
|
|
|
|
|
|
|
// @scope @value @param @data description
|
|
|
|
|
|
|
|
// dvr ossrs.net enable live/livestream enable the dvr of stream
|
|
|
|
|
|
|
|
// dvr ossrs.net disable live/livestream disable the dvr of stream
|
|
|
|
|
|
|
|
if (rpc == "update") {
|
|
|
|
|
|
|
|
if (!allow_update) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_DISABLED);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::string scope = r->query_get("scope");
|
|
|
|
|
|
|
|
std::string value = r->query_get("value");
|
|
|
|
|
|
|
|
if (scope.empty()) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_NOT_ALLOWED);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (scope != "listen" && scope != "pid" && scope != "chunk_size"
|
|
|
|
|
|
|
|
&& scope != "ff_log_dir" && scope != "srs_log_tank" && scope != "srs_log_level"
|
|
|
|
|
|
|
|
&& scope != "srs_log_file" && scope != "max_connections" && scope != "utc_time"
|
|
|
|
|
|
|
|
&& scope != "pithy_print_ms" && scope != "vhost" && scope != "dvr"
|
|
|
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_NOT_ALLOWED);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool applied = false;
|
|
|
|
|
|
|
|
string extra = "";
|
|
|
|
|
|
|
|
if (scope == "listen") {
|
|
|
|
|
|
|
|
vector<string> eps = srs_string_split(value, ",");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool invalid = eps.empty();
|
|
|
|
|
|
|
|
for (int i = 0; i < (int)eps.size(); i++) {
|
|
|
|
|
|
|
|
string ep = eps.at(i);
|
|
|
|
|
|
|
|
int port = ::atoi(ep.c_str());
|
|
|
|
|
|
|
|
if (port <= 2 || port >= 65535) {
|
|
|
|
|
|
|
|
invalid = true;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (invalid) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((err = _srs_config->raw_set_listen(eps, applied)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (scope == "pid") {
|
|
|
|
|
|
|
|
if (value.empty() || !srs_string_starts_with(value, "./", "/tmp/", "/var/") || !srs_string_ends_with(value, ".pid")) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((err = _srs_config->raw_set_pid(value, applied)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (scope == "chunk_size") {
|
|
|
|
|
|
|
|
int csv = ::atoi(value.c_str());
|
|
|
|
|
|
|
|
if (csv < 128 || csv > 65535 || !srs_is_digit_number(value)) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((err = _srs_config->raw_set_chunk_size(value, applied)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (scope == "ff_log_dir") {
|
|
|
|
|
|
|
|
if (value.empty() || (value != "/dev/null" && !srs_string_starts_with(value, "./", "/tmp/", "/var/"))) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((err = _srs_config->raw_set_ff_log_dir(value, applied)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (scope == "srs_log_tank") {
|
|
|
|
|
|
|
|
if (value.empty() || (value != "file" && value != "console")) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((err = _srs_config->raw_set_srs_log_tank(value, applied)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (scope == "srs_log_level") {
|
|
|
|
|
|
|
|
if (value != "verbose" && value != "info" && value != "trace" && value != "warn" && value != "error") {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((err = _srs_config->raw_set_srs_log_level(value, applied)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (scope == "srs_log_file") {
|
|
|
|
|
|
|
|
if (value.empty() || !srs_string_starts_with(value, "./", "/tmp/", "/var/") || !srs_string_ends_with(value, ".log")) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((err = _srs_config->raw_set_srs_log_file(value, applied)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (scope == "max_connections") {
|
|
|
|
|
|
|
|
int mcv = ::atoi(value.c_str());
|
|
|
|
|
|
|
|
if (mcv < 10 || mcv > 65535 || !srs_is_digit_number(value)) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((err = _srs_config->raw_set_max_connections(value, applied)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (scope == "utc_time") {
|
|
|
|
|
|
|
|
if (!srs_is_boolean(value)) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((err = _srs_config->raw_set_utc_time(srs_config_bool2switch(value), applied)) != srs_success) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, srs_error_wrap(err, "raw api update utc_time=%s", value.c_str()));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (scope == "pithy_print_ms") {
|
|
|
|
|
|
|
|
int ppmv = ::atoi(value.c_str());
|
|
|
|
|
|
|
|
if (ppmv < 100 || ppmv > 300000 || !srs_is_digit_number(value)) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((err = _srs_config->raw_set_pithy_print_ms(value, applied)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (scope == "vhost") {
|
|
|
|
|
|
|
|
std::string param = r->query_get("param");
|
|
|
|
|
|
|
|
std::string data = r->query_get("data");
|
|
|
|
|
|
|
|
if (param != "create" && param != "update" && param != "delete" && param != "disable" && param != "enable") {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_NOT_ALLOWED);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
extra += " " + param;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (param == "create") {
|
|
|
|
|
|
|
|
// when create, the vhost must not exists.
|
|
|
|
|
|
|
|
if (param.empty() || _srs_config->get_vhost(value, false)) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((err = _srs_config->raw_create_vhost(value, applied)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (param == "update") {
|
|
|
|
|
|
|
|
extra += " to " + data;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// when update, the vhost must exists and disabled.
|
|
|
|
|
|
|
|
SrsConfDirective* vhost = _srs_config->get_vhost(value, false);
|
|
|
|
|
|
|
|
if (data.empty() || data == value || param.empty() || !vhost || _srs_config->get_vhost_enabled(vhost)) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((err = _srs_config->raw_update_vhost(value, data, applied)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (param == "delete") {
|
|
|
|
|
|
|
|
// when delete, the vhost must exists and disabled.
|
|
|
|
|
|
|
|
SrsConfDirective* vhost = _srs_config->get_vhost(value, false);
|
|
|
|
|
|
|
|
if (param.empty() || !vhost || _srs_config->get_vhost_enabled(vhost)) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((err = _srs_config->raw_delete_vhost(value, applied)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (param == "disable") {
|
|
|
|
|
|
|
|
// when disable, the vhost must exists and enabled.
|
|
|
|
|
|
|
|
SrsConfDirective* vhost = _srs_config->get_vhost(value, false);
|
|
|
|
|
|
|
|
if (param.empty() || !vhost || !_srs_config->get_vhost_enabled(vhost)) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((err = _srs_config->raw_disable_vhost(value, applied)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (param == "enable") {
|
|
|
|
|
|
|
|
// when enable, the vhost must exists and disabled.
|
|
|
|
|
|
|
|
SrsConfDirective* vhost = _srs_config->get_vhost(value, false);
|
|
|
|
|
|
|
|
if (param.empty() || !vhost || _srs_config->get_vhost_enabled(vhost)) {
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((err = _srs_config->raw_enable_vhost(value, applied)) != srs_success) {
|
|
|
|
|
|
|
|
int code = srs_error_code(err);
|
|
|
|
|
|
|
|
srs_error_reset(err);
|
|
|
|
|
|
|
|
return srs_api_response_code(w, r, code);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// TODO: support other param.
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// TODO: support other scope.
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// whether the config applied.
|
|
|
|
|
|
|
|
if (applied) {
|
|
|
|
|
|
|
|
server->on_signal(SRS_SIGNAL_PERSISTENCE_CONFIG);
|
|
|
|
|
|
|
|
srs_trace("raw api update %s=%s%s ok.", scope.c_str(), value.c_str(), extra.c_str());
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
srs_warn("raw api update not applied %s=%s%s.", scope.c_str(), value.c_str(), extra.c_str());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return srs_api_response(w, r, obj->dumps());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return err;
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|