• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/checklist.php
  • Класс: CAutoCheck
  • Вызов: CAutoCheck::CheckKernel
static function CheckKernel($arParams)
{
	global $DB;

	$startTime = time();
	$installFilesMapping = array(
		"install/components/bitrix/" => "/bitrix/components/bitrix/",
		"install/js/" => "/bitrix/js/",
		"install/activities/" => "/bitrix/activities/",
		"install/admin/" => "/bitrix/admin/",
		"install/wizards/" => "/bitrix/wizards/",
	);

	$events = BitrixMainEventManager::getInstance()->findEventHandlers("main", "onKernelCheckInstallFilesMappingGet");
	foreach ($events as $event)
	{
		$pathList = ExecuteModuleEventEx($event);
		if(is_array($pathList))
		{
			foreach ($pathList as $pathFrom=>$pathTo)
			{
				if(!array_key_exists($pathFrom, $installFilesMapping))
				{
					$installFilesMapping[$pathFrom] = $pathTo;
				}
			}
		}
	}

	if(empty(BitrixMainApplication::getInstance()->getSession()["BX_CHECKLIST"][$arParams["TEST_ID"]]))
		BitrixMainApplication::getInstance()->getSession()["BX_CHECKLIST"][$arParams["TEST_ID"]] = array();
	$NS = &BitrixMainApplication::getInstance()->getSession()["BX_CHECKLIST"][$arParams["TEST_ID"]];
	if ($arParams["STEP"] == false)
	{
		$NS = array();
		$rsInstalledModules = CModule::GetList();
		while ($ar = $rsInstalledModules->Fetch())
		{
			if (!mb_strpos($ar["ID"], "."))
				$NS["MLIST"][] = $ar["ID"];
		}
		$NS["MNUM"] = 0;
		$NS["FILE_LIST"] = array();
		$NS["FILES_COUNT"] = 0;
		$NS["MODFILES_COUNT"] = 0;
	}

	$arError = false;
	$moduleId = $NS["MLIST"][$NS["MNUM"]];
	$moduleFolder = $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".$moduleId."/";
	$dbtype = mb_strtolower($DB->type);
	$fileCount = 0;
	$modifiedFileCount = 0;
	$state = array();
	$skip = false;

	$ver = BitrixMainModuleManager::getVersion($moduleId);
	if ($ver === false)
	{
		$state = array(
			"STATUS" => false,
			"MESSAGE" =>  GetMessage("CL_MODULE_VERSION_ERROR", array("#module_id#" => $moduleId))."n"
		);
		$arError = true;
	}
	else
	{
		if(empty($NS["FILE_LIST"]))
		{
			$sHost = COption::GetOptionString("main", "update_site", "www.bitrixsoft.com");
			$proxyAddr = COption::GetOptionString("main", "update_site_proxy_addr", "");
			$proxyPort = COption::GetOptionString("main", "update_site_proxy_port", "");
			$proxyUserName = COption::GetOptionString("main", "update_site_proxy_user", "");
			$proxyPassword = COption::GetOptionString("main", "update_site_proxy_pass", "");

			$http = new BitrixMainWebHttpClient();
			$http->setProxy($proxyAddr, $proxyPort, $proxyUserName, $proxyPassword);

			$data = $http->get("http://".$sHost."/bitrix/updates/checksum.php?check_sum=Y&module_id=".$moduleId."&ver=".$ver."&dbtype=".$dbtype."&mode=2");

			$result = unserialize(gzinflate($data), ['allowed_classes' => false]);
			if (is_array($result))
			{
				$NS["FILE_LIST"] = $result;
			}
			$NS["MODULE_FILES_COUNT"] = count($NS["FILE_LIST"]);
		}
		else
		{
			$result = $NS["FILE_LIST"];
		}

		$message = "";
		$timeout = COption::GetOptionString("main", "update_load_timeout", "30");
		if (is_array($result) && empty($result["error"]))
		{
			foreach($result as $file => $checksum)
			{
				$filePath = $moduleFolder.$file;
				unset($NS["FILE_LIST"][$file]);

				if (!file_exists($filePath))
					continue;

				$fileCount++;
				if (md5_file($filePath)!=$checksum)
				{
					$message.= str_replace(array("//", "\\"), array("/", "\"), $filePath)."n";
					$modifiedFileCount++;
				}

				foreach ($installFilesMapping as $key => $value)
				{
					if (mb_strpos($file, $key) === 0)
					{
						$filePath = str_replace($key, $_SERVER["DOCUMENT_ROOT"].$value, $file);
						if (file_exists($filePath) && md5_file($filePath)!=$checksum)
						{
							$modifiedFileCount++;
							$message.= str_replace(array("//", "\\"), array("/", "\"), $filePath)."n";
						}
						$fileCount++;
					}
				}

				if ((time()-$startTime)>=$timeout)
					break;
			}
			if ($message <> '')
			{
				$state = array(
					"MESSAGE" => $message,
					"STATUS" => false
				);
			}
		}
		else
		{
			if($result["error"]!= "unknow module id")
			{
				$state["MESSAGE"] = GetMessage("CL_CANT_CHECK", array("#module_id#" => $moduleId))."n";
				$arError = true;
			}
			else
				$skip = true;
		}
	}
	if (!empty($state["MESSAGE"]))
	{
		if (!isset($NS["MESSAGE"][$moduleId]))
		{
			$NS["MESSAGE"][$moduleId] = '';
		}

		$NS["MESSAGE"][$moduleId].=$state["MESSAGE"];
	}
	if (!$arError && !$skip)
	{
		if (empty($NS["FILE_LIST"]))
		{
			if (!isset($NS["MESSAGE"][$moduleId]) || $NS["MESSAGE"][$moduleId] == '')
				$NS["MESSAGE"][$moduleId] = GetMessage("CL_NOT_MODIFIED", array("#module_id#" => $moduleId))."n";
			else
				$NS["MESSAGE"][$moduleId] = GetMessage("CL_MODIFIED_FILES", array("#module_id#" => $moduleId))."n".$NS["MESSAGE"][$moduleId];
		}
		$NS["FILES_COUNT"]+=$fileCount;
		$NS["MODFILES_COUNT"]+=$modifiedFileCount;
	}
	if ((isset($state["STATUS"]) && $state["STATUS"] === false) || $arError == true || $skip)
	{
		if ((isset($state["STATUS"]) && $state["STATUS"] === false) || $arError == true)
			$NS["STATUS"] = false;
		$NS["FILE_LIST"] = array();
		$NS["MODULE_FILES_COUNT"] = 0;
	}

	if (($NS["MNUM"]+1)>=(count($NS["MLIST"])) && empty($NS["LAST_FILE"]))
	{
		$arDetailReport = "";
		foreach($NS["MESSAGE"] as $module_message)
			$arDetailReport.="
".$module_message; $arResult = array( "MESSAGE" => array( "PREVIEW" => GetMessage("CL_KERNEL_CHECK_FILES").$NS["FILES_COUNT"]."n". GetMessage("CL_KERNEL_CHECK_MODULE").count($NS["MLIST"])."n". GetMessage("CL_KERNEL_CHECK_MODIFIED").$NS["MODFILES_COUNT"], "DETAIL" => $arDetailReport ), "STATUS" => ($NS["STATUS"] === false?false:true) ); } else { $percent = round(($NS["MNUM"])/(count($NS["MLIST"])*0.01), 0); $module_percent = 0; if ($NS["MODULE_FILES_COUNT"]>0) $module_percent = (1/(count($NS["MLIST"])*0.01))*((($NS["MODULE_FILES_COUNT"]-count($NS["FILE_LIST"]))/($NS["MODULE_FILES_COUNT"]*0.01))*0.01); $percent += $module_percent; $arResult = array( "IN_PROGRESS" => "Y", "PERCENT" => number_format($percent, 2), ); if (empty($NS["FILE_LIST"])) { $NS["MNUM"]++; $NS["MODULE_FILES_COUNT"] = 0; } } return $arResult; }