public function checkFeedbackAction() { $node_id = $this->getRequest("node_id", ""); $idc = $this->getRequest("idc", ""); $page = $this->getRequest("page", 1); $page_count = $this->getRequest("pageCount", 20); // 1. parameter is not right if ($node_id === "" || $idc === "") { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_BAD_ARGS); QconfMgrLog::err(__FILE__, __LINE__, "parameter node_id or idc is null!"); echo json_encode($res); return; } ArgsUtil::setVal($page); ArgsUtil::setVal($page_count); if ($page <= 0) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_BAD_ARGS); QconfMgrLog::err(__FILE__, __LINE__, "parameter page error!"); echo json_encode($res); return; } if ($page_count < 0) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_BAD_ARGS); QconfMgrLog::err(__FILE__, __LINE__, "parameter page_count error!"); echo json_encode($res); return; } // 2. idc zookeeper server not exist $idc_host = ZkConf::getZkHost($idc); if ($idc_host === NULL) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_IDC_NOT_EXIST); QconfMgrLog::err(__FILE__, __LINE__, "'{$idc}' is not int ZOOKEEPER_SVR!"); echo json_encode($res); return; } // 3. get the node info from database $dbnode = NodeServ::getNode($node_id); if ($dbnode === FALSE) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_NODE_NOT_EXIST); QconfMgrLog::err(__FILE__, __LINE__, "node : {$node_id} is not exist!"); echo json_encode($res); return; } $node_whole = $dbnode["node_whole"]; $node_type_code = $dbnode["node_type_code"]; $data_type = $node_type_code == InfoDescUtil::NODE_TYPE_SERV_FATHER ? InfoDescUtil::FEEDBACK_DATA_TYPE_SERVICE : InfoDescUtil::FEEDBACK_DATA_TYPE_VALUE; $cur_node_idc = $dbnode["idc"]; $cur_idcs_array = explode(',', $cur_node_idc); $exist_idc = in_array($idc, $cur_idcs_array); if ($exist_idc === FALSE) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_IDC_NOT_IN_DATABASE); QconfMgrLog::err(__FILE__, __LINE__, "node : {$node_id} does not exist on idc : {$idc}!"); echo json_encode($res); return; } // 4. get feedbacks on current node $start = ($page - 1) * $page_count; $qconf_path = PathUtil::getQconfPath($node_whole); $feedbacks = FeedbackServ::queryFeedbackByNode($qconf_path, $idc, $data_type, $start, $page_count); if ($feedbacks === FALSE) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_MYSQL_FAIL); QconfMgrLog::err(__FILE__, __LINE__, "failed to query feedbacks by node:{$node_whole},\n idc({$idc}), data_type({$data_type}), page({$page}), page_count({$page_count})!"); echo json_encode($res); return; } $total_count = FeedbackServ::feedbackAmountByNode($qconf_path, $idc, $data_type); if ($total_count === FALSE) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_MYSQL_FAIL); QconfMgrLog::err(__FILE__, __LINE__, "failed to get feedbacks amount by node:{$node_whole}, idc({$idc}), data_type({$data_type})"); echo json_encode($res); return; } // 5. calcuate value_md5 $zk_web = new QconfZkWebBase(Log::INFO); $zk_web->connect($idc_host); $retry_time = 0; if ($data_type == InfoDescUtil::FEEDBACK_DATA_TYPE_SERVICE) { // 5.1 calcuate value_md5 for service father node $services = -1; while ($services === -1 && $retry_time <= InfoDescUtil::ZK_MAX_RETRY_TIME) { QconfMgrLog::err(__FILE__, __LINE__, "retry {$retry_time} of " . InfoDescUtil::ZK_MAX_RETRY_TIME . " to get services {$node_whole} on {$idc_host}"); $services = $zk_web->get_group_services_with_status($qconf_path); $retry_time++; } if ($services === -1) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_ZOOKEEPER_FAIL); QconfMgrLog::err(__FILE__, __LINE__, "The children of path: {$qconf_path} are null!"); echo json_encode($res); return; } ksort($services); foreach ($services as $serv => $status) { $ser_combine .= "{$serv}#{$status},"; } $ser_combine = trim($ser_combine, ','); //echo $ser_combine; $node_md5 = md5($ser_combine); } else { // 5.2 calcuate value_md5 for value $node_val = -1; while ($node_val === -1 && $retry_time <= InfoDescUtil::ZK_MAX_RETRY_TIME) { QconfMgrLog::err(__FILE__, __LINE__, "retry {$retry_time} of " . InfoDescUtil::ZK_MAX_RETRY_TIME . " to get value of {$node_whole} on {$idc}"); $node_val = $zk_web->get_conf($qconf_path); $retry_time++; } if ($node_val === -1) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_ZOOKEEPER_FAIL); QconfMgrLog::err(__FILE__, __LINE__, "failed to get value of {$qconf_path}!"); echo json_encode($res); return; } $node_md5 = md5($node_val); } // 6. encapsulate feedback result $fd_result = array(); foreach ($feedbacks as $feedback) { $fd_one = array("feedback_id" => $feedback["feedback_id"], "hostname" => $feedback["hostname"], "ip" => $feedback["ip"], "status" => $feedback["value_md5"] == $node_md5 ? "0" : "1", "update_time" => $feedback["update_time"]); $fd_result[] = $fd_one; } $result = array("curPage" => "{$page}", "totalCount" => "{$total_count}", "listing" => $fd_result); $res = array("errno" => "0", "errmsg" => "", "data" => $result); $json = json_encode($res); echo $json; }
public function addServiceAction() { $node_id = $this->getRequest("node_id", ""); $idc = $this->getRequest("idc", ""); $service_name = $this->getRequest("service_name", ""); $op_user = $this->userInfo["userName"]; // 1. parameter is not right if ($node_id === "" || $idc === "" || $service_name === "") { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_BAD_ARGS); QconfMgrLog::err(__FILE__, __LINE__, "parameter 'node_id', 'idc', 'service_name', is null!"); echo json_encode($res); return; } // 2. check node_id $node_row = NodeServ::getNode($node_id); if ($node_row === FALSE || count($node_row) === 0) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_NODE_NOT_EXIST); QconfMgrLog::err(__FILE__, __LINE__, "'node_id : {$node_id} not exist!'"); echo json_encode($res); return; } $db_node_whole = $node_row["node_whole"]; //[USERPERM CHECK] $userperm_ret = UserPermServ::checkPerm($op_user, $db_node_whole); if ($userperm_ret === FALSE) { QconfMgrLog::err(__FILE__, __LINE__, "Insufficient permission of {$op_user} on node {$db_node_whole}"); $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_USER_PERM_PERMISSION_DENIED); echo json_encode($res); return; } // 3. check node type code $node_type_code = $node_row["node_type_code"]; if ($node_type_code === InfoDescUtil::NODE_TYPE_NORMAL_FATHER) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_NODE_TYPE); QconfMgrLog::err(__FILE__, __LINE__, "node {$node_id} is not a normal father node!'"); echo json_encode($res); return; } else { if ($node_type_code === InfoDescUtil::NODE_TYPE_NORMAL) { //[SNAPSHOT CHECK] $main_buss_id = $node_row["main_buss_id"]; $snapshot_ret = SnapShotUtil::existSnapShotForNode($main_buss_id, $db_node_whole, $snapshot_path); if ($snapshot_ret === FALSE) { QconfMgrLog::err(__FILE__, __LINE__, "snapshot operation failed"); $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_SNAPSHOT_MODULE_FAILED); echo json_encode($res); return; } if ($snapshot_ret === InfoDescUtil::SNAPSHOT_FILE_EXIST) { QconfMgrLog::err(__FILE__, __LINE__, "snapshot existed on current node node_whole({$node_whole})"); $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_SNAPSHOT_LOCKED_NODE); $res["errmsg"] .= ": {$snapshot_path}"; echo json_encode($res); return; } } } // 4. check idc exist $idc = trim($idc, ","); $idc_list = preg_split("/[,]+/", $idc); $failed_idcs = ""; foreach ($idc_list as $idc_each) { $idc_host = ZkConf::getZkHost($idc_each); if ($idc_host === NULL) { //idc does not exist $failed_idcs .= ",{$idc_each}"; } } if ($failed_idcs != "") { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_IDC_NOT_EXIST); $res["data"] .= trim($failed_idcs, ","); echo json_encode($res); return; } // 5. add add in zookeeper $failed_idcs = self::retryOperation($node_id, $idc_list, $service_name, $op_user, InfoDescUtil::OP_TYPE_BATCH_ADD_SERV); // 6. send result if (count($failed_idcs) === 0) { //success return $res = array("errno" => "0", "errmsg" => "", "data" => "add service success!"); $json = json_encode($res); echo $json; return; } else { //failed return $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_BATCH_FAIL_EXIST); foreach ($failed_idcs as $fail_idc) { if ($res["data"] != "") { $res["data"] .= ","; } $res["data"] .= $fail_idc; } $json = json_encode($res); echo $json; return; } }
public function createAction() { $node_id = $this->getRequest("node_id", ""); $idc = $this->getRequest("idc", ""); $op_user = $this->userInfo["userName"]; // 1. parameter null if ($node_id === "" || $idc === "") { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_BAD_ARGS); QconfMgrLog::err(__FILE__, __LINE__, "paramter: 'path', 'main_buss_id' or 'idc' are required!"); echo json_encode($res); return; } // 2. node is exist $node = NodeServ::getNode($node_id); if ($node === FALSE) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_NODE_NOT_EXIST); QconfMgrLog::err(__FILE__, __LINE__, "node of node_id({$node_id}) not exist!"); echo json_encode($res); return; } // 3. node level is smaller than 2 $node_level = $node["node_level"]; if ($node_level < 2) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_SNAPSHOT_NODE_LEVEL_ERROR); QconfMgrLog::err(__FILE__, __LINE__, "snapshot mustn't be created on root node!"); echo json_encode($res); return; } // 4. already exist snapshot $node_whole = $node["node_whole"]; //[USERPERM CHECK] $userperm_ret = UserPermServ::checkPerm($op_user, $node_whole); if ($userperm_ret === FALSE) { QconfMgrLog::err(__FILE__, __LINE__, "Insufficient permission of {$op_user} on node {$node_whole}"); $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_USER_PERM_PERMISSION_DENIED); echo json_encode($res); return; } $main_buss_id = $node["main_buss_id"]; $existed = SnapShotUtil::existSnapShotForSnapShot($main_buss_id, $node_whole, $snapshot_path); if ($existed === FALSE) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_SNAPSHOT_MODULE_FAILED); QconfMgrLog::err(__FILE__, __LINE__, "check snapshot existed failed"); echo json_encode($res); return; } if ($existed === InfoDescUtil::SNAPSHOT_FILE_EXIST) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_SNAPSHOT_FILE_EXIST); $res["errmsg"] .= ": {$snapshot_path}"; QconfMgrLog::err(__FILE__, __LINE__, "snapshot has already exist, snapshot_path({$snapshot_path})"); echo json_encode($res); return; } // 5. idc validation $cur_idcs = $node["idc"]; $check_res = self::idcValidation($idc, $cur_idcs); if ($check_res["errno"] != "0") { echo json_encode($check_res); return; } // 6. construct values $zk_web = new QconfZkWebBase(Log::INFO); $idc_list = preg_split("/[,]+/", trim($idc, ",")); $descendant = NodeServ::getDescendant($node_whole); $descendant[] = $node; $idc_values = array(); foreach ($idc_list as $idc_each) { $values_conf = array(); $values_serv = array(); $idc_host = ZkConf::getZkHost($idc_each); $zk_web->connect($idc_host); foreach ($descendant as $one_descendant) { $desc_node_whole = $one_descendant["node_whole"]; $desc_node_type_code = $one_descendant["node_type_code"]; $desc_node_idcs = $one_descendant["idc"]; $exist_idc = in_array($idc_each, explode(',', $desc_node_idcs)); if ($exist_idc === FALSE) { continue; } if ($desc_node_type_code === InfoDescUtil::NODE_TYPE_SERV_FATHER) { // get services $get_ret = ServiceController::getServicesAndStatusWithLink($zk_web, $desc_node_whole, $idc_each, $services); if ($get_ret != InfoDescUtil::QCONF_OK) { $res = InfoDescUtil::getErrorMsg($get_ret); $res["data"] .= $idc_each; echo json_encode($res); return; } $values_serv[$desc_node_whole] = $services; } // get conf $get_conf = NodeController::getConfWithLink($zk_web, $desc_node_whole, $idc_each, $node_val); if ($get_conf != InfoDescUtil::QCONF_OK) { $res = InfoDescUtil::getErrorMsg($get_conf); $res["data"] .= $idc_each; echo json_encode($res); return; } $values_conf[$desc_node_whole] = $node_val; } $values = array(); $values["conf"] = $values_conf; $values["serv"] = $values_serv; $idc_values[$idc_each] = $values; } // 7. create snapshot $main_buss_id = $node["main_buss_id"]; $sub_buss_id = $node["sub_buss_id"]; $create_res = SnapShotUtil::createSnapShot($main_buss_id, $node_whole, $op_user, $idc_values); if ($create_res === FALSE) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_SNAPSHOT_MODULE_FAILED); QconfMgrLog::err(__FILE__, __LINE__, "snapshot has already exist"); echo json_encode($res); return; } OpServ::insert(InfoDescUtil::OP_TYPE_SNAPSHOT_ADD, $node_whole, $idc, InfoDescUtil::OP_STATUS_SUCCESS, $main_buss_id, $sub_buss_id, $op_user, ""); // 8. return the right info $res = array("errno" => "0", "errmsg" => "", "data" => "create snapshot success!"); $json = json_encode($res); echo $json; }
public static function modIdc($node_id, $idc) { if ($node_id === NULL || $node_id === "" || $idc === NULL) { QconfMgrLog::err(__FILE__, __LINE__, "node_id or idc is NULL"); return FALSE; } ArgsUtil::setSQLEscape($node_id); ArgsUtil::setSQLEscape($idc); $idc_list = preg_split("/[,]+/", trim($idc, ",")); while ($node_id != 0) { $row = NodeServ::getNode($node_id); if ($row === FALSE) { return FALSE; } $p_idcs = trim($row["idc"], ","); $p_idcs_list = preg_split("/[,]+/", $p_idcs); $diff_list = array_diff($idc_list, $p_idcs_list); $diff_idc = implode(",", $diff_list); $new_idc = $p_idcs . "," . $diff_idc; $new_idc = trim($new_idc, ","); $ret = self::modColById($node_id, "idc", $new_idc); if ($ret === FALSE) { return FALSE; } $node_id = $row["parent_node_id"]; } return TRUE; }
public function modMultiConfAction() { $node_array = $this->getRequest("node_array", ""); $main_buss_id = $this->getRequest("main_buss_id", ""); $sub_buss_id = $this->getRequest("sub_buss_id", ""); $op_user = $this->userInfo["userName"]; // 1. parameter is not right if ($node_array === "" || $idc === "" || $main_buss_id === "") { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_BAD_ARGS); QconfMgrLog::err(__FILE__, __LINE__, "parameter 'idc'" . " 'node_array' 'main_buss_id' is null!"); echo json_encode($res); return; } $modify_nodes = json_decode($node_array); // 2. validation if ($modify_nodes === NULL || !is_array($modify_nodes)) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_BAD_ARGS); QconfMgrLog::err(__FILE__, __LINE__, "node : node_array({$node_array}) format error!"); echo json_encode($res); return; } $checked_nodes = array(); foreach ($modify_nodes as $modify_node_info) { if (!is_array($modify_node_info)) { //TODO reutrn false } $cur_id = $modify_node_info["node_id"]; $cur_value = $modify_node_info["value"]; $cur_idc = $modify_node_info["idc"]; // check parameter null if ($cur_id === null || $cur_value === null || $cur_idc === null) { //TODO return false } //check node exist $cur_node = NodeServ::getNode($cur_id); if ($dbnode === FALSE) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_NODE_NOT_EXIST); QconfMgrLog::err(__FILE__, __LINE__, "node : {$cur_id} is not exist!"); echo json_encode($res); return; } //[USERPERM CHECK] $cur_node_whole = $cur_node["node_whole"]; $userperm_ret = UserPermServ::checkPerm($op_user, $cur_node_whole); if ($userperm_ret === FALSE) { QconfMgrLog::err(__FILE__, __LINE__, "Insufficient permission of {$op_user} on node {$cur_node_whole}"); $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_USER_PERM_PERMISSION_DENIED); echo json_encode($res); return; } // check idc $idc_host = ZkConf::getZkHost($cur_idc); if ($idc_host === NULL) { //TODO return false } // pass validation $item = array(); $item["idc"] = $cur_idc; $item["value"] = $cur_value; $item["node"] = $cur_node; $checked_nodes[$cur_id] = $item; } // 3. actually do modification foreach ($checked_nodes as $node_id => $item) { $idc = $item["idc"]; $node = $item["node"]; $node_val = $item["value"]; $ret = self::modNodeValue($node_id, $idc, $node["node_whole"], $node["main_buss_id"], $node["sub_buss_id"], $node_val, "", $op_user); if ($ret != 0) { $res = InfoDescUtil::getErrorMsg($ret); echo json_encode($res); return; } } // return success $res = array("errno" => "0", "errmsg" => "", "data" => "modify success!"); $json = json_encode($res); echo $json; }