<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://lea-linux.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zhortein</id>
	<title>Lea Linux - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://lea-linux.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zhortein"/>
	<link rel="alternate" type="text/html" href="https://lea-linux.org/documentations/Sp%C3%A9cial:Contributions/Zhortein"/>
	<updated>2026-04-26T11:32:44Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=ProFTPD_MySQL_et_quotas&amp;diff=12429</id>
		<title>ProFTPD MySQL et quotas</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=ProFTPD_MySQL_et_quotas&amp;diff=12429"/>
		<updated>2006-04-15T07:41:46Z</updated>

		<summary type="html">&lt;p&gt;Zhortein : /* Démarrage de proftpd */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Partager ses fichiers]]&lt;br /&gt;
= ProFTPD, MySQL et Quota =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;leatitre&amp;quot;&amp;gt;ProFTPD, MySQL et Quota&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;leapar&amp;quot;&amp;gt;par [mailto:howto@espace.fr.to Space2d] &amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;leadesc&amp;quot;&amp;gt;Exemple d&#039;utilisation du support MySQL pour ProFTPD avec gestion des quotas&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
&lt;br /&gt;
Je vous conseille de lire d&#039;abord le didactitiel de DuF : [[Reseau-partfic-proftpd|Introduction à proftpd]]&lt;br /&gt;
&lt;br /&gt;
Il vous faut un système avec un serveur MySQL installé avec si possible un serveur web et PHPMyAdmin pour faciliter l&#039;administration de la BD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Remarque : ce document peut aussi convenir à la configuration du support PostGreSQL.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Au début, j&#039;utilisais le serveur ProFTPD avec la configuration d&#039;origine (ou presque), donc sur la base de l&#039;authentification unix. J&#039;ai eu besoin de modifier regulièrement les comptes FTP. Ajouter et supprimer les utlisateurs (compte linux) devient vite lourd. Je me suis donc penché sur le support MySQL de ProFTPD et je vous propose mes explications.&lt;br /&gt;
&lt;br /&gt;
Le fait d&#039;utiliser l&#039;authentification de ProFTPD par base de données vous permet, par exemple, de faire une page php de configuration ou d&#039;administrer facilement vos comptes ftp via l&#039;interface Web PHPMyAdmin.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
* Soit vous installez ProFTPD à partir de package. (Soyez sur que le package va installer le support MySQL)&lt;br /&gt;
* Soit à partir des sources.&lt;br /&gt;
&lt;br /&gt;
=== Sous Debian (apt) ===&lt;br /&gt;
&lt;br /&gt;
Il suffit de taper en tant que &#039;&#039;&#039;root&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;#apt-get install proftpd-mysql&amp;lt;/nowiki&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A partir des sources ===&lt;br /&gt;
&lt;br /&gt;
Téléchargez les sources en allant sur le [http://www.proftpd.org site de proftpd] pour obtenir la version la plus récente.&lt;br /&gt;
&lt;br /&gt;
Décompressez-les et lancez la compilation :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;tar jxvf proftpd-&#039;&#039;version&#039;&#039;.tar.bz2&amp;lt;br /&amp;gt; cd proftpd-&#039;&#039;version&#039;&#039;&amp;lt;br /&amp;gt; ./configure\&amp;lt;br /&amp;gt; --with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql\&amp;lt;br /&amp;gt; --with-includes=/usr/include/mysql\&amp;lt;br /&amp;gt; --with-libraries=/usr/lib&amp;lt;br /&amp;gt; make&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et en tant que &#039;&#039;&#039;root&#039;&#039;&#039; : &amp;lt;code&amp;gt;make install&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
&lt;br /&gt;
Créer un groupe &#039;&#039;ftpgroup&#039;&#039; avec un GID de 5500 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=code&amp;gt;groupadd -g 5500 ftpgroup&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Explications :====&lt;br /&gt;
* &#039;&#039;&#039;groupadd&#039;&#039;&#039; : invoque la commande d&#039;ajout de groupe.&lt;br /&gt;
* &#039;&#039;&#039;-g 5500&#039;&#039;&#039; : défini le GID (numéro identifiant) du groupe.&lt;br /&gt;
* &#039;&#039;&#039;ftpgroup&#039;&#039;&#039; : défini le nom du group.&lt;br /&gt;
&lt;br /&gt;
Créer un utilisateur &#039;&#039;ftpuser&#039;&#039; avec un UID de 5500 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=code&amp;gt;useradd -u 5500 -s /bin/false -d /bin/null -c &amp;quot;proftpd user&amp;quot; -g ftpgroup ftpuser&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Explications :====&lt;br /&gt;
* &#039;&#039;&#039;useradd&#039;&#039;&#039; : invoque la commande d&#039;ajout d&#039;utilisateur.&lt;br /&gt;
* &#039;&#039;&#039;-u 5500&#039;&#039;&#039; : défini l&#039;UID (numéro identifiant) de l&#039;utilisateur.&lt;br /&gt;
* &#039;&#039;&#039;-s /bin/false&#039;&#039;&#039; : défini le shell utilisé pour cet utilisateur, en l&#039;occurence, aucun puisque la connection sur une console linux est désactivée pour cet utilisateur.&lt;br /&gt;
* &#039;&#039;&#039;-d /bin/null&#039;&#039;&#039; : défini le répertoire de l&#039;utilisateur, également inexistant.&lt;br /&gt;
* &#039;&#039;&#039;-c &amp;quot;proftp user&amp;quot;&#039;&#039;&#039; : commentaire.&lt;br /&gt;
* &#039;&#039;&#039;-g ftpgroup&#039;&#039;&#039; : ajoute l&#039;utilisateur &#039;&#039;ftpuser&#039;&#039; au group &#039;&#039;ftpgroup&#039;&#039; précédemment créé.&lt;br /&gt;
* &#039;&#039;&#039;ftpuser&#039;&#039;&#039; : défini le nom de l&#039;utilisateur.&lt;br /&gt;
&lt;br /&gt;
Le groupe et l&#039;utilisateur ainsi créés serviront de lien entre les utilisateurs créés dans la base MySQL et le système d&#039;authentification/droits du système.&lt;br /&gt;
&lt;br /&gt;
=== La base de données ===&lt;br /&gt;
&lt;br /&gt;
Entrez dans l&#039;interface de la base de données :&lt;br /&gt;
&lt;br /&gt;
* si vous n&#039;avez jamais modifié les utilisateurs de la base : &amp;lt;code&amp;gt;mysql -u root&amp;lt;/code&amp;gt;&lt;br /&gt;
* sinon (avec un utilisateur/pwd ayant le droit de modifier la base): &amp;lt;code&amp;gt;mysql -u &#039;&#039;utilisateur&#039;&#039; -p&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut tout d&#039;abord créer la base de données (ex : proftpd) et les tables qu&#039;elle contient.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt; CREATE DATABASE `proftpd`;&amp;lt;br /&amp;gt; USE proftpd;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; -- Table structure for table `ftpgroup`&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; CREATE TABLE `ftpgroup` (&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt; `groupname` varchar(16) NOT NULL default &#039;&#039;,&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt; `gid` smallint(6) NOT NULL default &#039;5500&#039;,&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt; `members` varchar(16) NOT NULL default &#039;&#039;,&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt; KEY `groupname` (`groupname`)&amp;lt;br /&amp;gt; ) TYPE=MyISAM COMMENT=&#039;Table des groupes ProFTPD&#039;;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; -- Table structure for table `ftpquotalimits`&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; CREATE TABLE `ftpquotalimits` (&amp;lt;br /&amp;gt; `name` varchar(30) default NULL,&amp;lt;br /&amp;gt; `quota_type` enum(&#039;user&#039;,&#039;group&#039;,&#039;class&#039;,&#039;all&#039;) NOT NULL default &#039;user&#039;,&amp;lt;br /&amp;gt; `par_session` enum(&#039;false&#039;,&#039;true&#039;) NOT NULL default &#039;false&#039;,&amp;lt;br /&amp;gt; `limit_type` enum(&#039;soft&#039;,&#039;hard&#039;) NOT NULL default &#039;soft&#039;,&amp;lt;br /&amp;gt; `bytes_up_limit` float NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `bytes_down_limit` float NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `bytes_transfer_limit` float NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `files_up_limit` int(10) unsigned NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `files_down_limit` int(10) unsigned NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `files_transfer_limit` int(10) unsigned NOT NULL default &#039;0&#039;&amp;lt;br /&amp;gt; ) TYPE=MyISAM COMMENT=&#039;Table des quotas ProFTPD&#039;;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; -- Table structure for table `ftpquotatotal`&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; CREATE TABLE `ftpquotatotal` (&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt; `name` varchar(30) NOT NULL default &#039;&#039;,&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt; `quota_type` enum(&#039;user&#039;,&#039;group&#039;,&#039;class&#039;,&#039;all&#039;) NOT NULL default &#039;user&#039;,&amp;lt;br /&amp;gt; `bytes_up_total` float NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `bytes_down_total` float NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `bytes_transfer_total` float NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `files_up_total` int(10) unsigned NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `files_down_total` int(10) unsigned NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `files_transfer_total` int(10) unsigned NOT NULL default &#039;0&#039;&amp;lt;br /&amp;gt; ) TYPE=MyISAM COMMENT=&#039;Table des compteurs des quotas ProFTPD&#039;;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; -- Table structure for table `ftpuser`&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; CREATE TABLE `ftpuser` (&amp;lt;br /&amp;gt; `id` int(10) unsigned NOT NULL auto_increment,&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt; `userid` varchar(32) NOT NULL default &#039;&#039;,&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt; `passwd` varchar(32) NOT NULL default &#039;&#039;,&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt; `uid` smallint(6) NOT NULL default &#039;5500&#039;,&amp;lt;br /&amp;gt; `gid` smallint(6) NOT NULL default &#039;5500&#039;,&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt; `homedir` varchar(255) NOT NULL default &#039;&#039;,&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt; `shell` varchar(16) NOT NULL default &#039;/bin/false&#039;,&amp;lt;br /&amp;gt; `count` int(11) NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `accessed` datetime NOT NULL default &#039;0000-00-00 00:00:00&#039;,&amp;lt;br /&amp;gt; `modified` datetime NOT NULL default &#039;0000-00-00 00:00:00&#039;,&amp;lt;br /&amp;gt; `LoginAllowed` enum(&#039;true&#039;,&#039;false&#039;) NOT NULL default &#039;true&#039;,&amp;lt;br /&amp;gt; PRIMARY KEY (`id`)&amp;lt;br /&amp;gt; ) TYPE=MyISAM COMMENT=&#039;Table des utlisateurs ProFTPD&#039;; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite il faut créer un nouvel utilisateur (ex : proftpd) avec un mot de passe (ex : password) qui a seulement les droits de lire les données de la base proftpd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;GRANT USAGE ON proftpd.* TO &#039;&#039;&#039;proftpd&#039;&#039;&#039;@&#039;localhost&#039;&amp;lt;br /&amp;gt; IDENTIFIED BY &#039;&#039;&#039;&#039;password&#039;&#039;&#039;&#039; WITH GRANT OPTION;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;alert&amp;quot;&amp;gt;Attention : Si votre serveur MySQL n&#039;est pas sur la même machine que ProFTPD remplacez localhost par le nom de la machine (du serveur MySQL) ou par *&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuration de ProFTPD ===&lt;br /&gt;
&lt;br /&gt;
Editez le fichier &amp;lt;code&amp;gt;/etc/proftpd.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
ou &amp;lt;code&amp;gt;/usr/local/etc/proftpd.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;# Configuration de base&amp;lt;br /&amp;gt; # =====================&amp;lt;br /&amp;gt; ServerName &amp;quot;Mon serveur FTP&amp;quot;&amp;lt;br /&amp;gt; ServerType standalone&amp;lt;br /&amp;gt; ServerIdent on &amp;quot;Bienvenue sur mon ftp. Veuillez-vous identifiez&amp;quot;&amp;lt;br /&amp;gt; DeferWelcome on&amp;lt;br /&amp;gt; ServerAdmin &amp;quot;ftp_admin@mydomain.com&amp;quot;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; MultilineRFC2228 on&amp;lt;br /&amp;gt; DefaultServer on&amp;lt;br /&amp;gt; ShowSymlinks on&amp;lt;br /&amp;gt; AllowOverwrite on&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; TimeoutNoTransfer 600&amp;lt;br /&amp;gt; TimeoutStalled 600&amp;lt;br /&amp;gt; TimeoutIdle 1200&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; ListOptions &amp;quot;-l&amp;quot;&amp;lt;br /&amp;gt; Defaultroot ~&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; DenyFilter \*.*/&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; Port 21&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # A configurer selon sa connection&amp;lt;br /&amp;gt; # ================================&amp;lt;br /&amp;gt; MaxInstances 6&amp;lt;br /&amp;gt; MaxLoginAttempts 3&amp;lt;br /&amp;gt; MaxClientsPerUser 10&amp;lt;br /&amp;gt; MaxClientsPerHost 2&amp;lt;br /&amp;gt; MaxHostsPerUser 4&amp;lt;br /&amp;gt; MaxClients 6 &amp;quot;Limite a 6 utilisateurs&amp;quot;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # ProFTPD est exécuté avec des droits réduits&amp;lt;br /&amp;gt; # ============================================&amp;lt;br /&amp;gt; User nobody&amp;lt;br /&amp;gt; Group nogroup&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; Umask 022&amp;lt;br /&amp;gt; AllowStoreRestart on&amp;lt;br /&amp;gt; AllowRetrieveRestart on&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Mod MySQL&amp;lt;br /&amp;gt; # =========&amp;lt;br /&amp;gt; # Les mots de passe sont cryptés dans la base avec la fct ENCRYPT (MySQL)&amp;lt;br /&amp;gt; SQLAuthTypes Plaintext Crypt&amp;lt;br /&amp;gt; SQLAuthenticate users* groups*&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Modifiez cette ligne selon l&#039;utilisateur et le mot de passe définit plus tôt&amp;lt;br /&amp;gt; SQLConnectInfo &#039;&#039;proftpd@localhost proftpd password&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # On donne à ProFTPD le nom des colonnes de la table usertable&amp;lt;br /&amp;gt; SQLUserInfo ftpuser userid passwd uid gid homedir shell&amp;lt;br /&amp;gt; SQLUserWhereClause &amp;quot;LoginAllowed = &#039;true&#039;&amp;quot;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # On donne à ProFTPD le nom des colonnes de la table &amp;quot;grouptable&amp;quot;&amp;lt;br /&amp;gt; SQLGroupInfo ftpgroup groupname gid members&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Créer le repertoire home de l&#039;utilisateur si il n&#039;existe pas&amp;lt;br /&amp;gt; SQLHomedirOnDemand on&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Met à jour les compteurs à chaque connection d&#039;un utilisateur&amp;lt;br /&amp;gt; SQLLog PASS updatecount&amp;lt;br /&amp;gt; SQLNamedQuery updatecount UPDATE &amp;quot;count=count+1, accessed=now() WHERE userid=&#039;%u&#039;&amp;quot; ftpuser&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; #Met à jour les compteurs à chaque upload ou download d&#039;un utilisateur&amp;lt;br /&amp;gt; SQLLog STOR,DELE modified&amp;lt;br /&amp;gt; SQLNamedQuery modified UPDATE &amp;quot;modified=now() WHERE userid=&#039;%u&#039;&amp;quot; ftpuser&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Mod quota&amp;lt;br /&amp;gt; # =========&amp;lt;br /&amp;gt; QuotaEngine on&amp;lt;br /&amp;gt; QuotaDirectoryTally on&amp;lt;br /&amp;gt; QuotaDisplayUnits Mb&amp;lt;br /&amp;gt; QuotaShowQuotas on&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Définit les requêtes SQL pour que ProFTPd recupere les infos sur les quotas&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; SQLNamedQuery get-quota-limit SELECT &amp;quot;name, quota_type, par_session, limit_type, bytes_up_limit, bytes_down_limit, bytes_transfer_limit, files_up_limit, files_down_limit, files_transfer_limit FROM ftpquotalimits WHERE name = &#039;%{0}&#039; AND quota_type = &#039;%{1}&#039;&amp;quot;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; SQLNamedQuery get-quota-tally SELECT &amp;quot;name, quota_type, bytes_up_total, bytes_down_total, bytes_transfer_total, files_up_total, files_down_total, files_transfer_total FROM ftpquotatotal WHERE name = &#039;%{0}&#039; AND quota_type = &#039;%{1}&#039;&amp;quot;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; SQLNamedQuery update-quota-tally UPDATE &amp;quot;bytes_up_total = bytes_up_total + %{0}, bytes_down_total = bytes_down_total + %{1}, bytes_transfer_total = bytes_transfer_total + %{2}, files_up_total = files_up_total + %{3}, files_down_total = files_down_total + %{4}, files_transfer_total = files_transfer_total + %{5} WHERE name = &#039;%{6}&#039; AND quota_type = &#039;%{7}&#039;&amp;quot; ftpquotatotal&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; SQLNamedQuery insert-quota-tally INSERT &amp;quot;%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}&amp;quot; ftpquotatotal&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; QuotaLimitTable sql:/get-quota-limit&amp;lt;br /&amp;gt; QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; RootLogin off&amp;lt;br /&amp;gt; RequireValidShell off&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Gestion des logs&amp;lt;br /&amp;gt; # ================&amp;lt;br /&amp;gt; # Enregistre les requêtes SQL dans /var/log/proftpd/mysql.log&amp;lt;br /&amp;gt; SQLLogFile /var/log/proftpd/mysql.log&amp;lt;br /&amp;gt; # Enregistre les authentifications&amp;lt;br /&amp;gt; LogFormat auth &amp;quot;%v [%P] %h %t \&amp;quot;%r\&amp;quot; %s&amp;quot;&amp;lt;br /&amp;gt; ExtendedLog /var/log/proftpd/auth.log AUTH auth&amp;lt;br /&amp;gt; # Enregistre les accès aux fichiers&amp;lt;br /&amp;gt; LogFormat write &amp;quot;%h %l %u %t \&amp;quot;%r\&amp;quot; %s %b&amp;quot;&amp;lt;br /&amp;gt; ExtendedLog /var/log/proftpd/access.log WRITE,READ write&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Recupère le nom à partir de l&#039;ip de la machine de l&#039;utilisateur ( resolution DNS )&amp;lt;br /&amp;gt; IdentLookups on&amp;lt;br /&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin que les logs puissent être enregistrés et consultés, il faut créer au besoin le dossier /var/log/proftpd&lt;br /&gt;
&lt;br /&gt;
=== Démarrage de proftpd ===&lt;br /&gt;
&lt;br /&gt;
Il faut désormais créer le script qui va lancer proftpd. Copiez ces lignes dans /etc/init.d/proftpd (sur une Debian par exemple). Pour les systèmes autres que Debian, utilisez le fichier contenu dans le dossier contrib/dist/rpm/proftpd.init.d en le plaçant dans le dossier /etc/init.d sous le nom proftpd par la commande :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&lt;br /&gt;
cp ./contrib/dist/rpm/proftpd.init.d /etc/init.d/proftpd&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;!/bin/sh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Start the proftpd FTP daemon.&lt;br /&gt;
&lt;br /&gt;
PATH=/bin:/usr/bin:/sbin:/usr/sbin&amp;lt;br /&amp;gt;&lt;br /&gt;
DAEMON=/usr/sbin/proftpd&amp;lt;br /&amp;gt;&lt;br /&gt;
NAME=proftpd&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Defaults&amp;lt;br /&amp;gt;&lt;br /&gt;
RUN=&amp;amp;quot;no&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
OPTIONS=&amp;amp;quot;&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PIDFILE=`grep -i &#039;pidfile&#039; /etc/proftpd.conf | sed -e &#039;s/pidfile[\t ]\+//i&#039;`&amp;lt;br /&amp;gt;&lt;br /&gt;
if [ &amp;amp;quot;x$PIDFILE&amp;amp;quot; = &amp;amp;quot;x&amp;amp;quot; ];&amp;lt;br /&amp;gt;&lt;br /&gt;
then&amp;lt;br /&amp;gt;&lt;br /&gt;
PIDFILE=/var/run/proftpd.pid&amp;lt;br /&amp;gt;&lt;br /&gt;
fi&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Read config (will override defaults)&amp;lt;br /&amp;gt;&lt;br /&gt;
[ -r /etc/default/proftpd ] &amp;amp;amp;&amp;amp;amp; . /etc/default/proftpd&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
trap &amp;amp;quot;&amp;amp;quot; 1 &amp;lt;br /&amp;gt;&lt;br /&gt;
trap &amp;amp;quot;&amp;amp;quot; 15 &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test -f $DAEMON || exit 0 &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Servertype could be inetd|standalone|none. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; In all cases check against inetd and xinetd support. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
if ! egrep -qi &amp;amp;quot;^&amp;lt;nowiki&amp;gt;[[:space:]] &amp;lt;/nowiki&amp;gt;*ServerType.*standalone&amp;amp;quot; /etc/proftpd.conf &amp;lt;br /&amp;gt;&lt;br /&gt;
then &amp;lt;br /&amp;gt;&lt;br /&gt;
  if [ $(dpkg-divert --list xinetd|wc -l) -eq 1 ]  &lt;br /&gt;
  then &lt;br /&gt;
  if egrep -qi &amp;amp;quot;server&amp;lt;nowiki&amp;gt;[[:space:]]&amp;lt;/nowiki&amp;gt;*=&amp;lt;nowiki&amp;gt; [[:space:]]&amp;lt;/nowiki&amp;gt;*/usr/sbin/proftpd&amp;amp;quot; /etc/xinetd.conf -o \ &lt;br /&gt;
  egrep -qi &amp;amp;quot;server&amp;lt;nowiki&amp;gt;[[:space:]]&amp;lt;/nowiki&amp;gt;*=&amp;lt;nowiki&amp;gt;[[:space:]] &amp;lt;/nowiki&amp;gt;*/usr/sbin/proftpd&amp;amp;quot; /etc/xinetd.d/* 2&amp;amp;gt;/dev/null &lt;br /&gt;
  then &lt;br /&gt;
  RUN=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  INETD=&amp;amp;quot;yes&amp;amp;quot; &lt;br /&gt;
  else &lt;br /&gt;
  if ! egrep -qi &amp;amp;quot;^&amp;lt;nowiki&amp;gt;[[:space:]]&amp;lt;/nowiki&amp;gt;*ServerType.*inetd&amp;amp;quot; /etc/proftpd.conf &lt;br /&gt;
  then &lt;br /&gt;
  RUN=&amp;amp;quot;yes&amp;amp;quot; &lt;br /&gt;
  INETD=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  else &lt;br /&gt;
  RUN=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  INETD=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  fi &lt;br /&gt;
  fi &lt;br /&gt;
  else &lt;br /&gt;
  if egrep -qi &amp;amp;quot;^ftp.*/usr/sbin/proftpd&amp;amp;quot; /etc/inetd.conf 2&amp;amp;gt;/dev/null &lt;br /&gt;
  then &lt;br /&gt;
  RUN=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  INETD=&amp;amp;quot;yes&amp;amp;quot; &lt;br /&gt;
  else &lt;br /&gt;
  if ! egrep -qi &amp;amp;quot;^&amp;lt;nowiki&amp;gt;[[:space:]]&amp;lt;/nowiki&amp;gt;*ServerType.*inetd&amp;amp;quot; /etc/proftpd.conf &lt;br /&gt;
  then &lt;br /&gt;
  RUN=&amp;amp;quot;yes&amp;amp;quot; &lt;br /&gt;
  INETD=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  else &lt;br /&gt;
  RUN=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  INETD=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  fi &lt;br /&gt;
  fi &lt;br /&gt;
  fi &lt;br /&gt;
  fi &lt;br /&gt;
&lt;br /&gt;
start()&lt;br /&gt;
{&lt;br /&gt;
    if start-stop-daemon --start --quiet --pidfile &amp;quot;$PIDFILE&amp;quot; \&lt;br /&gt;
        --exec $DAEMON -- $OPTIONS ; then&lt;br /&gt;
        echo &amp;quot;$NAME.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
signal()&lt;br /&gt;
  {&lt;br /&gt;
  if [ &amp;amp;quot;$1&amp;amp;quot; = &amp;amp;quot;stop&amp;amp;quot; ]; then&lt;br /&gt;
  SIGNAL=&amp;amp;quot;TERM&amp;amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
  if [ &amp;amp;quot;$1&amp;amp;quot; = &amp;amp;quot;reload&amp;amp;quot; ]; then&lt;br /&gt;
  SIGNAL=&amp;amp;quot;HUP&amp;amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
  echo &amp;amp;quot;ERR: wrong parameter given to signal()&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  fi&lt;br /&gt;
  if start-stop-daemon --stop --signal $SIGNAL --quiet --pidfile &amp;amp;quot;$PIDFILE&amp;amp;quot;; then&lt;br /&gt;
  echo &amp;amp;quot;$NAME.&amp;amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
  SIGNAL=&amp;amp;quot;KILL&amp;amp;quot;&lt;br /&gt;
  if start-stop-daemon --stop --signal $SIGNAL --quiet --pidfile &amp;amp;quot;$PIDFILE&amp;amp;quot;; then&lt;br /&gt;
  echo &amp;amp;quot;$NAME.&amp;amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
  echo &amp;amp;quot;.&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  fi&lt;br /&gt;
  if [ &amp;amp;quot;$SIGNAL&amp;amp;quot; = &amp;amp;quot;KILL&amp;amp;quot; ]; then&lt;br /&gt;
  rm -f &amp;amp;quot;$PIDFILE&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case &amp;amp;quot;$1&amp;amp;quot; in&lt;br /&gt;
start)&lt;br /&gt;
  if [ &amp;amp;quot;x$RUN&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo -n &amp;amp;quot;Starting ProFTPD ftp daemon: &amp;amp;quot;&lt;br /&gt;
  start&lt;br /&gt;
  else&lt;br /&gt;
  if [ &amp;amp;quot;x$INETD&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo &amp;amp;quot;ProFTPd is started from inetd/xinetd.&amp;amp;quot;&lt;br /&gt;
  else &lt;br /&gt;
  echo &amp;amp;quot;ProFTPd warning: cannot start neither in standalone nor in inetd/xinetd mode. Check your configuration.&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  fi&lt;br /&gt;
  ;;&lt;br /&gt;
&lt;br /&gt;
force-start)&lt;br /&gt;
  if [ &amp;amp;quot;x$INETD&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo &amp;amp;quot;Warning: ProFTPd is started from inetd/xinetd (trying to start anyway).&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  echo -n &amp;amp;quot;Starting ProFTPD ftp daemon: &amp;amp;quot;&lt;br /&gt;
  start&lt;br /&gt;
  ;; &lt;br /&gt;
  &lt;br /&gt;
stop)&lt;br /&gt;
  if [ &amp;amp;quot;x$RUN&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo -n &amp;amp;quot;Stopping ProFTPD ftp daemon: &amp;amp;quot;&lt;br /&gt;
  signal stop&lt;br /&gt;
  else&lt;br /&gt;
  if [ &amp;amp;quot;x$INETD&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo &amp;amp;quot;ProFTPd is started from inetd/xinetd.&amp;amp;quot;&lt;br /&gt;
  else &lt;br /&gt;
  echo &amp;amp;quot;ProFTPd warning: cannot start neither in standalone nor in inetd/xinetd mode. Check your configuration.&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  fi&lt;br /&gt;
  ;;&lt;br /&gt;
&lt;br /&gt;
force-stop)&lt;br /&gt;
  if [ &amp;amp;quot;x$INETD&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo &amp;amp;quot;Warning: ProFTPd is started from inetd/xinetd (trying to kill anyway).&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  echo -n &amp;amp;quot;Stopping ProFTPD ftp daemon: &amp;amp;quot;&lt;br /&gt;
  signal stop&lt;br /&gt;
  ;;&lt;br /&gt;
&lt;br /&gt;
reload)&lt;br /&gt;
  echo -n &amp;amp;quot;Reloading $NAME configuration...&amp;amp;quot;&lt;br /&gt;
  signal reload&lt;br /&gt;
  echo &amp;amp;quot; done.&amp;amp;quot;&lt;br /&gt;
  ;;&lt;br /&gt;
&lt;br /&gt;
force-reload|restart)&lt;br /&gt;
  if [ &amp;amp;quot;x$RUN&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo -n &amp;amp;quot;Restarting ProFTPD ftp daemon.&amp;amp;quot;&lt;br /&gt;
  signal stop&lt;br /&gt;
  echo -n &amp;amp;quot;.&amp;amp;quot;&lt;br /&gt;
  sleep 2&lt;br /&gt;
  echo -n &amp;amp;quot;.&amp;amp;quot;&lt;br /&gt;
  start&lt;br /&gt;
  echo &amp;amp;quot; done.&amp;amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
  if [ &amp;amp;quot;x$INETD&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo &amp;amp;quot;ProFTPd is started from inetd.&amp;amp;quot;&lt;br /&gt;
  else &lt;br /&gt;
  echo &amp;amp;quot;ProFTPd warning: cannot start neither in standalone nor in inetd/xinetd mode. Check your configuration.&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  fi&lt;br /&gt;
  ;;&lt;br /&gt;
 *)&lt;br /&gt;
  echo &amp;amp;quot;Usage: /etc/init.d/$NAME {start|force-start|stop|force-stop|reload|restart|force-reload}&amp;amp;quot;&lt;br /&gt;
  exit 1&lt;br /&gt;
  ;;&lt;br /&gt;
  esac&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant vous pouvez redémarrer le serveur ProFTPd pour appliquer la configuration :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;/etc/init.d/proftpd restart&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Utilisation ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que la configuration est faite, nous allons voir comment gérer les utilisateurs à travers la base de données.&lt;br /&gt;
&lt;br /&gt;
Je vous conseille d&#039;utiliser PHPMyAdmin pour ceux qui ne connaissent pas le langage SQL.&lt;br /&gt;
&lt;br /&gt;
=== Gestion des utilisateurs ===&lt;br /&gt;
&lt;br /&gt;
==== Ajout d&#039;un utilisateur ====&lt;br /&gt;
&lt;br /&gt;
Création de l&#039;utilisateur &#039;test&#039; avec un mot de passe &#039;pwd&#039;. Cet utilisateur a accès au repertoire &#039;/home/ftp/test&#039; avec les droits de l&#039;utilisateur (UID) 5500, et de groupe (GID) 5500, sans shell (&#039;/bin/false&#039;).&lt;br /&gt;
&lt;br /&gt;
La valeur &#039;LoginAllowed&#039; est mise à &#039;true&#039; pour autoriser la connection de cet utilisateur, à &#039;false&#039; pour l&#039;interdire.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;INSERT INTO `ftpuser` ( `id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed` , `modified`, `LoginAllowed` ) VALUES (&#039;&#039;, &#039;test&#039;, ENCRYPT(&#039;pwd&#039;), &#039;5500&#039;, &#039;5500&#039;, &#039;/home/ftp/test&#039;, &#039;/bin/false&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;true&#039; ); &amp;lt;/nowiki&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;count&#039; représente le nombre d&#039;authentifications effectuées par cet utilisateur,&amp;lt;br /&amp;gt; &#039;accessed&#039; la date du dernier accès et&amp;lt;br /&amp;gt; &#039;modified&#039; la date de la dernière écriture.&lt;br /&gt;
&lt;br /&gt;
==== Suppression d&#039;un utilisateur ====&lt;br /&gt;
&lt;br /&gt;
Suppression de l&#039;utilisateur &#039;test&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;DELETE FROM `ftpuser` WHERE `userid`=&#039;test&#039;;&amp;lt;br /&amp;gt; DELETE FROM `ftpgroup` WHERE `members`=&#039;test&#039;;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion des groupes ===&lt;br /&gt;
&lt;br /&gt;
==== Affecter un utilisateur à un groupe ====&lt;br /&gt;
&lt;br /&gt;
Affecte l&#039;utilisateur &#039;test&#039; au groupe &#039;group_test&#039; avec les droits de groupe (GID) du groupe 5500&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;INSERT INTO `ftpgroup` ( `groupname` , `gid` , `members` ) VALUES (&#039;group_test&#039;, &#039;5500&#039;, &#039;test&#039;);&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Enlever un utilisateur d&#039;un groupe ====&lt;br /&gt;
&lt;br /&gt;
Enlève l&#039;utilisateur &#039;test&#039; du groupe &#039;group_test&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;DELETE FROM `ftpgroup` WHERE `members`=&#039;test&#039;;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion des quotas ===&lt;br /&gt;
&lt;br /&gt;
La table &#039;ftpquotalimits&#039; contient la description des quotas.&amp;lt;br /&amp;gt; La table &#039;ftpquotatotal&#039; contient les statistiques d&#039;utilisation correspondant aux règles des quotas défini dans la table &#039;ftpquotalimits&#039;. Cette table permet à ProFTPd de gérer les quotas.&lt;br /&gt;
&lt;br /&gt;
==== Ajouter une règles de quotas ====&lt;br /&gt;
&lt;br /&gt;
Exécuter la requête suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;INSERT INTO `ftpquotalimits` ( `name`, `quota_type`, `par_session`, `limit_type`, `bytes_up_limit`, `bytes_down_limit`, `bytes_transfer_limit`, `files_up_limit`, `files_down_limit`, `files_transfer_limit` )&amp;lt;br /&amp;gt; VALUES ( &#039;NOM&#039; , &#039;TYPE&#039;, &#039;SESSION&#039;, &#039;LIMIT_TYPE&#039;, &#039;B_UP&#039;, &#039;B_DOWN&#039;, &#039;B_TRANS&#039;, &#039;F_UP&#039;, &#039;F_DOWN&#039;, &#039;F_TRANS&#039;);&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
où&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039; : nom de l&#039;utilisateur, du groupe ou de la règle selon la valeur de &#039;&#039;&#039;quota_type&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;quota_type&#039;&#039;&#039; : &#039;user&#039; si le quota s&#039;applique à un utilisateur, &#039;group&#039; à un groupe, &#039;class&#039; à une classe (ici inutile), &#039;all&#039; à tous les utilisateurs.&lt;br /&gt;
* &#039;&#039;&#039;par_session&#039;&#039;&#039; : &#039;true&#039; si les quotas doivent être remis à zéro à chaque nouvelle session, &#039;false&#039; sinon. (&#039;false&#039; est conseillé).&lt;br /&gt;
* &#039;&#039;&#039;limit_type&#039;&#039;&#039; : &#039;soft&#039; pour une mesure logicielle de la taille, &#039;hard&#039; pour une mesure hardware.&lt;br /&gt;
* &#039;&#039;&#039;bytes_up_limit&#039;&#039;&#039; : taille (en Mbytes) autorisé à être uploadé sur le serveur.&lt;br /&gt;
* &#039;&#039;&#039;bytes_down_limit&#039;&#039;&#039; : taille (en Mbytes) autorisé à être downloadé à partir du serveur.&lt;br /&gt;
* &#039;&#039;&#039;bytes_transfer_limit&#039;&#039;&#039; : taille (en Mbytes) autorisé à transféré à sur et à partir du serveur (upload+download).&lt;br /&gt;
* &#039;&#039;&#039;files_up_limit&#039;&#039;&#039; : nombre de fichiers autorisé à être uploadé sur le serveur.&lt;br /&gt;
* &#039;&#039;&#039;files_down_limit&#039;&#039;&#039; : nombre de fichiers autorisé à être downloadé à partir du serveur.&lt;br /&gt;
* &#039;&#039;&#039;files_transfer_limit&#039;&#039;&#039; : nombre de fichiers autorisé à transféré sur et à partir du serveur (upload+download).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Pour définir un quota illimité à l&#039;un des champs, mettez une valeur négative ou nulle.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert&amp;quot;&amp;gt;Attention : Les quotas de type &#039;all&#039;, &#039;class&#039; ou &#039;group&#039; ne définissent pas un quota pour chaque utilisateur mais un quota partagé par tous les utlisateurs concernés par cette règle.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Réinitialiser les quotas ====&lt;br /&gt;
&lt;br /&gt;
Il suffit de supprimer l&#039;entrée (ligne) correspondant à la règle devant être réinitialisé. Par exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;DELETE FROM `ftpquotatotal` WHERE `name`=&#039;test&#039; AND `quota_type`=&#039;user&#039;;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous voulez réinitialiser tous les quotas, par exemple tous les mois, faîtes une tâche cron se connectant sur le serveur et exécutant la requête suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;TRUNCATE TABLE `ftpquotatotal`;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Et voilà, c&#039;est terminé... Vous n&#039;avez plus qu&#039;à tester ;-)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;merci&amp;quot;&amp;gt;Cette page est issue de la documentation &#039;pré-wiki&#039; de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par space2d le 24/04/2005.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Copyright =&lt;br /&gt;
Copyright &amp;amp;copy; 24/04/2005, space2d&lt;br /&gt;
{{CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Zhortein</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=ProFTPD_MySQL_et_quotas&amp;diff=12428</id>
		<title>ProFTPD MySQL et quotas</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=ProFTPD_MySQL_et_quotas&amp;diff=12428"/>
		<updated>2006-04-15T07:35:59Z</updated>

		<summary type="html">&lt;p&gt;Zhortein : /* Configuration de ProFTPD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Partager ses fichiers]]&lt;br /&gt;
= ProFTPD, MySQL et Quota =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;leatitre&amp;quot;&amp;gt;ProFTPD, MySQL et Quota&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;leapar&amp;quot;&amp;gt;par [mailto:howto@espace.fr.to Space2d] &amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;leadesc&amp;quot;&amp;gt;Exemple d&#039;utilisation du support MySQL pour ProFTPD avec gestion des quotas&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
&lt;br /&gt;
Je vous conseille de lire d&#039;abord le didactitiel de DuF : [[Reseau-partfic-proftpd|Introduction à proftpd]]&lt;br /&gt;
&lt;br /&gt;
Il vous faut un système avec un serveur MySQL installé avec si possible un serveur web et PHPMyAdmin pour faciliter l&#039;administration de la BD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Remarque : ce document peut aussi convenir à la configuration du support PostGreSQL.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Au début, j&#039;utilisais le serveur ProFTPD avec la configuration d&#039;origine (ou presque), donc sur la base de l&#039;authentification unix. J&#039;ai eu besoin de modifier regulièrement les comptes FTP. Ajouter et supprimer les utlisateurs (compte linux) devient vite lourd. Je me suis donc penché sur le support MySQL de ProFTPD et je vous propose mes explications.&lt;br /&gt;
&lt;br /&gt;
Le fait d&#039;utiliser l&#039;authentification de ProFTPD par base de données vous permet, par exemple, de faire une page php de configuration ou d&#039;administrer facilement vos comptes ftp via l&#039;interface Web PHPMyAdmin.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
* Soit vous installez ProFTPD à partir de package. (Soyez sur que le package va installer le support MySQL)&lt;br /&gt;
* Soit à partir des sources.&lt;br /&gt;
&lt;br /&gt;
=== Sous Debian (apt) ===&lt;br /&gt;
&lt;br /&gt;
Il suffit de taper en tant que &#039;&#039;&#039;root&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;#apt-get install proftpd-mysql&amp;lt;/nowiki&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A partir des sources ===&lt;br /&gt;
&lt;br /&gt;
Téléchargez les sources en allant sur le [http://www.proftpd.org site de proftpd] pour obtenir la version la plus récente.&lt;br /&gt;
&lt;br /&gt;
Décompressez-les et lancez la compilation :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;tar jxvf proftpd-&#039;&#039;version&#039;&#039;.tar.bz2&amp;lt;br /&amp;gt; cd proftpd-&#039;&#039;version&#039;&#039;&amp;lt;br /&amp;gt; ./configure\&amp;lt;br /&amp;gt; --with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql\&amp;lt;br /&amp;gt; --with-includes=/usr/include/mysql\&amp;lt;br /&amp;gt; --with-libraries=/usr/lib&amp;lt;br /&amp;gt; make&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et en tant que &#039;&#039;&#039;root&#039;&#039;&#039; : &amp;lt;code&amp;gt;make install&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
&lt;br /&gt;
Créer un groupe &#039;&#039;ftpgroup&#039;&#039; avec un GID de 5500 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=code&amp;gt;groupadd -g 5500 ftpgroup&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Explications :====&lt;br /&gt;
* &#039;&#039;&#039;groupadd&#039;&#039;&#039; : invoque la commande d&#039;ajout de groupe.&lt;br /&gt;
* &#039;&#039;&#039;-g 5500&#039;&#039;&#039; : défini le GID (numéro identifiant) du groupe.&lt;br /&gt;
* &#039;&#039;&#039;ftpgroup&#039;&#039;&#039; : défini le nom du group.&lt;br /&gt;
&lt;br /&gt;
Créer un utilisateur &#039;&#039;ftpuser&#039;&#039; avec un UID de 5500 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=code&amp;gt;useradd -u 5500 -s /bin/false -d /bin/null -c &amp;quot;proftpd user&amp;quot; -g ftpgroup ftpuser&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Explications :====&lt;br /&gt;
* &#039;&#039;&#039;useradd&#039;&#039;&#039; : invoque la commande d&#039;ajout d&#039;utilisateur.&lt;br /&gt;
* &#039;&#039;&#039;-u 5500&#039;&#039;&#039; : défini l&#039;UID (numéro identifiant) de l&#039;utilisateur.&lt;br /&gt;
* &#039;&#039;&#039;-s /bin/false&#039;&#039;&#039; : défini le shell utilisé pour cet utilisateur, en l&#039;occurence, aucun puisque la connection sur une console linux est désactivée pour cet utilisateur.&lt;br /&gt;
* &#039;&#039;&#039;-d /bin/null&#039;&#039;&#039; : défini le répertoire de l&#039;utilisateur, également inexistant.&lt;br /&gt;
* &#039;&#039;&#039;-c &amp;quot;proftp user&amp;quot;&#039;&#039;&#039; : commentaire.&lt;br /&gt;
* &#039;&#039;&#039;-g ftpgroup&#039;&#039;&#039; : ajoute l&#039;utilisateur &#039;&#039;ftpuser&#039;&#039; au group &#039;&#039;ftpgroup&#039;&#039; précédemment créé.&lt;br /&gt;
* &#039;&#039;&#039;ftpuser&#039;&#039;&#039; : défini le nom de l&#039;utilisateur.&lt;br /&gt;
&lt;br /&gt;
Le groupe et l&#039;utilisateur ainsi créés serviront de lien entre les utilisateurs créés dans la base MySQL et le système d&#039;authentification/droits du système.&lt;br /&gt;
&lt;br /&gt;
=== La base de données ===&lt;br /&gt;
&lt;br /&gt;
Entrez dans l&#039;interface de la base de données :&lt;br /&gt;
&lt;br /&gt;
* si vous n&#039;avez jamais modifié les utilisateurs de la base : &amp;lt;code&amp;gt;mysql -u root&amp;lt;/code&amp;gt;&lt;br /&gt;
* sinon (avec un utilisateur/pwd ayant le droit de modifier la base): &amp;lt;code&amp;gt;mysql -u &#039;&#039;utilisateur&#039;&#039; -p&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut tout d&#039;abord créer la base de données (ex : proftpd) et les tables qu&#039;elle contient.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt; CREATE DATABASE `proftpd`;&amp;lt;br /&amp;gt; USE proftpd;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; -- Table structure for table `ftpgroup`&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; CREATE TABLE `ftpgroup` (&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt; `groupname` varchar(16) NOT NULL default &#039;&#039;,&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt; `gid` smallint(6) NOT NULL default &#039;5500&#039;,&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt; `members` varchar(16) NOT NULL default &#039;&#039;,&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt; KEY `groupname` (`groupname`)&amp;lt;br /&amp;gt; ) TYPE=MyISAM COMMENT=&#039;Table des groupes ProFTPD&#039;;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; -- Table structure for table `ftpquotalimits`&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; CREATE TABLE `ftpquotalimits` (&amp;lt;br /&amp;gt; `name` varchar(30) default NULL,&amp;lt;br /&amp;gt; `quota_type` enum(&#039;user&#039;,&#039;group&#039;,&#039;class&#039;,&#039;all&#039;) NOT NULL default &#039;user&#039;,&amp;lt;br /&amp;gt; `par_session` enum(&#039;false&#039;,&#039;true&#039;) NOT NULL default &#039;false&#039;,&amp;lt;br /&amp;gt; `limit_type` enum(&#039;soft&#039;,&#039;hard&#039;) NOT NULL default &#039;soft&#039;,&amp;lt;br /&amp;gt; `bytes_up_limit` float NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `bytes_down_limit` float NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `bytes_transfer_limit` float NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `files_up_limit` int(10) unsigned NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `files_down_limit` int(10) unsigned NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `files_transfer_limit` int(10) unsigned NOT NULL default &#039;0&#039;&amp;lt;br /&amp;gt; ) TYPE=MyISAM COMMENT=&#039;Table des quotas ProFTPD&#039;;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; -- Table structure for table `ftpquotatotal`&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; CREATE TABLE `ftpquotatotal` (&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt; `name` varchar(30) NOT NULL default &#039;&#039;,&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt; `quota_type` enum(&#039;user&#039;,&#039;group&#039;,&#039;class&#039;,&#039;all&#039;) NOT NULL default &#039;user&#039;,&amp;lt;br /&amp;gt; `bytes_up_total` float NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `bytes_down_total` float NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `bytes_transfer_total` float NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `files_up_total` int(10) unsigned NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `files_down_total` int(10) unsigned NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `files_transfer_total` int(10) unsigned NOT NULL default &#039;0&#039;&amp;lt;br /&amp;gt; ) TYPE=MyISAM COMMENT=&#039;Table des compteurs des quotas ProFTPD&#039;;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; -- Table structure for table `ftpuser`&amp;lt;br /&amp;gt; -- &amp;lt;br /&amp;gt; CREATE TABLE `ftpuser` (&amp;lt;br /&amp;gt; `id` int(10) unsigned NOT NULL auto_increment,&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt; `userid` varchar(32) NOT NULL default &#039;&#039;,&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt; `passwd` varchar(32) NOT NULL default &#039;&#039;,&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt; `uid` smallint(6) NOT NULL default &#039;5500&#039;,&amp;lt;br /&amp;gt; `gid` smallint(6) NOT NULL default &#039;5500&#039;,&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt; `homedir` varchar(255) NOT NULL default &#039;&#039;,&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt; `shell` varchar(16) NOT NULL default &#039;/bin/false&#039;,&amp;lt;br /&amp;gt; `count` int(11) NOT NULL default &#039;0&#039;,&amp;lt;br /&amp;gt; `accessed` datetime NOT NULL default &#039;0000-00-00 00:00:00&#039;,&amp;lt;br /&amp;gt; `modified` datetime NOT NULL default &#039;0000-00-00 00:00:00&#039;,&amp;lt;br /&amp;gt; `LoginAllowed` enum(&#039;true&#039;,&#039;false&#039;) NOT NULL default &#039;true&#039;,&amp;lt;br /&amp;gt; PRIMARY KEY (`id`)&amp;lt;br /&amp;gt; ) TYPE=MyISAM COMMENT=&#039;Table des utlisateurs ProFTPD&#039;; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite il faut créer un nouvel utilisateur (ex : proftpd) avec un mot de passe (ex : password) qui a seulement les droits de lire les données de la base proftpd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;GRANT USAGE ON proftpd.* TO &#039;&#039;&#039;proftpd&#039;&#039;&#039;@&#039;localhost&#039;&amp;lt;br /&amp;gt; IDENTIFIED BY &#039;&#039;&#039;&#039;password&#039;&#039;&#039;&#039; WITH GRANT OPTION;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;alert&amp;quot;&amp;gt;Attention : Si votre serveur MySQL n&#039;est pas sur la même machine que ProFTPD remplacez localhost par le nom de la machine (du serveur MySQL) ou par *&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuration de ProFTPD ===&lt;br /&gt;
&lt;br /&gt;
Editez le fichier &amp;lt;code&amp;gt;/etc/proftpd.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
ou &amp;lt;code&amp;gt;/usr/local/etc/proftpd.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;# Configuration de base&amp;lt;br /&amp;gt; # =====================&amp;lt;br /&amp;gt; ServerName &amp;quot;Mon serveur FTP&amp;quot;&amp;lt;br /&amp;gt; ServerType standalone&amp;lt;br /&amp;gt; ServerIdent on &amp;quot;Bienvenue sur mon ftp. Veuillez-vous identifiez&amp;quot;&amp;lt;br /&amp;gt; DeferWelcome on&amp;lt;br /&amp;gt; ServerAdmin &amp;quot;ftp_admin@mydomain.com&amp;quot;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; MultilineRFC2228 on&amp;lt;br /&amp;gt; DefaultServer on&amp;lt;br /&amp;gt; ShowSymlinks on&amp;lt;br /&amp;gt; AllowOverwrite on&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; TimeoutNoTransfer 600&amp;lt;br /&amp;gt; TimeoutStalled 600&amp;lt;br /&amp;gt; TimeoutIdle 1200&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; ListOptions &amp;quot;-l&amp;quot;&amp;lt;br /&amp;gt; Defaultroot ~&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; DenyFilter \*.*/&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; Port 21&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # A configurer selon sa connection&amp;lt;br /&amp;gt; # ================================&amp;lt;br /&amp;gt; MaxInstances 6&amp;lt;br /&amp;gt; MaxLoginAttempts 3&amp;lt;br /&amp;gt; MaxClientsPerUser 10&amp;lt;br /&amp;gt; MaxClientsPerHost 2&amp;lt;br /&amp;gt; MaxHostsPerUser 4&amp;lt;br /&amp;gt; MaxClients 6 &amp;quot;Limite a 6 utilisateurs&amp;quot;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # ProFTPD est exécuté avec des droits réduits&amp;lt;br /&amp;gt; # ============================================&amp;lt;br /&amp;gt; User nobody&amp;lt;br /&amp;gt; Group nogroup&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; Umask 022&amp;lt;br /&amp;gt; AllowStoreRestart on&amp;lt;br /&amp;gt; AllowRetrieveRestart on&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Mod MySQL&amp;lt;br /&amp;gt; # =========&amp;lt;br /&amp;gt; # Les mots de passe sont cryptés dans la base avec la fct ENCRYPT (MySQL)&amp;lt;br /&amp;gt; SQLAuthTypes Plaintext Crypt&amp;lt;br /&amp;gt; SQLAuthenticate users* groups*&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Modifiez cette ligne selon l&#039;utilisateur et le mot de passe définit plus tôt&amp;lt;br /&amp;gt; SQLConnectInfo &#039;&#039;proftpd@localhost proftpd password&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # On donne à ProFTPD le nom des colonnes de la table usertable&amp;lt;br /&amp;gt; SQLUserInfo ftpuser userid passwd uid gid homedir shell&amp;lt;br /&amp;gt; SQLUserWhereClause &amp;quot;LoginAllowed = &#039;true&#039;&amp;quot;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # On donne à ProFTPD le nom des colonnes de la table &amp;quot;grouptable&amp;quot;&amp;lt;br /&amp;gt; SQLGroupInfo ftpgroup groupname gid members&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Créer le repertoire home de l&#039;utilisateur si il n&#039;existe pas&amp;lt;br /&amp;gt; SQLHomedirOnDemand on&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Met à jour les compteurs à chaque connection d&#039;un utilisateur&amp;lt;br /&amp;gt; SQLLog PASS updatecount&amp;lt;br /&amp;gt; SQLNamedQuery updatecount UPDATE &amp;quot;count=count+1, accessed=now() WHERE userid=&#039;%u&#039;&amp;quot; ftpuser&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; #Met à jour les compteurs à chaque upload ou download d&#039;un utilisateur&amp;lt;br /&amp;gt; SQLLog STOR,DELE modified&amp;lt;br /&amp;gt; SQLNamedQuery modified UPDATE &amp;quot;modified=now() WHERE userid=&#039;%u&#039;&amp;quot; ftpuser&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Mod quota&amp;lt;br /&amp;gt; # =========&amp;lt;br /&amp;gt; QuotaEngine on&amp;lt;br /&amp;gt; QuotaDirectoryTally on&amp;lt;br /&amp;gt; QuotaDisplayUnits Mb&amp;lt;br /&amp;gt; QuotaShowQuotas on&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Définit les requêtes SQL pour que ProFTPd recupere les infos sur les quotas&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; SQLNamedQuery get-quota-limit SELECT &amp;quot;name, quota_type, par_session, limit_type, bytes_up_limit, bytes_down_limit, bytes_transfer_limit, files_up_limit, files_down_limit, files_transfer_limit FROM ftpquotalimits WHERE name = &#039;%{0}&#039; AND quota_type = &#039;%{1}&#039;&amp;quot;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; SQLNamedQuery get-quota-tally SELECT &amp;quot;name, quota_type, bytes_up_total, bytes_down_total, bytes_transfer_total, files_up_total, files_down_total, files_transfer_total FROM ftpquotatotal WHERE name = &#039;%{0}&#039; AND quota_type = &#039;%{1}&#039;&amp;quot;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; SQLNamedQuery update-quota-tally UPDATE &amp;quot;bytes_up_total = bytes_up_total + %{0}, bytes_down_total = bytes_down_total + %{1}, bytes_transfer_total = bytes_transfer_total + %{2}, files_up_total = files_up_total + %{3}, files_down_total = files_down_total + %{4}, files_transfer_total = files_transfer_total + %{5} WHERE name = &#039;%{6}&#039; AND quota_type = &#039;%{7}&#039;&amp;quot; ftpquotatotal&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; SQLNamedQuery insert-quota-tally INSERT &amp;quot;%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}&amp;quot; ftpquotatotal&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; QuotaLimitTable sql:/get-quota-limit&amp;lt;br /&amp;gt; QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; RootLogin off&amp;lt;br /&amp;gt; RequireValidShell off&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Gestion des logs&amp;lt;br /&amp;gt; # ================&amp;lt;br /&amp;gt; # Enregistre les requêtes SQL dans /var/log/proftpd/mysql.log&amp;lt;br /&amp;gt; SQLLogFile /var/log/proftpd/mysql.log&amp;lt;br /&amp;gt; # Enregistre les authentifications&amp;lt;br /&amp;gt; LogFormat auth &amp;quot;%v [%P] %h %t \&amp;quot;%r\&amp;quot; %s&amp;quot;&amp;lt;br /&amp;gt; ExtendedLog /var/log/proftpd/auth.log AUTH auth&amp;lt;br /&amp;gt; # Enregistre les accès aux fichiers&amp;lt;br /&amp;gt; LogFormat write &amp;quot;%h %l %u %t \&amp;quot;%r\&amp;quot; %s %b&amp;quot;&amp;lt;br /&amp;gt; ExtendedLog /var/log/proftpd/access.log WRITE,READ write&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; # Recupère le nom à partir de l&#039;ip de la machine de l&#039;utilisateur ( resolution DNS )&amp;lt;br /&amp;gt; IdentLookups on&amp;lt;br /&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin que les logs puissent être enregistrés et consultés, il faut créer au besoin le dossier /var/log/proftpd&lt;br /&gt;
&lt;br /&gt;
=== Démarrage de proftpd ===&lt;br /&gt;
&lt;br /&gt;
Il faut désormais créer le script qui va lancer proftpd. Copiez ces lignes dans /etc/init.d/proftpd (sur une Debian par exemple)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;!/bin/sh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Start the proftpd FTP daemon.&lt;br /&gt;
&lt;br /&gt;
PATH=/bin:/usr/bin:/sbin:/usr/sbin&amp;lt;br /&amp;gt;&lt;br /&gt;
DAEMON=/usr/sbin/proftpd&amp;lt;br /&amp;gt;&lt;br /&gt;
NAME=proftpd&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Defaults&amp;lt;br /&amp;gt;&lt;br /&gt;
RUN=&amp;amp;quot;no&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
OPTIONS=&amp;amp;quot;&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PIDFILE=`grep -i &#039;pidfile&#039; /etc/proftpd.conf | sed -e &#039;s/pidfile[\t ]\+//i&#039;`&amp;lt;br /&amp;gt;&lt;br /&gt;
if [ &amp;amp;quot;x$PIDFILE&amp;amp;quot; = &amp;amp;quot;x&amp;amp;quot; ];&amp;lt;br /&amp;gt;&lt;br /&gt;
then&amp;lt;br /&amp;gt;&lt;br /&gt;
PIDFILE=/var/run/proftpd.pid&amp;lt;br /&amp;gt;&lt;br /&gt;
fi&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Read config (will override defaults)&amp;lt;br /&amp;gt;&lt;br /&gt;
[ -r /etc/default/proftpd ] &amp;amp;amp;&amp;amp;amp; . /etc/default/proftpd&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
trap &amp;amp;quot;&amp;amp;quot; 1 &amp;lt;br /&amp;gt;&lt;br /&gt;
trap &amp;amp;quot;&amp;amp;quot; 15 &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test -f $DAEMON || exit 0 &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Servertype could be inetd|standalone|none. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; In all cases check against inetd and xinetd support. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
if ! egrep -qi &amp;amp;quot;^&amp;lt;nowiki&amp;gt;[[:space:]] &amp;lt;/nowiki&amp;gt;*ServerType.*standalone&amp;amp;quot; /etc/proftpd.conf &amp;lt;br /&amp;gt;&lt;br /&gt;
then &amp;lt;br /&amp;gt;&lt;br /&gt;
  if [ $(dpkg-divert --list xinetd|wc -l) -eq 1 ]  &lt;br /&gt;
  then &lt;br /&gt;
  if egrep -qi &amp;amp;quot;server&amp;lt;nowiki&amp;gt;[[:space:]]&amp;lt;/nowiki&amp;gt;*=&amp;lt;nowiki&amp;gt; [[:space:]]&amp;lt;/nowiki&amp;gt;*/usr/sbin/proftpd&amp;amp;quot; /etc/xinetd.conf -o \ &lt;br /&gt;
  egrep -qi &amp;amp;quot;server&amp;lt;nowiki&amp;gt;[[:space:]]&amp;lt;/nowiki&amp;gt;*=&amp;lt;nowiki&amp;gt;[[:space:]] &amp;lt;/nowiki&amp;gt;*/usr/sbin/proftpd&amp;amp;quot; /etc/xinetd.d/* 2&amp;amp;gt;/dev/null &lt;br /&gt;
  then &lt;br /&gt;
  RUN=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  INETD=&amp;amp;quot;yes&amp;amp;quot; &lt;br /&gt;
  else &lt;br /&gt;
  if ! egrep -qi &amp;amp;quot;^&amp;lt;nowiki&amp;gt;[[:space:]]&amp;lt;/nowiki&amp;gt;*ServerType.*inetd&amp;amp;quot; /etc/proftpd.conf &lt;br /&gt;
  then &lt;br /&gt;
  RUN=&amp;amp;quot;yes&amp;amp;quot; &lt;br /&gt;
  INETD=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  else &lt;br /&gt;
  RUN=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  INETD=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  fi &lt;br /&gt;
  fi &lt;br /&gt;
  else &lt;br /&gt;
  if egrep -qi &amp;amp;quot;^ftp.*/usr/sbin/proftpd&amp;amp;quot; /etc/inetd.conf 2&amp;amp;gt;/dev/null &lt;br /&gt;
  then &lt;br /&gt;
  RUN=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  INETD=&amp;amp;quot;yes&amp;amp;quot; &lt;br /&gt;
  else &lt;br /&gt;
  if ! egrep -qi &amp;amp;quot;^&amp;lt;nowiki&amp;gt;[[:space:]]&amp;lt;/nowiki&amp;gt;*ServerType.*inetd&amp;amp;quot; /etc/proftpd.conf &lt;br /&gt;
  then &lt;br /&gt;
  RUN=&amp;amp;quot;yes&amp;amp;quot; &lt;br /&gt;
  INETD=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  else &lt;br /&gt;
  RUN=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  INETD=&amp;amp;quot;no&amp;amp;quot; &lt;br /&gt;
  fi &lt;br /&gt;
  fi &lt;br /&gt;
  fi &lt;br /&gt;
  fi &lt;br /&gt;
&lt;br /&gt;
start()&lt;br /&gt;
{&lt;br /&gt;
    if start-stop-daemon --start --quiet --pidfile &amp;quot;$PIDFILE&amp;quot; \&lt;br /&gt;
        --exec $DAEMON -- $OPTIONS ; then&lt;br /&gt;
        echo &amp;quot;$NAME.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
signal()&lt;br /&gt;
  {&lt;br /&gt;
  if [ &amp;amp;quot;$1&amp;amp;quot; = &amp;amp;quot;stop&amp;amp;quot; ]; then&lt;br /&gt;
  SIGNAL=&amp;amp;quot;TERM&amp;amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
  if [ &amp;amp;quot;$1&amp;amp;quot; = &amp;amp;quot;reload&amp;amp;quot; ]; then&lt;br /&gt;
  SIGNAL=&amp;amp;quot;HUP&amp;amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
  echo &amp;amp;quot;ERR: wrong parameter given to signal()&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  fi&lt;br /&gt;
  if start-stop-daemon --stop --signal $SIGNAL --quiet --pidfile &amp;amp;quot;$PIDFILE&amp;amp;quot;; then&lt;br /&gt;
  echo &amp;amp;quot;$NAME.&amp;amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
  SIGNAL=&amp;amp;quot;KILL&amp;amp;quot;&lt;br /&gt;
  if start-stop-daemon --stop --signal $SIGNAL --quiet --pidfile &amp;amp;quot;$PIDFILE&amp;amp;quot;; then&lt;br /&gt;
  echo &amp;amp;quot;$NAME.&amp;amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
  echo &amp;amp;quot;.&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  fi&lt;br /&gt;
  if [ &amp;amp;quot;$SIGNAL&amp;amp;quot; = &amp;amp;quot;KILL&amp;amp;quot; ]; then&lt;br /&gt;
  rm -f &amp;amp;quot;$PIDFILE&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case &amp;amp;quot;$1&amp;amp;quot; in&lt;br /&gt;
start)&lt;br /&gt;
  if [ &amp;amp;quot;x$RUN&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo -n &amp;amp;quot;Starting ProFTPD ftp daemon: &amp;amp;quot;&lt;br /&gt;
  start&lt;br /&gt;
  else&lt;br /&gt;
  if [ &amp;amp;quot;x$INETD&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo &amp;amp;quot;ProFTPd is started from inetd/xinetd.&amp;amp;quot;&lt;br /&gt;
  else &lt;br /&gt;
  echo &amp;amp;quot;ProFTPd warning: cannot start neither in standalone nor in inetd/xinetd mode. Check your configuration.&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  fi&lt;br /&gt;
  ;;&lt;br /&gt;
&lt;br /&gt;
force-start)&lt;br /&gt;
  if [ &amp;amp;quot;x$INETD&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo &amp;amp;quot;Warning: ProFTPd is started from inetd/xinetd (trying to start anyway).&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  echo -n &amp;amp;quot;Starting ProFTPD ftp daemon: &amp;amp;quot;&lt;br /&gt;
  start&lt;br /&gt;
  ;; &lt;br /&gt;
  &lt;br /&gt;
stop)&lt;br /&gt;
  if [ &amp;amp;quot;x$RUN&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo -n &amp;amp;quot;Stopping ProFTPD ftp daemon: &amp;amp;quot;&lt;br /&gt;
  signal stop&lt;br /&gt;
  else&lt;br /&gt;
  if [ &amp;amp;quot;x$INETD&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo &amp;amp;quot;ProFTPd is started from inetd/xinetd.&amp;amp;quot;&lt;br /&gt;
  else &lt;br /&gt;
  echo &amp;amp;quot;ProFTPd warning: cannot start neither in standalone nor in inetd/xinetd mode. Check your configuration.&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  fi&lt;br /&gt;
  ;;&lt;br /&gt;
&lt;br /&gt;
force-stop)&lt;br /&gt;
  if [ &amp;amp;quot;x$INETD&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo &amp;amp;quot;Warning: ProFTPd is started from inetd/xinetd (trying to kill anyway).&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  echo -n &amp;amp;quot;Stopping ProFTPD ftp daemon: &amp;amp;quot;&lt;br /&gt;
  signal stop&lt;br /&gt;
  ;;&lt;br /&gt;
&lt;br /&gt;
reload)&lt;br /&gt;
  echo -n &amp;amp;quot;Reloading $NAME configuration...&amp;amp;quot;&lt;br /&gt;
  signal reload&lt;br /&gt;
  echo &amp;amp;quot; done.&amp;amp;quot;&lt;br /&gt;
  ;;&lt;br /&gt;
&lt;br /&gt;
force-reload|restart)&lt;br /&gt;
  if [ &amp;amp;quot;x$RUN&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo -n &amp;amp;quot;Restarting ProFTPD ftp daemon.&amp;amp;quot;&lt;br /&gt;
  signal stop&lt;br /&gt;
  echo -n &amp;amp;quot;.&amp;amp;quot;&lt;br /&gt;
  sleep 2&lt;br /&gt;
  echo -n &amp;amp;quot;.&amp;amp;quot;&lt;br /&gt;
  start&lt;br /&gt;
  echo &amp;amp;quot; done.&amp;amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
  if [ &amp;amp;quot;x$INETD&amp;amp;quot; = &amp;amp;quot;xyes&amp;amp;quot; ] ; then&lt;br /&gt;
  echo &amp;amp;quot;ProFTPd is started from inetd.&amp;amp;quot;&lt;br /&gt;
  else &lt;br /&gt;
  echo &amp;amp;quot;ProFTPd warning: cannot start neither in standalone nor in inetd/xinetd mode. Check your configuration.&amp;amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  fi&lt;br /&gt;
  ;;&lt;br /&gt;
 *)&lt;br /&gt;
  echo &amp;amp;quot;Usage: /etc/init.d/$NAME {start|force-start|stop|force-stop|reload|restart|force-reload}&amp;amp;quot;&lt;br /&gt;
  exit 1&lt;br /&gt;
  ;;&lt;br /&gt;
  esac&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant vous pouvez redémarrer le serveur ProFTPd pour appliquer la configuration :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;/etc/init.d/proftpd restart&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Utilisation ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que la configuration est faite, nous allons voir comment gérer les utilisateurs à travers la base de données.&lt;br /&gt;
&lt;br /&gt;
Je vous conseille d&#039;utiliser PHPMyAdmin pour ceux qui ne connaissent pas le langage SQL.&lt;br /&gt;
&lt;br /&gt;
=== Gestion des utilisateurs ===&lt;br /&gt;
&lt;br /&gt;
==== Ajout d&#039;un utilisateur ====&lt;br /&gt;
&lt;br /&gt;
Création de l&#039;utilisateur &#039;test&#039; avec un mot de passe &#039;pwd&#039;. Cet utilisateur a accès au repertoire &#039;/home/ftp/test&#039; avec les droits de l&#039;utilisateur (UID) 5500, et de groupe (GID) 5500, sans shell (&#039;/bin/false&#039;).&lt;br /&gt;
&lt;br /&gt;
La valeur &#039;LoginAllowed&#039; est mise à &#039;true&#039; pour autoriser la connection de cet utilisateur, à &#039;false&#039; pour l&#039;interdire.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;INSERT INTO `ftpuser` ( `id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed` , `modified`, `LoginAllowed` ) VALUES (&#039;&#039;, &#039;test&#039;, ENCRYPT(&#039;pwd&#039;), &#039;5500&#039;, &#039;5500&#039;, &#039;/home/ftp/test&#039;, &#039;/bin/false&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;true&#039; ); &amp;lt;/nowiki&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;count&#039; représente le nombre d&#039;authentifications effectuées par cet utilisateur,&amp;lt;br /&amp;gt; &#039;accessed&#039; la date du dernier accès et&amp;lt;br /&amp;gt; &#039;modified&#039; la date de la dernière écriture.&lt;br /&gt;
&lt;br /&gt;
==== Suppression d&#039;un utilisateur ====&lt;br /&gt;
&lt;br /&gt;
Suppression de l&#039;utilisateur &#039;test&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;DELETE FROM `ftpuser` WHERE `userid`=&#039;test&#039;;&amp;lt;br /&amp;gt; DELETE FROM `ftpgroup` WHERE `members`=&#039;test&#039;;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion des groupes ===&lt;br /&gt;
&lt;br /&gt;
==== Affecter un utilisateur à un groupe ====&lt;br /&gt;
&lt;br /&gt;
Affecte l&#039;utilisateur &#039;test&#039; au groupe &#039;group_test&#039; avec les droits de groupe (GID) du groupe 5500&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;INSERT INTO `ftpgroup` ( `groupname` , `gid` , `members` ) VALUES (&#039;group_test&#039;, &#039;5500&#039;, &#039;test&#039;);&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Enlever un utilisateur d&#039;un groupe ====&lt;br /&gt;
&lt;br /&gt;
Enlève l&#039;utilisateur &#039;test&#039; du groupe &#039;group_test&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;DELETE FROM `ftpgroup` WHERE `members`=&#039;test&#039;;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion des quotas ===&lt;br /&gt;
&lt;br /&gt;
La table &#039;ftpquotalimits&#039; contient la description des quotas.&amp;lt;br /&amp;gt; La table &#039;ftpquotatotal&#039; contient les statistiques d&#039;utilisation correspondant aux règles des quotas défini dans la table &#039;ftpquotalimits&#039;. Cette table permet à ProFTPd de gérer les quotas.&lt;br /&gt;
&lt;br /&gt;
==== Ajouter une règles de quotas ====&lt;br /&gt;
&lt;br /&gt;
Exécuter la requête suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;INSERT INTO `ftpquotalimits` ( `name`, `quota_type`, `par_session`, `limit_type`, `bytes_up_limit`, `bytes_down_limit`, `bytes_transfer_limit`, `files_up_limit`, `files_down_limit`, `files_transfer_limit` )&amp;lt;br /&amp;gt; VALUES ( &#039;NOM&#039; , &#039;TYPE&#039;, &#039;SESSION&#039;, &#039;LIMIT_TYPE&#039;, &#039;B_UP&#039;, &#039;B_DOWN&#039;, &#039;B_TRANS&#039;, &#039;F_UP&#039;, &#039;F_DOWN&#039;, &#039;F_TRANS&#039;);&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
où&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039; : nom de l&#039;utilisateur, du groupe ou de la règle selon la valeur de &#039;&#039;&#039;quota_type&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;quota_type&#039;&#039;&#039; : &#039;user&#039; si le quota s&#039;applique à un utilisateur, &#039;group&#039; à un groupe, &#039;class&#039; à une classe (ici inutile), &#039;all&#039; à tous les utilisateurs.&lt;br /&gt;
* &#039;&#039;&#039;par_session&#039;&#039;&#039; : &#039;true&#039; si les quotas doivent être remis à zéro à chaque nouvelle session, &#039;false&#039; sinon. (&#039;false&#039; est conseillé).&lt;br /&gt;
* &#039;&#039;&#039;limit_type&#039;&#039;&#039; : &#039;soft&#039; pour une mesure logicielle de la taille, &#039;hard&#039; pour une mesure hardware.&lt;br /&gt;
* &#039;&#039;&#039;bytes_up_limit&#039;&#039;&#039; : taille (en Mbytes) autorisé à être uploadé sur le serveur.&lt;br /&gt;
* &#039;&#039;&#039;bytes_down_limit&#039;&#039;&#039; : taille (en Mbytes) autorisé à être downloadé à partir du serveur.&lt;br /&gt;
* &#039;&#039;&#039;bytes_transfer_limit&#039;&#039;&#039; : taille (en Mbytes) autorisé à transféré à sur et à partir du serveur (upload+download).&lt;br /&gt;
* &#039;&#039;&#039;files_up_limit&#039;&#039;&#039; : nombre de fichiers autorisé à être uploadé sur le serveur.&lt;br /&gt;
* &#039;&#039;&#039;files_down_limit&#039;&#039;&#039; : nombre de fichiers autorisé à être downloadé à partir du serveur.&lt;br /&gt;
* &#039;&#039;&#039;files_transfer_limit&#039;&#039;&#039; : nombre de fichiers autorisé à transféré sur et à partir du serveur (upload+download).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Pour définir un quota illimité à l&#039;un des champs, mettez une valeur négative ou nulle.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert&amp;quot;&amp;gt;Attention : Les quotas de type &#039;all&#039;, &#039;class&#039; ou &#039;group&#039; ne définissent pas un quota pour chaque utilisateur mais un quota partagé par tous les utlisateurs concernés par cette règle.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Réinitialiser les quotas ====&lt;br /&gt;
&lt;br /&gt;
Il suffit de supprimer l&#039;entrée (ligne) correspondant à la règle devant être réinitialisé. Par exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;DELETE FROM `ftpquotatotal` WHERE `name`=&#039;test&#039; AND `quota_type`=&#039;user&#039;;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous voulez réinitialiser tous les quotas, par exemple tous les mois, faîtes une tâche cron se connectant sur le serveur et exécutant la requête suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;TRUNCATE TABLE `ftpquotatotal`;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Et voilà, c&#039;est terminé... Vous n&#039;avez plus qu&#039;à tester ;-)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;merci&amp;quot;&amp;gt;Cette page est issue de la documentation &#039;pré-wiki&#039; de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par space2d le 24/04/2005.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Copyright =&lt;br /&gt;
Copyright &amp;amp;copy; 24/04/2005, space2d&lt;br /&gt;
{{CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Zhortein</name></author>
	</entry>
</feed>