Bajar la quota en un servidor de Correo que tiene Maildir


Hoy me vi en la penosa necesidad de limpiar cuentas en un servidor que es exclusivamente para correo, a prueba y error fuí perfeccionando un script que al final funciona tal como lo que necesito, podría ser perfeccionado, pero no le veo el sentido a hacerlo mas complicado.

El script es sencillo, pero hay detallitos que pueden ser muy relevantes, por ejemplo hay que ser cuidadosos con los nombres de directorios que tienen espacios (export IFS=$’\n’), por lo demás todo se limita a irte usuario por usuario corriendo este script, el script toma como primer argumento el nombre del usuario, y asume que todos los usuarios estan en /home/nombre.de.usuario, por lo que si no están ahá habráa que modificarlo para agarrar el $HOME verdadero, lo cual no deberia ser muy dificil.


#!/bin/bash
# $1 == usuario
if [ -d /home/$1/Maildir/ ] ; then cd /home/$1/Maildir/; else echo "no existe el directorio /home/$1/Maildir/"
; exit 1; fi
export IFS=$'\n'
for d in `find . -name cur -type d |sort -r`
do
cd "/home/$1/Maildir/$d/"
pwd
for i in `ls -rt`
do
#echo $i
quota=`repquota -a | grep $1 | awk '{print $3}'`
#echo -n "quota: $quota "
if [ $quota -gt 11000 ] ; then
#echo " -- Voy a borrar $i"
rm $i
else
echo "Terminamos, Quota final: $quota ($1)"
exit 0
fi
done
done

Hay una serie de “echo”s comentados, porque los use para debugear, pero dan mucho ruido, al final solo reporto la quita final para verificar que se hizo lo correcto.

Cabe notar que si no tienes el formato Maildir, simplemente esto no sirve de nada, si usas Mailbox tienes un archivo por carpeta, y hay que hacer todo un show para borrar los mensajes con herramientas especiales, es mucho mejor simplemente usar siempre Maildir :), asi puedes detectar mensajes masivos facilmente (ls -lrS), y es mucho mas facil depurar automaticamente (goodthing ™).


3 Comments, Comment or Ping

  1. CFuga

    Esta es una versión mejorada de tu script. ¿Qué cosas cambian?

    * Es muy complicada la lógica que utilizas para verificar la existencia de los directorios, y siempre ejecutas un costoso cd
    * Aplicas la medicina de forma selectiva por usuario, cuando lo puedes aplicar a TODOS los usuarios del servidor
    * Asumes que existe una sola cuota de disco por usuario

    En esta versión, ataco los dos primeros puntos. Lo de la cuota de disco queda de tarea.

    #!/bin/bash

    export IFS=$’\n’

    for j in `cut -f1,6 -d: /etc/passwd`; do
        user=`echo $j | cut -f1 -d:`
        dir=`echo $j | cut -f2 -d:`
            if [ -d “$dir/Maildir/” ]; then
                for d in `find “$dir” -name cur -type d | sort -r`; do
                    for i in `ls -rt “$d”`; do
                        #echo $i
                        quota=`repquota -a | grep $user | cut -f8 -d’ ‘`
                        #echo -n “quota: $quota “
                        if [ $quota -gt 11000 ]; then
                            #echo ” — Voy a borrar $i”
                            rm -f $i
                        else
                            echo “Terminamos, Quota final: $quota ($1)”
                            exit 0
                        fi
                    done
                done
            fi
    done

    January 17th, 2007

  2. garaged

    Es que para mi es mucho mas facil irme sobre aquellos usuarios que quiero atacar solamente, no sobre todos 🙂

    Por eso es que lo hago por usuario

    Y si te vas sobre TODOS los usuarios por lo menos hay que cuidar que los de sistema no entren en el script ! hasta el mas chido se le va una bala 🙂

    Y si, asumo que solo es una quota, pero pues es mas facil recordar moverla en el script a recordar que el script tiene 2 o mas parametros 🙂

    A poco el CD es costoso ?

    Gracias por los comentarios

    January 17th, 2007

  3. CFuga

    En cuanto a los usuarios del sistema, no hay tanto problema, por tres razones:

    * No siempre existe el directorio $HOME asociado, mucho menos $HOME/Maildir

    * En contadas ocasiones tienen correo electrónico. Así que con la parte que verifica la existencia del directorio Maildir, los evita.

    * En menos ocasiones tienen activada la cuota de disco. Así que la comparación que haces evita borrar archivos (0 < 11000) Por otra parte, cd no es costoso. 🙂 Recordé que es un ‘builtin’ del shell, así que tiene un tiempo de ejecución mínimo, equivalente al tiempo que tarda [ -d directorio ] Eso sí, mi versión sólo comprueba una vez la existencia del Maildir, en lugar de dos. 😉 Finalmente, los pobres usuarios del formato mbox pueden utilizar herramientas como grepmail (http://grepmail.sourceforge.net) para salvar el día.

    January 18th, 2007

Reply to “Bajar la quota en un servidor de Correo que tiene Maildir”