Maintenant que Dovecot
est configuré, notamment avec dovecot-lmtp , on va installer un plugin pour gérer les “Quotas”.
On verra aussi comment ajuster les Quota selon les utilisateurs.
~~READMORE~~
Il faut mettre en place la livraison via “Dovecot-LDA
” ou “Dovecot-LMTP
”, parce que le calcul d'un Quota ce fait aussi au moment de la livraison des e-mails.
Postfix → Dovecot-LMTP → plugin-Quota → Livraison dans la “Maildir”. |
Dans local.conf
:
mail_plugins = $mail_plugins quota plugin { quota = maildir:User Quota quota_rule = *:storage=1G quota_rule2 = Drafts:storage=+10%% quota_rule3 = Trash:storage=+10%% quota_rule4 = Junk:storage=+10%% quota_rule5 = Archive:storage=+25%% quota_rule6 = Sent:storage=+25%% quota_exceeded_message = Quota exceeded. }
Et dans les sections protocol imap
et protocol imaps
, ajouter aussi:
mail_plugins = $mail_plugins imap_quota
… qui est un autre plugin adapté pour le protocole IMAP
.
Donc, on a:
Voir plus loin pour avoir des messages d'avertissements.
Quand on test le “plein”, on a en retour:
<userXXX@mail.local.eez.fr> (expanded from <userXXX@tjaouen.fr>): host mail.eez.fr[private/dovecot-lmtp] said: 552 5.2.2 <userXXX@mail.local.eez.fr> Quota exceeded. (in reply to end of DATA command)
C'est violent… non ?
Pour que les quotas soient different selon les utilisateurs, il faut utiliser les “extra fields”.
Or, les “extra fields” sont un concept inconnu du fichier /etc/passwd
qui vient avec l'authentification PAM
.
Par défaut, on a simplement, actuellement (dans conf.d/auth-system.conf.ext
) :
userdb { driver = passwd }
On va ajouter une autre base au format passwd-file
, déclaré avant , qui sera d'abord consultée avant la base passwd
.
Créer d'abord un fichier passwd-file
vide:
# touch /etc/dovecot/userdb-passwd-file
Ensuite on va désactiver le fichier conf.d/10-auth.conf
(qui charge conf.d/auth-system.conf.ext
) comme cela:
# mv conf.d/10-auth.conf{,-DISABLED}
Maintenant, on peut refaire la configuration a notre façon, en ajoutant dans local.conf
:
# --- passdb et userdb ---------------------------------------- # Voir fichier: conf.d/10-auth.conf-DISABLED auth_mechanisms = plain passdb { driver = pam } # ------------------------------------------------------- # D'abord le fichier au format "passwd-file" # si le compte n'existe pas, regarde dans "passwd" # ------------------------------------------------------- # first passwd-file userdb { driver = passwd-file args = username_format=%u /etc/dovecot/userdb-passwd-file } # fallback to PAM userdb { driver = passwd } # -------------------------------------------------------------
Le fichier passwd-file
est juste une copie des lignes des comptes mails du fichier /etc/passwd
, avec un champ supplémentaire à la fin, pour les “extra fields”.
Exemple de fichier passwd-file
:
# ---------------------------------- # userdb-passwd-file pour Dovecot # ---------------------------------- thierry:x:2000:100:,,,:/home/thierry:/bin/false:userdb_quota_rule=*:storage=10G pirate:x:2001:100:,,,:/home/pirate:/bin/false:userdb_quota_rule=*:storage=300M # ---------------------------------- # EOF
On voit l'ajout de “userdb_quota_rule=*:storage=10G
” .
Bien sur, c'est nécessaire uniquement pour les quelques utilisateurs qui ont besoin d'une configuration particulière.
Sauf pour le dernier champ “extra fields”: *tout* les autres champs doivent être identique a ce qu'il y a dans /etc/passwd |
On peut faire en sorte que les utilisateurs soient informés lorsque ils dépassent certains quotas.
Dans mon exemple, les avertissements a propos des quotas seront simplement ajoutés à un fichier texte.
Un autre scripte, réveillé par CRON , ira consulter ce fichier et enverra les mails (ou pas) d'informations au utilisateurs.
Dans local.conf
, on ajoute :
plugin { quota_warning = storage=100%% quota-warning %u "CRIT" "ATTENTION: Boite de messages pleine à 100%%" quota_warning2 = storage=95%% quota-warning %u "CRIT" "ATTENTION: Boite de messages remplie à plus de 95%%" quota_warning3 = storage=90%% quota-warning %u "WARN" "ATTENTION: Boite de messages remplie à plus de 90%%" quota_warning4 = storage=85%% quota-warning %u "WARN" "ATTENTION: Boite de messages remplie à plus de 85%%" quota_warning5 = storage=80%% quota-warning %u "WARN" "ATTENTION: Boite de messages remplie à plus de 80%%" quota_warning6 = -storage=100%% quota-warning %u "INFO" "Boite de messages en dessous du seuil de 100%%" quota_warning7 = -storage=90%% quota-warning %u "INFO" "Boite de messages en dessous du seuil de 90%%" quota_warning8 = -storage=80%% quota-warning %u "INFO" "Boite de messages en dessous du seuil de 80%%" }
service quota-warning { executable = script /usr/local/bin/dovecot-new-quota-warning.sh # use some unprivileged user for executing the quota warnings user = nobody group = staff unix_listener quota-warning { group = users mode = 0660 } }
unix_listener quota-warning
créé un pipe : il faut que les comptes mails (qui sont dans le groupe users
chez moi) aient le droits d'écrire dedans.
Le script /usr/local/bin/dovecot-new-quota-warning.sh
:
#!/bin/bash # dovecot-new-quota-warning.sh <USER> <LEVEL> <MESSAGE...> # USER=compte (not e-email) # LEVEL=CRIT|WARN|INFO # MESSAGE=... QUOTA_USER="${1}" QUOTA_LEVEL="${2}" shift 2 QUOTA_MESSAGE="$*" [ -n "${QUOTA_USER}" ] || exit 0 [ -n "${QUOTA_LEVEL}" ] || exit 0 [ -n "${QUOTA_MESSAGE}" ] || exit 0 WORK_DIR="/var/local/dovecot-quota-warning" FILE_DEST="msg.new" DATE_NOW=$( LANG=C date --utc ) [ -d "${WORK_DIR}" ] || mkdir -p "${WORK_DIR}" echo -e "${DATE_NOW}\t${QUOTA_USER}\t${QUOTA_LEVEL}\t${QUOTA_MESSAGE}" >> "${WORK_DIR}/${FILE_DEST}" exit 0 # -------------------------------- # EOF
Comme c'est nobody
, dans le group staff
qui va écrire dans /var/local/dovecot-quota-warning
, il faut bien s'assurer qu'il en a les droits:
chmod g+w /var/local/dovecot-quota-warning
Maintenant, le petit script /usr/local/bin/dovecot-parse-quota-warning.sh
qui va envoyer les mails d'avertissements:
#!/bin/bash LDA="/usr/lib/dovecot/dovecot-lda" [ -x "${LDA}" ] || exit 0 WORK_DIR="/var/local/dovecot-quota-warning" FILE_NEW="msg.new" FILE_CUR="msg.cur" [ -f "${WORK_DIR}/${FILE_NEW}" ] || exit 0 mv -f "${WORK_DIR}/${FILE_NEW}" "${WORK_DIR}/${FILE_CUR}" || exit 1 arg_split() { __DATE=$1 __USER=$2 __LEVEL=$3 shift 3 __MESSAGE="$*" } while read -r LINE do OLDIFS=$IFS IFS=$'\t' arg_split ${LINE} IFS=$OLDIFS # remove quotes __LEVEL="${__LEVEL%\"}" __LEVEL="${__LEVEL#\"}" __MESSAGE="${__MESSAGE%\"}" __MESSAGE="${__MESSAGE#\"}" NIVEAU=${__LEVEL} [ "${__LEVEL}" = "WARN" ] && NIVEAU="Avertissement" [ "${__LEVEL}" = "CRIT" ] && NIVEAU="Seuil CRITIQUE" [ "${__LEVEL}" = "INFO" ] && NIVEAU="Information" MAIL_FROM="postmaster@<MON_DOMAIN>" ; # <---- FIXME MAIL_SUBJECT="[Quota] ${NIVEAU}" cat << __EndOfData__ | "${LDA}" -d "${__USER}" -o "plugin/quota=maildir:User quota:noenforcing" From: ${MAIL_FROM} Subject: ${MAIL_SUBJECT} Date: $( LANG=C date ) Content-Type: text/plain; charset="utf-8" Bonjour, *** Ceci est un message automatique *** Votre attention est requise à propos de l'espace alloué pour le stockage de vos messages. Date: $( date --date="${__DATE}" ) Compte: ${__USER} Niveau d'alerte: ${NIVEAU} Message: " ${__MESSAGE} " Cordialement Le Robot sur le serveur de Eez.fr. -- S'il fallait tolérer aux autres tout ce qu'on se permet à soi-même, la vie ne serait plus tenable. Georges Courteline, La philosophie de Georges Courteline __EndOfData__ done < <( cat "${WORK_DIR}/${FILE_CUR}" ) # ------------ # EOF
… ce script va faire sont traitement toutes le 5 minutes… par exemple dans CRON:
*/5 * * * * /usr/local/bin/dovecot-parse-quota-warning.sh >/dev/null
Connaître le quota d'un utilisateur:
# doveadm quota get -u <USER>
Recalculer le quota:
# doveadm quota recalc -u <USER>