winlin

for #319, support enable or disable vhost.

@@ -721,16 +721,9 @@ int SrsConfig::reload_vhost(SrsConfDirective* old_root) @@ -721,16 +721,9 @@ int SrsConfig::reload_vhost(SrsConfDirective* old_root)
721 721
722 // ENABLED => DISABLED 722 // ENABLED => DISABLED
723 if (get_vhost_enabled(old_vhost) && !get_vhost_enabled(new_vhost)) { 723 if (get_vhost_enabled(old_vhost) && !get_vhost_enabled(new_vhost)) {
724 - srs_trace("vhost %s removed, reload it.", vhost.c_str());  
725 - for (it = subscribes.begin(); it != subscribes.end(); ++it) {  
726 - ISrsReloadHandler* subscribe = *it;  
727 - if ((ret = subscribe->on_reload_vhost_removed(vhost)) != ERROR_SUCCESS) {  
728 - srs_error("notify subscribes removed "  
729 - "vhost %s failed. ret=%d", vhost.c_str(), ret); 724 + if ((ret = do_reload_vhost_removed(vhost)) != ERROR_SUCCESS) {
730 return ret; 725 return ret;
731 } 726 }
732 - }  
733 - srs_trace("reload removed vhost %s success.", vhost.c_str());  
734 continue; 727 continue;
735 } 728 }
736 729
@@ -2514,6 +2507,42 @@ int SrsConfig::raw_delete_vhost(string vhost, bool& applied) @@ -2514,6 +2507,42 @@ int SrsConfig::raw_delete_vhost(string vhost, bool& applied)
2514 return ret; 2507 return ret;
2515 } 2508 }
2516 2509
  2510 +int SrsConfig::raw_disable_vhost(string vhost, bool& applied)
  2511 +{
  2512 + int ret = ERROR_SUCCESS;
  2513 +
  2514 + applied = false;
  2515 +
  2516 + SrsConfDirective* conf = root->get("vhost", vhost);
  2517 + conf->get_or_create("enabled")->set_arg0("off");
  2518 +
  2519 + if ((ret = do_reload_vhost_removed(vhost)) != ERROR_SUCCESS) {
  2520 + return ret;
  2521 + }
  2522 +
  2523 + applied = true;
  2524 +
  2525 + return ret;
  2526 +}
  2527 +
  2528 +int SrsConfig::raw_enable_vhost(string vhost, bool& applied)
  2529 +{
  2530 + int ret = ERROR_SUCCESS;
  2531 +
  2532 + applied = false;
  2533 +
  2534 + SrsConfDirective* conf = root->get("vhost", vhost);
  2535 + conf->get_or_create("enabled")->set_arg0("on");
  2536 +
  2537 + if ((ret = do_reload_vhost_added(vhost)) != ERROR_SUCCESS) {
  2538 + return ret;
  2539 + }
  2540 +
  2541 + applied = true;
  2542 +
  2543 + return ret;
  2544 +}
  2545 +
2517 int SrsConfig::do_reload_listen() 2546 int SrsConfig::do_reload_listen()
2518 { 2547 {
2519 int ret = ERROR_SUCCESS; 2548 int ret = ERROR_SUCCESS;
@@ -2670,6 +2699,26 @@ int SrsConfig::do_reload_vhost_added(string vhost) @@ -2670,6 +2699,26 @@ int SrsConfig::do_reload_vhost_added(string vhost)
2670 return ret; 2699 return ret;
2671 } 2700 }
2672 2701
  2702 +int SrsConfig::do_reload_vhost_removed(string vhost)
  2703 +{
  2704 + int ret = ERROR_SUCCESS;
  2705 +
  2706 + srs_trace("vhost %s removed, reload it.", vhost.c_str());
  2707 +
  2708 + vector<ISrsReloadHandler*>::iterator it;
  2709 + for (it = subscribes.begin(); it != subscribes.end(); ++it) {
  2710 + ISrsReloadHandler* subscribe = *it;
  2711 + if ((ret = subscribe->on_reload_vhost_removed(vhost)) != ERROR_SUCCESS) {
  2712 + srs_error("notify subscribes removed "
  2713 + "vhost %s failed. ret=%d", vhost.c_str(), ret);
  2714 + return ret;
  2715 + }
  2716 + }
  2717 + srs_trace("reload removed vhost %s success.", vhost.c_str());
  2718 +
  2719 + return ret;
  2720 +}
  2721 +
