proftpd mysql with quota

yum install proftpd-mysql

# username 使用者帳號

# uid 系統的 uid 這個可以自己隨便給個數字,不要重複到系統帳號

# gid 系統的 gid 這個看你用途是什麼來去對應

# password 使用者密碼

# homedir 使用者家目錄

# shell 使用者的 shell 最好是填 /sbin/nologin

# accessed 使用者最後登入的時間

# count 登入次數

#這個部份增加了兩個欄位 accessed, count ,因為使用者登入時,會執行 updatecount 的SQL語法,但沒有這兩個欄位,會寫不進去

#其實還少了 modified 欄位,但是我想不出來儲存這個欄位有什麼用途,所以不修正

DROP TABLE IF EXISTS `FTPUser`;

CREATE TABLE IF NOT EXISTS `FTPUser` (

`username` varchar(60) default NULL,

`ID` int(10) NOT NULL,

`GroupID` int(10) default NULL,

`password` varchar(30) default NULL,

`homedir` varchar(60) default NULL,

`shell` varchar(32) default ‘/usr/bin/nologin’,

`accessed` datetime NOT NULL,

`count` int(10) NOT NULL,

PRIMARY KEY (`uid`),

UNIQUE KEY `username` (`username`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

接下來建立 group 資料表

# groupname 群組帳號

# gid 系統的 gid 這個對應到系統 /etc/group 的 gid 值,也可以不用,看你怎麼用

# members 這個群組的成員

CREATE TABLE IF NOT EXISTS `FTPGroups` (

`pname` varchar(30) NOT NULL DEFAULT “,

`ID` int(10) NOT NULL DEFAULT ‘0’,

`members` varchar(255) DEFAULT NULL

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

接下來修改 proftpd.conf

UseReverseDNS off

#建議開啟 Log,登入發生錯誤時,也比較好抓問題

SystemLog /var/log/proftpd/ftp.log

DefaultAddress ::

# 使用 mysql 資料庫為主

SQLBackend mysql

# SQLAuthTypes Backend

# 密碼認證 已 PASSWORD() 產生為主

# 密碼使用明碼 Plaintext

SQLAuthTypes Plaintext

# 開啟認證

SQLAuthenticate on

# MySQL 連線資訊,資料庫名稱@主機 帳號 密碼

SQLConnectInfo UploadFileTest@localhost upload MhevvdRYU7RNr9QZ

# 使用者資料庫欄位

SQLUserInfo FTPUser username password ID GroupID homedir shell

#SQLUserInfo custom:/get-user-by-name/get-user-by-id/get-user-names/get-all-users

# 群組資料庫欄位

SQLGroupInfo FTPGroups name ID members

# SQL Log 檔

SQLLogFile /var/log/proftpd/sql.log

# 當 Home 目錄不存在,會自己產生。

#SQLHomedirOnDemand on

CreateHome on

RequireValidShell off

#SQLDefaultGID 99

#SQLDefaultUID 99

# SQL Log 格式,當正確登入時,要執行的 SQL 語法

SQLLog PASS updatecount

# updatecount 增加登入跟時間

SQLNamedQuery updatecount UPDATE “count=count+1, accessed=now() where username=’%u'" FTPUser

# SQL Log 格式,當儲存或刪除檔案時,要執行的 SQL 語法

SQLLog STOR,DELE modified

# modified 語法

#SQLNamedQuery modified UPDATE “accessed=now() where ID=’%u'" FTPUser

#SQLNamedQuery get-user-by-name SELECT “username, password, ID, GroupID, homedir, shell FROM FTPUser WHERE username = ‘%U'"

#SQLNamedQuery get-user-by-id SELECT “username, password, ID, GroupID, homedir, shell FROM FTPUser WHERE ID = %{0}"

#SQLNamedQuery get-user-names SELECT “username FROM FTPUser"

#SQLNamedQuery get-all-users SELECT “username, password, ID, GroupID, homedir, shell FROM FTPUser"

# 硬碟限額部分

QuotaDirectoryTally on

#硬碟限額單位 b | Kb | Mb| Gb

QuotaDisplayUnits “Mb"

# 啟動 Quota

QuotaEngine on

# 硬碟限額日志記錄

QuotaLog /var/log/proftpd/proftpd_quota.log

# 打開硬碟限額資訊,當登陸FTP帳戶后,使用命令 “quote SITE QUOTA" 后可顯示當前使用者的硬碟限額

QuotaShowQuotas on

QuotaLock /var/lock/ftpd.quotatab.lock

QuotaLimitTable sql:/get-quota-limit

QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

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