Автоматическое удаление старых записей видеонаблюдения с FTP-сервера

Многие IP-камеры и видеорегистраторы имеют функцию загрузки записей на FTP-сервер. У такого подхода есть множество преимуществ, как минимум, записи хранятся не только на самом записывающем устройстве, но и на удаленном сервере. Это гарантирует сохранность записей даже в случае возникновения внештатных ситуаций на объекте.

При использовании только стандартных средств прошивки, по мере накопления записей, возникает необходимость периодической чистки хранилища. Делать это вручную — можно, но неудобно. А, в том случае, если запись ведется по движению, понять когда нужно чистить хранилище — практически невозможно.

PHP-скрипт для автоматической очистки FTP-сервера

После непродолжительного поиска готовых решений, ввиду их отсутствия, было принято решение написать простой PHP-скрипт, который будет каждую ночь запускаться по Cron. В его задачи будет входить проверка «веса» директории с записями на сервере и, в случае превышения определенного, — удаление старых записей. Также он записывает названия удаляемых файлов и их количество в лог. Вот код получившегося скрипта:

<?php
$ftp_server = "ftp.example.com"; //Адрес FTP сервера
$port = 21; //Порт FTP сервера
$ftp_username = "username"; //Имя пользователя
$ftp_userpass = "password"; //Пароль
$main_dir = "/Camera/"; //Путь к папке с записями
$main_size = 21474836480; //Нужный размер архива в Байтах (20 Гигабайт = 21474836480 Байт)

$conn = ftp_connect($ftp_server, $port);
ftp_login($conn, $ftp_username, $ftp_userpass);
ftp_pasv($conn, true);
$count_delete = 0;
$names_delete = "";
while (calculate_whole_directory($conn, $main_dir) > $main_size) {
    $contents = ftp_nlist($conn, $main_dir);
    if (!empty($contents)) {
        foreach ($contents as $file) {
            $array[] = ftp_mdtm($conn, $file);
        }
        $delete_file = $contents[array_search(min($array), $array)];
        ftp_rrmdir($conn, $main_dir . $delete_file);
        $count_delete++;
        $names_delete = $names_delete . " " . $delete_file;
    }
}
file_put_contents('log.txt', date("d.m.Y H:i:s") . "     Удалено " . $count_delete . " директорий:" . $names_delete . "\n", FILE_APPEND);
ftp_close($conn);

function ftp_rrmdir($conn_id, $directory)
{
    $lists = ftp_mlsd($conn_id, $directory);
    unset($lists[0]);
    unset($lists[1]);
    foreach ($lists as $list) {
        $full = $directory . '/' . $list['name'];

        if ($list['type'] == 'dir') {
            ftp_rrmdir($conn_id, $full);
        } else {
            ftp_delete($conn_id, $full);
        }
    }
    ftp_rmdir($conn_id, $directory);
    return true;
}

function calculate_whole_directory($ftp_conn, $directory)
{
    $lines = ftp_rawlist($ftp_conn, $directory);
    $result = 0;
    foreach ($lines as $line) {
        $tokens = preg_split("/\s+/", $line);
        $name = $tokens[8];
        if ($tokens[0][0] === 'd') {
            $size = calculate_whole_directory($ftp_conn, "$directory/$name");
        } else {
            $size = intval($tokens[4]);
        }
        $result += $size;
    }

    return $result;
}

Для установки, создадим файл с названием «ftp_delete.php» в домашней папке нашего пользователя. Затем, откроем его на редактирование. Скопируем туда код скрипта. Нам потребуется изменить значения следующих переменных:


$ftp_server = "ftp.example.com"; //Адрес FTP сервера
$port = 21; //Порт FTP сервера
$ftp_username = "username"; //Имя пользователя
$ftp_userpass = "password"; //Пароль
$main_dir = "/Camera/"; //Путь к папке с записями
$main_size = 21474836480; //Нужный размер архива в Байтах (20 Гигабайт = 21474836480 Байт)

Чтобы скрипт выполнялся автоматически в нужное нам время, добавим его в Cron. Выполним «crontab -e» и скопируем туда строку:

0 4 * * * /usr/bin/php /home/user/ftp_delete.php >/dev/null 2>&1

В данном случае, скрипт «ftp_delete.php» по адресу: /home/user/ будет выполняться каждый день в 4 часа утра интерпретатором PHP. Установка завершена.