Обновление виртуальных квот Pure-FTP

Случается скопировать файлы в папку ftp пользователя или удалить в обход ftp сервера. Тоесть прямо с диска сервера, а не через FTP соединение. После этого наблюдается несоответствие суммарного размера файлов на диске в каталоге ftp с теми размерами которые вычисляет pureftp. В корне каждого ftp каталога при включённых виртуальных квотах размещаются файлы .ftpquota. Эти файлы содержат два числа: количество файлов и их суммарный размер. При каждом добавлении обновлении или удалении файла через FTP демон pure-ftpd вносит измненение в этот файл. И если каталоги FTP изменять (добавлять удалять файлы) в обход pure-ftpd изменения остаются неучтёнными в этом файле. Для того чтобы восстановить соответствие сожержимого папок ftp сервера и файла .ftpquota предназначается команда pure-quotacheck. Работает она только для одного выбранного пользователя. А если необходимо пробежаться по всем пользователям то можно воспользоваться таким скриптом:

#!/bin/bash

PUREPW="/usr/bin/pure-pw"
PUREQUOTACHECK="/usr/sbin/pure-quotacheck"
AWK="/bin/awk"
SED="/bin/sed"
XARGS="/usr/bin/xargs"

# update all virtual quotas with no messages
# "${PUREPW}" list | "${AWK}" '{print $2}' | "${SED}" -e 's|/\./$||g' | "${XARGS}" -I{} "${PUREQUOTACHECK}" -u pureftp -d "{}"

# update all virtual quotas with progress info
"${PUREPW}" list | "${AWK}" '{print gensub(/\.\/$/,"","g",$2)}' | while read FTPHOME ; do
  [ -e "${FTPHOME}" ] && (
    echo -en "${FTPHOME}:";
    [ -e "${FTPHOME}.ftpquota" ] && BEFORE=`cat "${FTPHOME}.ftpquota"` || BEFORE="";
    "${PUREQUOTACHECK}" -u pureftp -d "${FTPHOME}";
    AFTER=`cat "${FTPHOME}.ftpquota"`;
    [ "${BEFORE}" == "${AFTER}" ] && (echo -en " no changes ") || (
      echo -en " changed\n"
      echo -e "1 ${BEFORE}\n2 ${AFTER}" | "${AWK}" '{printf("files:%10d size:%14d", $2, $3); if($1==1){printf("\n");}}'
    )
    echo " [Done]"
  );
done

pureftp – это локальный пользователь для демона pure-ftpd
Этот скрипт отчитается о изменении файлов .ftpquota для каждого пользователя ftp и выведет информацию из этого файла перед и после обновления, так что будет ясно где была разница. Внутри также есть закоментарованный “однострочник” которые обновить файлы .ftpquota без вывода каких либо сообщений.

В документации по PureFTP рекомендуется регулярно обновлять виртуальные квоты. Поэтому скрипт можно добавить в крон и в зависимости от количества и объёма всех FTP файлов запускать его один раз в сутки или в неделю.

А этот скрипт выводит текущие квоты всех пользователей.

pure-pw list | awk '{print gensub(/\.\/$/,".ftpquota","g",$2)}' | while read FN ; do [ -e "${FN}" ] && (echo -en "${FN}:"; cat "${FN}" | tr -d '\n'; echo ) ; done

pure-ftpd не создаёт домашний каталог виртуального пользователя

pure-ftpd
Как описано в документации опция CreateHomeDir разрешает автоматически при первом входе на ftp создавать домашние каталоги для виртуальных пользователей pure-ftp при каждом входе (если каталог не существует).

После установки в конфиге /etc/pure-ftpd/pure-ftpd.conf опций

VerboseLog yes
CreateHomeDir yes

я ожидал что домашние каталоги пользователей будут создаваться. Однако они не создавались ни при добавлении виртуального пользователя ни при логине пользователя. А в логе /var/log/messages появляются такие вот скупые записи:

May 28 18:12:09 b01 pure-ftpd: (?@127.0.0.1) [INFO] New connection from 127.0.0.1
May 28 18:12:09 b01 pure-ftpd: (?@127.0.0.1) [ERROR] Home directory not available - aborting

Continue reading pure-ftpd не создаёт домашний каталог виртуального пользователя