winlin

use function to dumps the engine.

@@ -12,6 +12,7 @@ http_api { @@ -12,6 +12,7 @@ http_api {
12 enabled on; 12 enabled on;
13 allow_reload on; 13 allow_reload on;
14 allow_query on; 14 allow_query on;
  15 + allow_update on;
15 } 16 }
16 } 17 }
17 # for SRS1. 18 # for SRS1.
@@ -137,6 +137,9 @@ http_api { @@ -137,6 +137,9 @@ http_api {
137 # whether enable rpc query. 137 # whether enable rpc query.
138 # default: off 138 # default: off
139 allow_query off; 139 allow_query off;
  140 + # whether enable rpc update.
  141 + # default: off
  142 + allow_update off;
140 } 143 }
141 } 144 }
142 # embeded http server in srs. 145 # embeded http server in srs.
@@ -28,6 +28,7 @@ http_api { @@ -28,6 +28,7 @@ http_api {
28 enabled on; 28 enabled on;
29 allow_reload on; 29 allow_reload on;
30 allow_query on; 30 allow_query on;
  31 + allow_update on;
31 } 32 }
32 } 33 }
33 http_server { 34 http_server {
@@ -67,6 +67,9 @@ using namespace _srs_internal; @@ -67,6 +67,9 @@ using namespace _srs_internal;
67 // '\r' 67 // '\r'
68 #define SRS_CR (char)SRS_CONSTS_CR 68 #define SRS_CR (char)SRS_CONSTS_CR
69 69
  70 +// dumps the engine to amf0 object.
  71 +int srs_config_dumps_engine(SrsConfDirective* dir, SrsAmf0Object* engine);
  72 +
70 bool is_common_space(char ch) 73 bool is_common_space(char ch)
71 { 74 {
72 return (ch == ' ' || ch == '\t' || ch == SRS_CR || ch == SRS_LF); 75 return (ch == ' ' || ch == '\t' || ch == SRS_CR || ch == SRS_LF);
@@ -1520,6 +1523,8 @@ int SrsConfig::global_to_json(SrsAmf0Object* obj) @@ -1520,6 +1523,8 @@ int SrsConfig::global_to_json(SrsAmf0Object* obj)
1520 ssobj->set(ssdir->name, ssdir->dumps_arg0_to_boolean()); 1523 ssobj->set(ssdir->name, ssdir->dumps_arg0_to_boolean());
1521 } else if (ssdir->name == "allow_query") { 1524 } else if (ssdir->name == "allow_query") {
1522 ssobj->set(ssdir->name, ssdir->dumps_arg0_to_boolean()); 1525 ssobj->set(ssdir->name, ssdir->dumps_arg0_to_boolean());
  1526 + } else if (ssdir->name == "allow_update") {
  1527 + ssobj->set(ssdir->name, ssdir->dumps_arg0_to_boolean());
1523 } 1528 }
1524 } 1529 }
1525 } 1530 }
@@ -2100,7 +2105,7 @@ int SrsConfig::vhost_to_json(SrsConfDirective* vhost, SrsAmf0Object* obj) @@ -2100,7 +2105,7 @@ int SrsConfig::vhost_to_json(SrsConfDirective* vhost, SrsAmf0Object* obj)
2100 SrsAmf0Object* engine = SrsAmf0Any::object(); 2105 SrsAmf0Object* engine = SrsAmf0Any::object();
2101 ingest->set("engine", engine); 2106 ingest->set("engine", engine);
2102 2107
2103 - if ((ret = dumps_engine(sdir, engine)) != ERROR_SUCCESS) { 2108 + if ((ret = srs_config_dumps_engine(sdir, engine)) != ERROR_SUCCESS) {
2104 return ret; 2109 return ret;
2105 } 2110 }
2106 } 2111 }
@@ -2138,7 +2143,7 @@ int SrsConfig::vhost_to_json(SrsConfDirective* vhost, SrsAmf0Object* obj) @@ -2138,7 +2143,7 @@ int SrsConfig::vhost_to_json(SrsConfDirective* vhost, SrsAmf0Object* obj)
2138 SrsAmf0Object* engine = SrsAmf0Any::object(); 2143 SrsAmf0Object* engine = SrsAmf0Any::object();
2139 engines->append(engine); 2144 engines->append(engine);
2140 2145
2141 - if ((ret = dumps_engine(sdir, engine)) != ERROR_SUCCESS) { 2146 + if ((ret = srs_config_dumps_engine(sdir, engine)) != ERROR_SUCCESS) {
2142 return ret; 2147 return ret;
2143 } 2148 }
2144 } 2149 }
@@ -2165,108 +2170,7 @@ int SrsConfig::raw_to_json(SrsAmf0Object* obj) @@ -2165,108 +2170,7 @@ int SrsConfig::raw_to_json(SrsAmf0Object* obj)
2165 ssobj->set("enabled", SrsAmf0Any::boolean(get_raw_api())); 2170 ssobj->set("enabled", SrsAmf0Any::boolean(get_raw_api()));
2166 ssobj->set("allow_reload", SrsAmf0Any::boolean(get_raw_api_allow_reload())); 2171 ssobj->set("allow_reload", SrsAmf0Any::boolean(get_raw_api_allow_reload()));
2167 ssobj->set("allow_query", SrsAmf0Any::boolean(get_raw_api_allow_query())); 2172 ssobj->set("allow_query", SrsAmf0Any::boolean(get_raw_api_allow_query()));
2168 -  
2169 - return ret;  
2170 -}  
2171 -  
2172 -int SrsConfig::dumps_engine(SrsConfDirective* dir, SrsAmf0Object* engine)  
2173 -{  
2174 - int ret = ERROR_SUCCESS;  
2175 -  
2176 - SrsConfDirective* conf = NULL;  
2177 -  
2178 - engine->set("id", dir->dumps_arg0_to_str());  
2179 - engine->set("enabled", SrsAmf0Any::boolean(get_engine_enabled(dir)));  
2180 -  
2181 - if ((conf = dir->get("iformat")) != NULL) {  
2182 - engine->set("iformat", conf->dumps_arg0_to_str());  
2183 - }  
2184 -  
2185 - if ((conf = dir->get("vfilter")) != NULL) {  
2186 - SrsAmf0Object* vfilter = SrsAmf0Any::object();  
2187 - engine->set("vfilter", vfilter);  
2188 -  
2189 - for (int i = 0; i < (int)conf->directives.size(); i++) {  
2190 - SrsConfDirective* sdir = conf->directives.at(i);  
2191 - vfilter->set(sdir->name, sdir->dumps_arg0_to_str());  
2192 - }  
2193 - }  
2194 -  
2195 - if ((conf = dir->get("vcodec")) != NULL) {  
2196 - engine->set("vcodec", conf->dumps_arg0_to_str());  
2197 - }  
2198 -  
2199 - if ((conf = dir->get("vbitrate")) != NULL) {  
2200 - engine->set("vbitrate", conf->dumps_arg0_to_number());  
2201 - }  
2202 -  
2203 - if ((conf = dir->get("vfps")) != NULL) {  
2204 - engine->set("vfps", conf->dumps_arg0_to_number());  
2205 - }  
2206 -  
2207 - if ((conf = dir->get("vwidth")) != NULL) {  
2208 - engine->set("vwidth", conf->dumps_arg0_to_number());  
2209 - }  
2210 -  
2211 - if ((conf = dir->get("vheight")) != NULL) {  
2212 - engine->set("vheight", conf->dumps_arg0_to_number());  
2213 - }  
2214 -  
2215 - if ((conf = dir->get("vthreads")) != NULL) {  
2216 - engine->set("vthreads", conf->dumps_arg0_to_number());  
2217 - }  
2218 -  
2219 - if ((conf = dir->get("vprofile")) != NULL) {  
2220 - engine->set("vprofile", conf->dumps_arg0_to_str());  
2221 - }  
2222 -  
2223 - if ((conf = dir->get("vpreset")) != NULL) {  
2224 - engine->set("vpreset", conf->dumps_arg0_to_str());  
2225 - }  
2226 -  
2227 - if ((conf = dir->get("vparams")) != NULL) {  
2228 - SrsAmf0Object* vparams = SrsAmf0Any::object();  
2229 - engine->set("vparams", vparams);  
2230 -  
2231 - for (int i = 0; i < (int)conf->directives.size(); i++) {  
2232 - SrsConfDirective* sdir = conf->directives.at(i);  
2233 - vparams->set(sdir->name, sdir->dumps_arg0_to_str());  
2234 - }  
2235 - }  
2236 -  
2237 - if ((conf = dir->get("acodec")) != NULL) {  
2238 - engine->set("acodec", conf->dumps_arg0_to_str());  
2239 - }  
2240 -  
2241 - if ((conf = dir->get("abitrate")) != NULL) {  
2242 - engine->set("abitrate", conf->dumps_arg0_to_number());  
2243 - }  
2244 -  
2245 - if ((conf = dir->get("asample_rate")) != NULL) {  
2246 - engine->set("asample_rate", conf->dumps_arg0_to_number());  
2247 - }  
2248 -  
2249 - if ((conf = dir->get("achannels")) != NULL) {  
2250 - engine->set("achannels", conf->dumps_arg0_to_number());  
2251 - }  
2252 -  
2253 - if ((conf = dir->get("aparams")) != NULL) {  
2254 - SrsAmf0Object* aparams = SrsAmf0Any::object();  
2255 - engine->set("aparams", aparams);  
2256 -  
2257 - for (int i = 0; i < (int)conf->directives.size(); i++) {  
2258 - SrsConfDirective* sdir = conf->directives.at(i);  
2259 - aparams->set(sdir->name, sdir->dumps_arg0_to_str());  
2260 - }  
2261 - }  
2262 -  
2263 - if ((conf = dir->get("oformat")) != NULL) {  
2264 - engine->set("oformat", conf->dumps_arg0_to_str());  
2265 - }  
2266 -  
2267 - if ((conf = dir->get("output")) != NULL) {  
2268 - engine->set("output", conf->dumps_arg0_to_str());  
2269 - } 2173 + ssobj->set("allow_update", SrsAmf0Any::boolean(get_raw_api_allow_update()));
2270 2174
2271 return ret; 2175 return ret;
2272 } 2176 }
@@ -2448,7 +2352,7 @@ int SrsConfig::check_config() @@ -2448,7 +2352,7 @@ int SrsConfig::check_config()
2448 if (n == "raw_api") { 2352 if (n == "raw_api") {
2449 for (int j = 0; j < (int)obj->directives.size(); j++) { 2353 for (int j = 0; j < (int)obj->directives.size(); j++) {
2450 string m = obj->at(j)->name; 2354 string m = obj->at(j)->name;
2451 - if (m != "enabled" && m != "allow_reload" && m != "allow_query") { 2355 + if (m != "enabled" && m != "allow_reload" && m != "allow_query" && m != "allow_update") {
2452 ret = ERROR_SYSTEM_CONFIG_INVALID; 2356 ret = ERROR_SYSTEM_CONFIG_INVALID;
2453 srs_error("unsupported http_api.raw_api directive %s, ret=%d", m.c_str(), ret); 2357 srs_error("unsupported http_api.raw_api directive %s, ret=%d", m.c_str(), ret);
2454 return ret; 2358 return ret;
@@ -5296,6 +5200,28 @@ bool SrsConfig::get_raw_api_allow_query() @@ -5296,6 +5200,28 @@ bool SrsConfig::get_raw_api_allow_query()
5296 return SRS_CONF_PERFER_FALSE(conf->arg0()); 5200 return SRS_CONF_PERFER_FALSE(conf->arg0());
5297 } 5201 }
5298 5202
  5203 +bool SrsConfig::get_raw_api_allow_update()
  5204 +{
  5205 + static bool DEFAULT = false;
  5206 +
  5207 + SrsConfDirective* conf = root->get("http_api");
  5208 + if (!conf) {
  5209 + return DEFAULT;
  5210 + }
  5211 +
  5212 + conf = conf->get("raw_api");
  5213 + if (!conf) {
  5214 + return DEFAULT;
  5215 + }
  5216 +
  5217 + conf = conf->get("allow_update");
  5218 + if (!conf || conf->arg0().empty()) {
  5219 + return DEFAULT;
  5220 + }
  5221 +
  5222 + return SRS_CONF_PERFER_FALSE(conf->arg0());
  5223 +}
  5224 +
5299 bool SrsConfig::get_http_stream_enabled() 5225 bool SrsConfig::get_http_stream_enabled()
5300 { 5226 {
5301 SrsConfDirective* conf = root->get("http_server"); 5227 SrsConfDirective* conf = root->get("http_server");
@@ -5961,3 +5887,106 @@ int srs_config_transform_vhost(SrsConfDirective* root) @@ -5961,3 +5887,106 @@ int srs_config_transform_vhost(SrsConfDirective* root)
5961 5887
5962 return ret; 5888 return ret;
5963 } 5889 }
  5890 +
  5891 +int srs_config_dumps_engine(SrsConfDirective* dir, SrsAmf0Object* engine)
  5892 +{
  5893 + int ret = ERROR_SUCCESS;
  5894 +
  5895 + SrsConfDirective* conf = NULL;
  5896 +
  5897 + engine->set("id", dir->dumps_arg0_to_str());
  5898 + engine->set("enabled", SrsAmf0Any::boolean(_srs_config->get_engine_enabled(dir)));
  5899 +
  5900 + if ((conf = dir->get("iformat")) != NULL) {
  5901 + engine->set("iformat", conf->dumps_arg0_to_str());
  5902 + }
  5903 +
  5904 + if ((conf = dir->get("vfilter")) != NULL) {
  5905 + SrsAmf0Object* vfilter = SrsAmf0Any::object();
  5906 + engine->set("vfilter", vfilter);
  5907 +
  5908 + for (int i = 0; i < (int)conf->directives.size(); i++) {
  5909 + SrsConfDirective* sdir = conf->directives.at(i);
  5910 + vfilter->set(sdir->name, sdir->dumps_arg0_to_str());
  5911 + }
  5912 + }
  5913 +
  5914 + if ((conf = dir->get("vcodec")) != NULL) {
  5915 + engine->set("vcodec", conf->dumps_arg0_to_str());
  5916 + }
  5917 +
  5918 + if ((conf = dir->get("vbitrate")) != NULL) {
  5919 + engine->set("vbitrate", conf->dumps_arg0_to_number());
  5920 + }
  5921 +
  5922 + if ((conf = dir->get("vfps")) != NULL) {
  5923 + engine->set("vfps", conf->dumps_arg0_to_number());
  5924 + }
  5925 +
  5926 + if ((conf = dir->get("vwidth")) != NULL) {
  5927 + engine->set("vwidth", conf->dumps_arg0_to_number());
  5928 + }
  5929 +
  5930 + if ((conf = dir->get("vheight")) != NULL) {
  5931 + engine->set("vheight", conf->dumps_arg0_to_number());
  5932 + }
  5933 +
  5934 + if ((conf = dir->get("vthreads")) != NULL) {
  5935 + engine->set("vthreads", conf->dumps_arg0_to_number());
  5936 + }
  5937 +
  5938 + if ((conf = dir->get("vprofile")) != NULL) {
  5939 + engine->set("vprofile", conf->dumps_arg0_to_str());
  5940 + }
  5941 +
  5942 + if ((conf = dir->get("vpreset")) != NULL) {
  5943 + engine->set("vpreset", conf->dumps_arg0_to_str());
  5944 + }
  5945 +
  5946 + if ((conf = dir->get("vparams")) != NULL) {
  5947 + SrsAmf0Object* vparams = SrsAmf0Any::object();
  5948 + engine->set("vparams", vparams);
  5949 +
  5950 + for (int i = 0; i < (int)conf->directives.size(); i++) {
  5951 + SrsConfDirective* sdir = conf->directives.at(i);
  5952 + vparams->set(sdir->name, sdir->dumps_arg0_to_str());
  5953 + }
  5954 + }
  5955 +
  5956 + if ((conf = dir->get("acodec")) != NULL) {
  5957 + engine->set("acodec", conf->dumps_arg0_to_str());
  5958 + }
  5959 +
  5960 + if ((conf = dir->get("abitrate")) != NULL) {
  5961 + engine->set("abitrate", conf->dumps_arg0_to_number());
  5962 + }
  5963 +
  5964 + if ((conf = dir->get("asample_rate")) != NULL) {
  5965 + engine->set("asample_rate", conf->dumps_arg0_to_number());
  5966 + }
  5967 +
  5968 + if ((conf = dir->get("achannels")) != NULL) {
  5969 + engine->set("achannels", conf->dumps_arg0_to_number());
  5970 + }
  5971 +
  5972 + if ((conf = dir->get("aparams")) != NULL) {
  5973 + SrsAmf0Object* aparams = SrsAmf0Any::object();
  5974 + engine->set("aparams", aparams);
  5975 +
  5976 + for (int i = 0; i < (int)conf->directives.size(); i++) {
  5977 + SrsConfDirective* sdir = conf->directives.at(i);
  5978 + aparams->set(sdir->name, sdir->dumps_arg0_to_str());
  5979 + }
  5980 + }
  5981 +
  5982 + if ((conf = dir->get("oformat")) != NULL) {
  5983 + engine->set("oformat", conf->dumps_arg0_to_str());
  5984 + }
  5985 +
  5986 + if ((conf = dir->get("output")) != NULL) {
  5987 + engine->set("output", conf->dumps_arg0_to_str());
  5988 + }
  5989 +
  5990 + return ret;
  5991 +}
  5992 +
@@ -329,11 +329,6 @@ public: @@ -329,11 +329,6 @@ public:
329 * dumps the http_api sections to json for raw api info. 329 * dumps the http_api sections to json for raw api info.
330 */ 330 */
331 virtual int raw_to_json(SrsAmf0Object* obj); 331 virtual int raw_to_json(SrsAmf0Object* obj);
332 -private:  
333 - /**  
334 - * dumps the engine section to amf0 object.  
335 - */  
336 - virtual int dumps_engine(SrsConfDirective* dir, SrsAmf0Object* engine);  
337 public: 332 public:
338 /** 333 /**
339 * get the config file path. 334 * get the config file path.
@@ -1086,6 +1081,10 @@ public: @@ -1086,6 +1081,10 @@ public:
1086 * whether allow rpc query. 1081 * whether allow rpc query.
1087 */ 1082 */
1088 virtual bool get_raw_api_allow_query(); 1083 virtual bool get_raw_api_allow_query();
  1084 + /**
  1085 + * whether allow rpc update.
  1086 + */
  1087 + virtual bool get_raw_api_allow_update();
1089 // http stream section 1088 // http stream section
1090 private: 1089 private:
1091 /** 1090 /**
@@ -853,6 +853,7 @@ SrsGoApiRaw::SrsGoApiRaw(SrsServer* svr) @@ -853,6 +853,7 @@ SrsGoApiRaw::SrsGoApiRaw(SrsServer* svr)
853 raw_api = _srs_config->get_raw_api(); 853 raw_api = _srs_config->get_raw_api();
854 allow_reload = _srs_config->get_raw_api_allow_reload(); 854 allow_reload = _srs_config->get_raw_api_allow_reload();
855 allow_query = _srs_config->get_raw_api_allow_query(); 855 allow_query = _srs_config->get_raw_api_allow_query();
  856 + allow_update = _srs_config->get_raw_api_allow_update();
856 857
857 _srs_config->subscribe(this); 858 _srs_config->subscribe(this);
858 } 859 }
@@ -891,8 +892,10 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -891,8 +892,10 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
891 return srs_api_response_code(w, r, ret); 892 return srs_api_response_code(w, r, ret);
892 } 893 }
893 894
  895 + //////////////////////////////////////////////////////////////////////////
894 // the rpc is required. 896 // the rpc is required.
895 - if (rpc.empty() || (rpc != "reload" && rpc != "query" && rpc != "raw")) { 897 + // the allowd rpc method check.
  898 + if (rpc.empty() || (rpc != "reload" && rpc != "query" && rpc != "raw" && rpc != "update")) {
896 ret = ERROR_SYSTEM_CONFIG_RAW; 899 ret = ERROR_SYSTEM_CONFIG_RAW;
897 srs_error("raw api invalid rpc=%s. ret=%d", rpc.c_str(), ret); 900 srs_error("raw api invalid rpc=%s. ret=%d", rpc.c_str(), ret);
898 return srs_api_response_code(w, r, ret); 901 return srs_api_response_code(w, r, ret);
@@ -968,6 +971,49 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -968,6 +971,49 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
968 return srs_api_response(w, r, obj->to_json()); 971 return srs_api_response(w, r, obj->to_json());
969 } 972 }
970 973
  974 + // for rpc=update, to update the configs of server.
  975 + // @param scope the scope to update for config.
  976 + // @param value the updated value for scope.
  977 + // possible updates:
  978 + // @param scope @param value value-description
  979 + // global.listen 1935,1936 the port list.
  980 + if (rpc == "update") {
  981 + if (!allow_update) {
  982 + ret = ERROR_SYSTEM_CONFIG_RAW_DISABLED;
  983 + srs_error("raw api allow_update disabled rpc=%s. ret=%d", rpc.c_str(), ret);
  984 + return srs_api_response_code(w, r, ret);
  985 + }
  986 +
  987 + std::string scope = r->query_get("scope");
  988 + std::string value = r->query_get("value");
  989 + if (scope.empty() || (scope != "global.listen")) {
  990 + ret = ERROR_SYSTEM_CONFIG_RAW_PARAMS;
  991 + srs_error("raw api query invalid scope=%s. ret=%d", scope.c_str(), ret);
  992 + return srs_api_response_code(w, r, ret);
  993 + }
  994 +
  995 + if (scope == "global.listen") {
  996 + vector<string> eps = srs_string_split(value, ",");
  997 +
  998 + bool invalid = eps.empty();
  999 + for (int i = 0; i < (int)eps.size(); i++) {
  1000 + string ep = eps.at(i);
  1001 + int port = ::atoi(ep.c_str());
  1002 + if (port <= 2 || port >= 65535) {
  1003 + invalid = true;
  1004 + break;
  1005 + }
  1006 + }
  1007 + if (invalid) {
  1008 + ret = ERROR_SYSTEM_CONFIG_RAW_PARAMS;
  1009 + srs_error("raw api update global.listen invalid eps=%s. ret=%d", value.c_str(), ret);
  1010 + return srs_api_response_code(w, r, ret);
  1011 + }
  1012 + }
  1013 +
  1014 + return srs_api_response(w, r, obj->to_json());
  1015 + }
  1016 +
971 return ret; 1017 return ret;
972 } 1018 }
973 1019
@@ -976,6 +1022,7 @@ int SrsGoApiRaw::on_reload_http_api_raw_api() @@ -976,6 +1022,7 @@ int SrsGoApiRaw::on_reload_http_api_raw_api()
976 raw_api = _srs_config->get_raw_api(); 1022 raw_api = _srs_config->get_raw_api();
977 allow_reload = _srs_config->get_raw_api_allow_reload(); 1023 allow_reload = _srs_config->get_raw_api_allow_reload();
978 allow_query = _srs_config->get_raw_api_allow_query(); 1024 allow_query = _srs_config->get_raw_api_allow_query();
  1025 + allow_update = _srs_config->get_raw_api_allow_update();
979 1026
980 return ERROR_SUCCESS; 1027 return ERROR_SUCCESS;
981 } 1028 }
@@ -187,6 +187,7 @@ private: @@ -187,6 +187,7 @@ private:
187 bool raw_api; 187 bool raw_api;
188 bool allow_reload; 188 bool allow_reload;
189 bool allow_query; 189 bool allow_query;
  190 + bool allow_update;
190 public: 191 public:
191 SrsGoApiRaw(SrsServer* svr); 192 SrsGoApiRaw(SrsServer* svr);
192 virtual ~SrsGoApiRaw(); 193 virtual ~SrsGoApiRaw();