<?php

$rootDir=LAB_PATH_ROOT;

$fileArray=array();

$exts=array('php', 'tpl', 'htaccess', 'ini', 'inc');
$stopFiles=array();
$stopFilesRelative=array('/kernel/modules/crc_control/crc.php');
$stopDirs=array('.', '..', '.svn');
$stopDirsRelative=array('/data/cache/smarty', '/data/template_c');

$exts=implode('|', $exts);

$new=$changed=array();

if (!empty($_GET['action']) && 'parse'==$_GET['action']) {
	makeFileList('/');
} else {
	checkFiles('/');
}

exit;

function getFileList($dir='', $mode='check')
{
	global $rootDir, $fileArray, $exts, $stopFiles, $stopDirs, $new, $changed, $stopDirsRelative, $stopFilesRelative;

	if ('/'==$dir) $dir='';
	$files=scandir($rootDir.'/'.$dir);
	if ($files) {
		foreach ($files as $file) {
			$relativePath=$dir.'/'.$file;
			$absolutePath=$rootDir.$dir.'/'.$file;
			if (is_file($absolutePath)) {
				if (in_array($relativePath, $stopFilesRelative)) continue;
				if (in_array($file, $stopFiles)) continue;
				if (!preg_match('/\.'.$exts.'$/i', $file)) continue;
				if ('check'==$mode) {
					if (!array_key_exists($relativePath, $fileArray)) {
						$new[]=$relativePath;
						continue;
					}
					if ($fileArray[$relativePath]!=getHash($absolutePath)) {
						$changed[]=$relativePath;
						continue;
					}
				} elseif ('parse'==$mode) {
					$fileArray[$relativePath]=getHash($absolutePath);
				}
			} elseif (is_dir($absolutePath)) {
				if (in_array($relativePath, $stopDirsRelative)) continue;
				if (in_array($file, $stopDirs)) continue;
				getFileList($relativePath, $mode);
			}
		}
	}
}

function getHash($file)
{
	return crc32(file_get_contents($file));
}

function makeFileList($dir)
{
	getFileList($dir, 'parse');
	saveFileList();
	die('Парсинг завершен');
}

function checkFiles($dir)
{
	global $fileArray, $changed, $new;
	$file=dirname(__FILE__).'/crc.php';
	if (!is_readable($file))
		sendError('Не могу прочесть файл crc.php!');
	if (is_writable($file))
		sendError('файл crc.php доступен для изменения!');
		
	include $file;

	getFileList($dir, 'check');
	
	sendMessage();
	if ($changed || $new) {
		die ('Произошли изменения!');
	} else {
		die ('Изменений нет');
	}
}

function sendError($msg)
{
	global $error;
	$error=$msg;
	sendMessage();
	die($error);
}

function saveFileList()
{
	global $fileArray;
	$file=dirname(__FILE__).'/crc.php';
	if (!file_exists($file) && !is_writable(dirname(__FILE__)))
		die('не могу сохранить файл!');
	if (!file_exists($file) && !touch($file))
		die('не удалось создать файл!');
	if (!is_writable($file))
		die('файл недоступен для записи!');
	$r=fopen($file, 'w');
	fwrite($r, "<?php\n");
	foreach ($fileArray as $k=>$v) {
		$string='$fileArray[\''.$k.'\']='.$v.";\n";
		fwrite($r, $string);
	}
	fclose($r);
}

function sendMessage()
{
	global $new, $changed, $error;

	if ($changed || $new || $error) {
		$subject="Подозрительная активность на сайте ".config::get('core.siteUrl');
		$message=$subject.":\n";
		$from='alarm';
	} else {
		$subject="Проверка сайта ".config::get('core.siteUrl')." прошла успешно";
		$message="На сайте ".config::get('core.siteUrl')." изменений не зафиксировано.";
		$from='checker';
	}
	
	
	if ($error) {
		$message.="Зафиксирована ошибка:\n";
		$message.=$error;
	}

	if ($new) {
		$message.="Новые файлы:\n";
		$message.=print_r($new, true);
	}
	if ($changed) {
		$message.="Измененные файлы:\n";
		$message.=print_r($changed, true);
	}

	$mail=new Mailer(config::get('core.admin_mail'));
	$mail->From = $from.'@'.config::get('core.domain');
	$mail->FromName = "CRC Checker";
	$mail->Subject = $subject;
	$mail->Body    = $message;
	$mail->Send();
}
