Настройка поддержки дисковых квот в ProFTP выполняется достаточно просто. Для этого необходимо установить модуль поддержки квот и модуль поддержки MySQL, создать в базе данных таблицы для хранения данных о квотах и задать в файле конфигурации данные для подключения и SQL-запросы для обращения к этим данным. Выполняется это следующим образом:
1. Установка модулей. Если установка делается из портов, то нужно выполнить
make config
и включить модули MYSQL и QUOTA.
Если установка выполняется из исходников обычным способом, то необходимо выполнить
./configure --with-modules=mod_quotatab:mod_quotatab_sql
Далее компиляция и установка выполняется обычным способом:
make && make install && make clean
2. Создание таблиц в базе данных MySQL.
ProFTPd использует две таблицы с данными о квотах. В первой (назовем ее quotalimits) хранится список ограничений для пользователей, во второй (quotatallies) — статистика по использованию дискового пространства, объему скачанных файлов и т.д.
Таблицы создаются следующими запросами:
CREATE TABLE quotalimits (
name VARCHAR(30),
quota_type ENUM("user", "group", "class", "all") NOT NULL,
per_session ENUM("false", "true") NOT NULL,
limit_type ENUM("soft", "hard") NOT NULL,
bytes_in_avail BIGINT NOT NULL,
bytes_out_avail BIGINT NOT NULL,
bytes_xfer_avail BIGINT NOT NULL,
files_in_avail INT UNSIGNED NOT NULL,
files_out_avail INT UNSIGNED NOT NULL,
files_xfer_avail INT UNSIGNED NOT NULL
); CREATE TABLE quotatallies (
name VARCHAR(30) NOT NULL,
quota_type ENUM("user", "group", "class", "all") NOT NULL,
bytes_in_used BIGINT NOT NULL,
bytes_out_used BIGINT NOT NULL,
bytes_xfer_used BIGINT NOT NULL,
files_in_used INT UNSIGNED NOT NULL,
files_out_used INT UNSIGNED NOT NULL,
files_xfer_used INT UNSIGNED NOT NULL
);
3. Настройка данных о подключении в файле конфигурации.
Файл конфигурации находится в /usr/local/etc/proftpd.conf.
Запросы SQL для получения данных об ограничениях пользователя, получения и обновления его статистики, а также добавления новой записи в таблицу статистики в случае ее отсутствия. Запросы задаются с помощью директивы SQLNamedQuery, после которой указывается имя запроса (в одно слово) и текст запроса.
SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, \
bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM quotalimits \
WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, \
bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM quotatallies \
WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, \
bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, \
files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, \
files_xfer_used = files_xfer_used + %{5} \
WHERE name = '%{6}' AND quota_type = '%{7}'" quotatallies
SQLNamedQuery insert-quota-tally FREEFORM \
"INSERT INTO quotatallies VALUES ('%{0}','%{1}','%{2}','%{3}','%{4}','%{5}','%{6}','%{7}')"
Далее указываем путь файла для блокировки и имена запросов, используемых для выполнения определенных действий (префикс sql: означает, что используется модуль mod_quotatab_sql).
QuotaLock /var/run/ftpd/tally.lock
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
Теперь укажем строку с данными для подключения к СУБД (примечание: если она уже указана в секции Global, и для хранения квот используется та же база, то повторно ее указывать не обязательно):
SQLConnectInfo proftpd@localhost proftpd password
Далее осталось только включить модуль квот и пересчет статистики при заходе пользователя на сервер:
QuotaEngine on
QuotaOptions ScanOnLogin
В итоге в файле конфигурации получается примерно следующее:
<IfModule mod_quotatab.c>
SQLConnectInfo proftpd@localhost proftpd password
SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, \
bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM quotalimits \
WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, \
bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM quotatallies \
WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, \
bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, \
files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, \
files_xfer_used = files_xfer_used + %{5} \
WHERE name = '%{6}' AND quota_type = '%{7}'" quotatallies
SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" quotatallies
SQLNamedQuery insert-quota-tally FREEFORM \
"INSERT INTO quotatallies VALUES ('%{0}','%{1}','%{2}','%{3}','%{4}','%{5}','%{6}','%{7}')"
QuotaLock /var/run/ftpd/tally.lock
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
QuotaOptions ScanOnLogin
QuotaEngine on
</IfModule>
4. Заполнение таблицы ограничений
Таблица ограничений заполняется следующим образом:
name — имя пользователя или группы.
quota_type — тип квоты: “user” — для пользователя, “group” — для группы, “class” — для класса соединений (см. документацию) , “all” — для всех.
per_session — если true, то ограничения распространяются на один сеанс работы с сервером, если false — то учитывается статистика и за все предыдущие обращения пользователя к серверу.
limit_type — тип ограничения. Если выбран “soft”, то при превышении объема позволяется докачать текущий файл, но запрещается скачивать/закачивать следующие.
bytes_in_avail, bytes_out_avail — ограничения на объем закачиваемых (in), скачиваемых (out) файлов в байтах.
bytes_xfer_avail — ограничения на суммарный объем закачиваемых (in) и скачиваемых (out) файлов в байтах.
files_in_avail, files_out_avail — ограничение на количество файлов, разрешенных для закачивания/скачивания
files_xfer_avail — ограничение на суммарное количество скачанных/закачанных файлов
Квоты считываются из таблицы на момент подключения пользователя к серверу и сохраняются в памяти до его отключения.
Проверить объем квоты можно с помощью команды SITE QUOTA (в клиентах командной строки команда должна вводиться как quote SITE QUOTA).
В заключение следует заметить три момента.
1. Имена и структуры таблиц могут отличаться от приведенных в данном примере. При этом необходимо учитывать эти отличия в SQL-запросах.
2. Ограничения по размерам и количеству файлов распространяются только на файлы, загруженные по FTP. Если требуется наложить ограничение на файлы, создваемые другим споосбами (например, из скриптов), необходимо воспользоваться квотами файловой системы.
3. Наличие двух записей для одного пользователя приводят к отключению квоты вообще.