|

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 ™).

Similar Posts

  • bash history meme reloaded

    $ history|awk ‘{a[$2]++} END{for(i in a){printf “%5d\t%s\n”,a[i],i}}’|sort -rn|head 90 vi 50 cd 40 ls 34 python 33 sudo 21 ll 14 man 14 apt-cache 13 perl 12 mv No había notado que ahora estoy editando tanto, vim siempre ha sido mi editor favorito, pero la vez anterior estaba en tercer lugar, por lo demás parece…

  • Los mas usados

    $ echo $HISTCONTROLignoreboth,erasedups$ history|awk ‘{print $2}’|awk ‘BEGIN {FS=”|”} {print $1}’|sort|uniq -c|sort -rn|head -10 130 ls 53 cd 20 vi 14 btdownloadcurses 12 sudo 12 qemu-img 11 rm 11 mv 10 ps 10 konqueror Tengo compulsion por hacer listado (ls -lrt sobre todo), examino muchos directorios, y les hago ls mas de una vez a cada…

3 Comments

  1. 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

  2. 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

  3. 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.

Leave a Reply

Your email address will not be published. Required fields are marked *