2673 string SrsConfig::config() 2722 string SrsConfig::config()
2674 { 2723 {
2675 return config_file; 2724 return config_file;
@@ -390,6 +390,14 @@ public: @@ -390,6 +390,14 @@ public:
390 * raw delete the disabled vhost. 390 * raw delete the disabled vhost.
391 */ 391 */
392 virtual int raw_delete_vhost(std::string vhost, bool& applied); 392 virtual int raw_delete_vhost(std::string vhost, bool& applied);
  393 + /**
  394 + * raw disable the enabled vhost.
  395 + */
  396 + virtual int raw_disable_vhost(std::string vhost, bool& applied);
  397 + /**
  398 + * raw enable the disabled vhost.
  399 + */
  400 + virtual int raw_enable_vhost(std::string vhost, bool& applied);
393 private: 401 private:
394 virtual int do_reload_listen(); 402 virtual int do_reload_listen();
395 virtual int do_reload_pid(); 403 virtual int do_reload_pid();
@@ -400,6 +408,7 @@ private: @@ -400,6 +408,7 @@ private:
400 virtual int do_reload_utc_time(); 408 virtual int do_reload_utc_time();
401 virtual int do_reload_pithy_print_ms(); 409 virtual int do_reload_pithy_print_ms();
402 virtual int do_reload_vhost_added(std::string vhost); 410 virtual int do_reload_vhost_added(std::string vhost);
  411 + virtual int do_reload_vhost_removed(std::string vhost);
403 public: 412 public:
404 /** 413 /**
405 * get the config file path. 414 * get the config file path.
@@ -1155,7 +1155,7 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -1155,7 +1155,7 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
1155 } else if (scope == "vhost") { 1155 } else if (scope == "vhost") {
1156 std::string param = r->query_get("param"); 1156 std::string param = r->query_get("param");
1157 std::string data = r->query_get("data"); 1157 std::string data = r->query_get("data");
1158 - if (param != "create" && param != "update" && param != "delete") { 1158 + if (param != "create" && param != "update" && param != "delete" && param != "disable" && param != "enable") {
1159 ret = ERROR_SYSTEM_CONFIG_RAW_NOT_ALLOWED; 1159 ret = ERROR_SYSTEM_CONFIG_RAW_NOT_ALLOWED;
1160 srs_error("raw api query invalid scope=%s, param=%s. ret=%d", scope.c_str(), param.c_str(), ret); 1160 srs_error("raw api query invalid scope=%s, param=%s. ret=%d", scope.c_str(), param.c_str(), ret);
1161 return srs_api_response_code(w, r, ret); 1161 return srs_api_response_code(w, r, ret);
@@ -1202,7 +1202,32 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -1202,7 +1202,32 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
1202 srs_error("raw api update vhost=%s, param=%s failed. ret=%d", value.c_str(), param.c_str(), ret); 1202 srs_error("raw api update vhost=%s, param=%s failed. ret=%d", value.c_str(), param.c_str(), ret);
1203 return srs_api_response_code(w, r, ret); 1203 return srs_api_response_code(w, r, ret);
1204 } 1204 }
  1205 + } else if (param == "disable") {
  1206 + // when disable, the vhost must exists and enabled.
  1207 + SrsConfDirective* vhost = _srs_config->get_vhost(value, false);
  1208 + if (param.empty() || !vhost || !_srs_config->get_vhost_enabled(vhost)) {
  1209 + ret = ERROR_SYSTEM_CONFIG_RAW_PARAMS;
  1210 + srs_error("raw api update check vhost=%s, param=%s failed. ret=%d", value.c_str(), param.c_str(), ret);
  1211 + return srs_api_response_code(w, r, ret);
  1212 + }
  1213 +
  1214 + if ((ret = _srs_config->raw_disable_vhost(value, applied)) != ERROR_SUCCESS) {
  1215 + srs_error("raw api update vhost=%s, param=%s failed. ret=%d", value.c_str(), param.c_str(), ret);
  1216 + return srs_api_response_code(w, r, ret);
  1217 + }
  1218 + } else if (param == "enable") {
  1219 + // when enable, the vhost must exists and disabled.
  1220 + SrsConfDirective* vhost = _srs_config->get_vhost(value, false);
  1221 + if (param.empty() || !vhost || _srs_config->get_vhost_enabled(vhost)) {
  1222 + ret = ERROR_SYSTEM_CONFIG_RAW_PARAMS;
  1223 + srs_error("raw api update check vhost=%s, param=%s failed. ret=%d", value.c_str(), param.c_str(), ret);
  1224 + return srs_api_response_code(w, r, ret);
  1225 + }
1205 1226
  1227 + if ((ret = _srs_config->raw_enable_vhost(value, applied)) != ERROR_SUCCESS) {
  1228 + srs_error("raw api update vhost=%s, param=%s failed. ret=%d", value.c_str(), param.c_str(), ret);
  1229 + return srs_api_response_code(w, r, ret);
  1230 + }
1206 } 1231 }
1207 } 1232 }
1208 1233