Скрипт отслеживания изменений в файлах
posted in Полезности, Программирование |
Этот скрипт как и предыдущий, контролирующий доступность сервера, нужно было написать ещё 5 лет тому назад. Последней каплей сподвинувшей стал взлом одного из моих сайтиков, в результате чего сильно попадали позиции 🙁
В общем идея как всегда очень простая, даже не знаю почему хостеры не предоставляют подобный функционал:
Раз в (период времени) делается «снимок» файловой системы (например корневой каталог вашего сайта) с учётом поддиректорий (в принципе в список можно добавить исключения) и сливается с результатами снимка сделанного за предыдущий запуск скрипта, если есть разногласия в размерах файлов (сначала md5 делал — в конечном итоге подумал, что достаточно и размера …) информируем владельца сайта о найденных разногласиях.
По началу сваял скрипт не используя выгрузки в файлы — всё на массивах, но он не выдержал проверки моего основного рабочего домена — там сотни тысяч файлов — сдох по нехватке памяти.
После чего вообще решил только практически на командах ОС всё сделать «ls -lR» + «diff«, но так и не получилось вывести в ls файлы с полным абсолютным путём, в конечном итоге получился некий симбиоз который и выкладываю на ваш суд:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
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"); } } |
<Хвостовой>
Онлайн обучение бизнесу все сильнее входит в нашу жизнь. Благодаря развитию Интернета, теперь каждый может воспользоваться такой возможностью.
Хвостовой>