%PDF- %PDF-
Direktori : /proc/self/root/home/bitrix/www/bitrix/modules/controller/classes/general/ |
Current File : //proc/self/root/home/bitrix/www/bitrix/modules/controller/classes/general/controllertask.php |
<? ############################################## # Bitrix Site Manager # # Copyright (c) 2002-2007 Bitrix # # http://www.bitrixsoft.com # # mailto:sources@bitrixsoft.com # ############################################## IncludeModuleLangFile(__FILE__); class CControllerTask { public static function GetTaskArray() { return Array( 'SET_SETTINGS'=>GetMessage("CTRLR_TASK_TYPE_SET_SETTINGS"), 'UPDATE'=>GetMessage("CTRLR_TASK_TYPE_UPDATE"), 'COUNTERS_UPDATE'=>GetMessage("CTRLR_TASK_TYPE_COUNTERS_UPDATE"), 'REMOTE_COMMAND'=>GetMessage("CTRLR_TASK_TYPE_REMOTE_COMMAND"), 'CLOSE_MEMBER'=>GetMessage("CTRLR_TASK_TYPE_CLOSE_MEMBER") ); } public static function GetStatusArray() { return Array( 'N'=>GetMessage("CTRLR_TASK_STATUS_NEW"), 'P'=>GetMessage("CTRLR_TASK_STATUS_PART"), 'Y'=>GetMessage("CTRLR_TASK_STATUS_COMPL"), 'F'=>GetMessage("CTRLR_TASK_STATUS_FAIL"), ); } public static function CheckFields(&$arFields, $ID = false) { /** @global CMain $APPLICATION */ global $APPLICATION; $arMsg = Array(); if($ID>0) unset($arFields["ID"]); global $DB; if(($ID===false || is_set($arFields, "TASK_ID")) && strlen($arFields["TASK_ID"])<=0) $arMsg[] = array("id"=>"TASK_ID", "text"=> GetMessage("CTRLR_TASK_ERR_ID")); elseif(is_set($arFields, "TASK_ID")) { $arTaskID = CControllerTask::GetTaskArray(); if(!isset($arTaskID[$arFields['TASK_ID']])) $arMsg[] = array("id"=>"TASK_ID", "text"=> GetMessage("CTRLR_TASK_ERR_BAD_ID")); } if(($ID===false || is_set($arFields, "CONTROLLER_MEMBER_ID")) && Intval($arFields["CONTROLLER_MEMBER_ID"])<=0) $arMsg[] = array("id"=>"CONTROLLER_MEMBER_ID", "text"=> GetMessage("CTRLR_TASK_ERR_CLIENTID")); if(isset($arFields["INIT_EXECUTE"])) $arFields["INIT_CRC"] = crc32($arFields["INIT_EXECUTE"]); if(count($arMsg)<=0 && $ID===false) { $strSql = " SELECT INIT_EXECUTE FROM b_controller_task WHERE CONTROLLER_MEMBER_ID='".IntVal($arFields["CONTROLLER_MEMBER_ID"])."' AND TASK_ID='".$DB->ForSQL($arFields["TASK_ID"], 255)."' AND DATE_EXECUTE IS NULL "; $dbr = $DB->Query($strSql); while($ar = $dbr->Fetch()) { if(intval($ar["INIT_EXECUTE"]) == intval($arFields["INIT_EXECUTE"])) { $arMsg[] = array("id"=>"TASK_ID", "text"=> GetMessage("CTRLR_TASK_ERR_ALREADY")." [".IntVal($arFields["CONTROLLER_MEMBER_ID"])."]."); break; } } } $APPLICATION->ResetException(); if ($ID === false) { foreach (GetModuleEvents("controller", "OnBeforeTaskAdd", true) as $arEvent) { $bEventRes = ExecuteModuleEventEx($arEvent, array($arFields)); if ($bEventRes === false) { if ($err = $APPLICATION->GetException()) { $arMsg[] = array( "id" => "ID", "text" => $err->GetString()." [".IntVal($arFields["CONTROLLER_MEMBER_ID"])."].", ); } else { $arMsg[] = array( "id" => "ID", "text" => "Unknown error."." [".IntVal($arFields["CONTROLLER_MEMBER_ID"])."].", ); } break; } } } if(count($arMsg)>0) { $e = new CAdminException($arMsg); $APPLICATION->ThrowException($e); return false; } if($ID===false && !is_set($arFields, "DATE_CREATE")) $arFields["~DATE_CREATE"] = $DB->CurrentTimeFunction(); return true; } public static function Add($arFields) { global $DB; if(!CControllerTask::CheckFields($arFields)) return false; unset($arFields["TIMESTAMP_X"]); unset($arFields["~TIMESTAMP_X"]); $ID = $DB->Add("b_controller_task", $arFields, array("INIT_EXECUTE", "INIT_EXECUTE_PARAMS")); return $ID; } public static function Update($ID, $arFields) { global $DB; if(!CControllerTask::CheckFields($arFields, $ID)) return false; unset($arFields["TIMESTAMP_X"]); $arFields["~TIMESTAMP_X"] = $DB->CurrentTimeFunction(); $arUpdateBinds = array(); $strUpdate = $DB->PrepareUpdateBind("b_controller_task", $arFields, "", false, $arUpdateBinds); $strSql = "UPDATE b_controller_task SET ".$strUpdate." WHERE ID=".intval($ID); $arBinds = array(); foreach($arUpdateBinds as $field_id) $arBinds[$field_id] = $arFields[$field_id]; $DB->QueryBind($strSql, $arBinds); return true; } public static function Delete($ID) { global $DB; $DB->Query("DELETE FROM b_controller_task WHERE ID=".intval($ID)); return true; } public static function GetList($arOrder = Array(), $arFilter = Array(), $bCnt = false, $arNavParams = false) { global $DB; static $arFields = array( "ID" => Array("FIELD_NAME" => "T.ID", "FIELD_TYPE" => "int"), "TIMESTAMP_X" => Array("FIELD_NAME" => "T.TIMESTAMP_X", "FIELD_TYPE" => "datetime"), "DATE_CREATE" => Array("FIELD_NAME" => "T.DATE_CREATE", "FIELD_TYPE" => "datetime"), "TASK_ID" => Array("FIELD_NAME" => "T.TASK_ID", "FIELD_TYPE" => "string"), "CONTROLLER_MEMBER_ID" => Array("FIELD_NAME" => "T.CONTROLLER_MEMBER_ID", "FIELD_TYPE" => "int"), "CONTROLLER_MEMBER_NAME" => Array("FIELD_NAME" => "M.NAME", "FIELD_TYPE" => "string"), "CONTROLLER_MEMBER_URL" => Array("FIELD_NAME" => "M.URL", "FIELD_TYPE" => "string"), "STATUS" => Array("FIELD_NAME" => "T.STATUS", "FIELD_TYPE" => "string"), "DATE_EXECUTE" => Array("FIELD_NAME" => "T.DATE_EXECUTE", "FIELD_TYPE" => "datetime"), ); $obWhere = new CSQLWhere; $obWhere->SetFields($arFields); $arFilterNew = Array(); foreach($arFilter as $k=>$value) if(is_array($value) || strlen($value)>0 || $value === false) $arFilterNew[$k]=$value; $strWhere = $obWhere->GetQuery($arFilterNew); if($bCnt) { $strSelect = " SELECT COUNT('x') as C ,MIN(T.ID) as MIN_ID ,MAX(T.ID) as MAX_ID "; } else { $strSelect = " SELECT T.ID ,T.TASK_ID ,T.CONTROLLER_MEMBER_ID ,T.INIT_EXECUTE ,T.INIT_EXECUTE_PARAMS ,T.INIT_CRC ,T.UPDATE_PERIOD ,T.RESULT_EXECUTE ,T.STATUS ,M.NAME as CONTROLLER_MEMBER_NAME ,M.URL as CONTROLLER_MEMBER_URL ,".$DB->DateToCharFunction("T.TIMESTAMP_X")." as TIMESTAMP_X ,".$DB->DateToCharFunction("T.DATE_EXECUTE")." as DATE_EXECUTE ,".$DB->DateToCharFunction("T.DATE_CREATE")." as DATE_CREATE "; } $strSql = " FROM b_controller_task T INNER JOIN b_controller_member M ON T.CONTROLLER_MEMBER_ID = M.ID ".(strlen($strWhere) <= 0 ? "" : "WHERE ".$strWhere)." "; $strOrder = CControllerAgent::_OrderBy($arOrder, $arFields); if (is_array($arNavParams) && $arNavParams["nTopCount"] > 0) { $strSql = $DB->TopSQL($strSelect.$strSql.$strOrder, $arNavParams["nTopCount"]); $dbr = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); } elseif (is_array($arNavParams)) { $res_cnt = $DB->Query("SELECT count('x') CNT ".$strSql); $ar_cnt = $res_cnt->Fetch(); $dbr = new CDBResult(); $dbr->NavQuery($strSelect.$strSql.$strOrder, $ar_cnt["CNT"], $arNavParams); } else { $dbr = $DB->Query($strSelect.$strSql.$strOrder, false, "File: ".__FILE__."<br>Line: ".__LINE__); } $dbr->is_filtered = (strlen($strWhere) > 0); return $dbr; } public static function GetByID($ID) { return CControllerTask::GetList(Array(), Array("ID"=>IntVal($ID))); } public static function ProcessTask($ID) { /** @global CMain $APPLICATION */ global $APPLICATION; /** @global CDatabase $DB */ global $DB; $ID = intval($ID); $lockId = "X".$APPLICATION->GetServerUniqID()."_ctask_".$ID; $STATUS = "0"; // locking the task if(!CControllerAgent::_Lock($lockId)) { $APPLICATION->ResetException(); return $STATUS; } // selecting task $strSql = "SELECT T.*, M.SHARED_KERNEL ". "FROM b_controller_task T LEFT JOIN b_controller_member M ON T.CONTROLLER_MEMBER_ID=M.ID ". "WHERE T.ID='".$ID."' AND T.STATUS<>'Y'"; $db_task = $DB->Query($strSql); if($ar_task = $db_task->Fetch()) { $arControllerLog = array( 'CONTROLLER_MEMBER_ID' => $ar_task["CONTROLLER_MEMBER_ID"], 'TASK_ID' => $ar_task['ID'], 'STATUS' => 'Y', ); $RESULT = ''; $STATUS = 'Y'; unset($INIT_EXECUTE_PARAMS); $APPLICATION->ResetException(); switch($ar_task['TASK_ID']) { case 'SET_SETTINGS': $arControllerLog['NAME'] = 'SET_SETTINGS'; $res = CControllerMember::SetGroupSettings($ar_task["CONTROLLER_MEMBER_ID"], $ar_task['ID']); if ($res === false) { $e = $APPLICATION->GetException(); $STATUS = "F"; $RESULT = $e->GetString(); $arControllerLog['STATUS'] = 'N'; } else { $RESULT = $res; } break; case 'CLOSE_MEMBER': $arControllerLog['NAME'] = 'SITE_CLOSING'; $res = CControllerMember::CloseMember($ar_task["CONTROLLER_MEMBER_ID"], $ar_task['INIT_EXECUTE_PARAMS'], $ar_task['ID']); if ($res === false) { $STATUS = "F"; $e = $APPLICATION->GetException(); if ($e) $RESULT = $e->GetString(); } else { $RESULT = $res; } break; case 'UPDATE': $arControllerLog['NAME'] = 'SITE_UPDATE'; if($ar_task["SHARED_KERNEL"] == "Y") { $STATUS = "F"; $RESULT = GetMessage("CTRLR_TASK_ERR_KERNEL"); $arControllerLog['STATUS'] = 'N'; } else { $command = 'require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_client.php");'; if($ar_task["STATUS"]=="P" && strlen($ar_task["INIT_EXECUTE_PARAMS"])>0) $command .= 'echo trim(CUpdateControllerSupport::Update("'.EscapePHPString($ar_task["INIT_EXECUTE_PARAMS"]).'"));'; else $command .= 'echo trim(CUpdateControllerSupport::Update(""));'; $res = CControllerMember::RunCommand($ar_task["CONTROLLER_MEMBER_ID"], $command, array(), $ar_task['ID']); if($res!==false) { if(($p = strpos($res, "|"))>0) { $result_code = substr($res, 0, $p); $RESULT = substr($res, $p + 1); } else { $result_code = $res; $RESULT = $res; } if($result_code=='ERR') { $STATUS = "F"; $arControllerLog['STATUS'] = 'N'; } elseif($result_code=='STP0') // STP { $STATUS = "P"; } elseif($result_code!='FIN') // other command { $STATUS = "P"; $INIT_EXECUTE_PARAMS = $result_code; } else { $RESULT = GetMessage("CTRLR_TASK_UPD_COMPL"); } } else { $STATUS = "F"; $e = $APPLICATION->GetException(); $RESULT = $e->GetString(); $arControllerLog['STATUS'] = 'N'; } } break; case 'COUNTERS_UPDATE': $arControllerLog['NAME'] = 'UPDATE_COUNTERS'; $res = CControllerMember::UpdateCounters($ar_task["CONTROLLER_MEMBER_ID"], $ar_task['ID']); $RESULT = ''; if($res!==false) { foreach($res as $k=>$v) $RESULT .= "$k=$v;\r\n"; } else { $e = $APPLICATION->GetException(); $STATUS = "F"; $RESULT = $e->GetString(); $arControllerLog['STATUS'] = 'N'; } break; case 'REMOTE_COMMAND': $arControllerLog['NAME'] = 'REMOTE_COMMAND'; if(strlen($ar_task['INIT_EXECUTE_PARAMS'])>0) $ar_task['INIT_EXECUTE_PARAMS'] = unserialize($ar_task['INIT_EXECUTE_PARAMS']); else $ar_task['INIT_EXECUTE_PARAMS'] = Array(); $res = CControllerMember::RunCommand($ar_task["CONTROLLER_MEMBER_ID"], $ar_task['INIT_EXECUTE'], $ar_task['INIT_EXECUTE_PARAMS'], $ar_task['ID']); if($res!==false) $RESULT = $res; else { $STATUS = "F"; $e = $APPLICATION->GetException(); $RESULT = $e->GetString(); $arControllerLog['STATUS'] = 'N'; } break; case 'SEND_FILE': $arControllerLog['NAME'] = 'SEND_FILE'; break; } if(!isset($arControllerLog['DESCRIPTION'])) $arControllerLog['DESCRIPTION'] = $RESULT; CControllerLog::Add($arControllerLog); // updating status $arUpdateFields = array( "STATUS" => $STATUS, "~DATE_EXECUTE" => $DB->CurrentTimeFunction(), "RESULT_EXECUTE" => $RESULT, "INDEX_SALT" => rand(), ); if(isset($INIT_EXECUTE_PARAMS)) $arUpdateFields["INIT_EXECUTE_PARAMS"] = $INIT_EXECUTE_PARAMS; $arUpdateBinds = array(); $strUpdate = $DB->PrepareUpdateBind("b_controller_task", $arUpdateFields, "", false, $arUpdateBinds); $strSql = "UPDATE b_controller_task SET ".$strUpdate." WHERE ID=".$ID; $arBinds = array(); foreach($arUpdateBinds as $field_id) $arBinds[$field_id] = $arUpdateFields[$field_id]; $DB->QueryBind($strSql, $arBinds); } // unlocking CControllerAgent::_UnLock($lockId); return $STATUS; } public static function ProcessAllTask() { $dbrTask = CControllerTask::GetList(array("ID" => "ASC"), array("=STATUS" => array('N', 'P'))); while ($arTask = $dbrTask->Fetch()) { CControllerTask::ProcessTask($arTask["ID"]); } return true; } } ?>