.
23 августа 2010

Скрипт отслеживания изменений в файлах

posted in Полезности, Программирование |

apple_worm

Этот скрипт как и предыдущий, контролирующий доступность сервера, нужно было написать ещё 5 лет тому назад. Последней каплей сподвинувшей стал взлом одного из моих сайтиков, в результате чего сильно попадали позиции :(

В общем идея как всегда очень простая, даже не знаю почему хостеры не предоставляют подобный функционал:

Раз в (период времени) делается «снимок» файловой системы (например корневой каталог вашего сайта) с учётом поддиректорий (в принципе в список можно добавить исключения) и сливается с результатами снимка сделанного за предыдущий запуск скрипта, если есть разногласия в размерах файлов (сначала md5 делал — в конечном итоге подумал, что достаточно и размера ...) информируем владельца сайта о найденных разногласиях.

По началу сваял скрипт не используя выгрузки в файлы — всё на массивах, но он не выдержал проверки моего основного рабочего домена — там сотни тысяч файлов — сдох по нехватке памяти.

После чего вообще решил только практически на командах ОС всё сделать "ls -lR" + "diff", но так и не получилось вывести в ls файлы с полным абсолютным путём,  в конечном итоге получился некий симбиоз который и выкладываю на ваш суд:

set_time_limit(0);
ignore_user_abort();

ini_set('display_errors',1);
ini_set("error_reporting", E_ALL);

// папочка, которую контролируем (включая подпапки)
$rootdir = "./";
// куда кладём инфу о изменениях
$diffdir = "./diffdir/";

// настройки для оповещения мылом
$mailto  = "admin@gmail.com";
$subject = "Allert";
$message = "";

include_once("dBug.php"); // этот дебаг класс для отображения расхождений, берём тута  http://dbug.ospinto.com

// если id задан смотрим старые изменения по номеру
if (isset($_GET['id'])) {
$id = $_GET['id'];
$buf = file_get_contents($diffdir.$id);
new dBug(unserialize($buf));
die();
}

if (!rename($diffdir."curr.txt", $diffdir."old.txt")) {
dir("rename error");
}

$fp = fopen($diffdir."curr.txt","a+");
//собираем длинны всех файлов указанной директории $rootdir
checkmd($rootdir);
fclose($fp);

// непосредственно сравнивает два файла (средствами команды ОС diff)
exec("diff ".$diffdir."curr.txt ".$diffdir."old.txt >".$diffdir."diff.txt");

// обрабатываем и выплёвываем в удобный нам вид результат предыдущей команды
$arr = file($diffdir."diff.txt");
foreach ($arr as $ar) {
$str = trim($ar," \r\n\t");
@list($dir,$len,$file) = split(" ",$str);
if (!isset($file)) continue;
// пропускаем файлы из папки diffstat
if (strstr($file,$diffdir)) continue;

$diff[$file][$dir] = $len;
$message.=$file."\t".$dir." ".$len."\n";
}
// оповещаем о изменениях на мыло
if (!empty($diff)) {
mail($mailto, $subject, $message);
file_put_contents($diffdir.time(),serialize($diff));
new dBug($diff);
} else {
echo "changes not found";
}
// функция сбора информации о файлах в директории
function checkmd($cat) {
global $fp;
$dir = dir($cat);
while($file = $dir->read()) {
if ($file=='.' or $file=='..') continue;
if (is_dir($cat.$file)) {
checkmd($cat.$file.'/');
}
$md5 = filesize($cat.$file);
fwrite($fp,$md5." ".$cat.$file."\n");
}
}



<Хвостовой>
Онлайн обучение бизнесу все сильнее входит в нашу жизнь. Благодаря развитию Интернета, теперь каждый может воспользоваться такой возможностью.

Яндекс.Метрика