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;
}