Ajout d'une règle sieve pour tous mes users

Je dispose d'un serveur mail avec cyrus, postfix, ldap et sieve

J'ai cherché un peu partout comment créer des règles pour chaque user, mais j'ai jamais trouvé la réponse sur internet

J'ai retrouvé de l'espoir grâce à la commande sieveshell mais j'ai jamais réussis à la mettre en oeuvre, buggé ?

sieveshell -u toto -a cyradm localhost

Cette commande permet (normalement) de travailler sur le user toto avec un compte admin cyrus (définis dans imapd.conf) mais j'ai eu beau essayer dans tous les sens, ça n'a jamais pris les données de toto, mais les données du compte /var/spoopl/sieve/global :-\

Si quelqu'un savais m'en dire plus… =)

Alors j'ai pris mon courage à deux mains et j'ai fait mon propre script :

Tout d'abord un peu de théorie.

Les scripts sieve sont stockés dans /var/spool/sieve/t/toto

Il peut y avoir plusieurs fichiers sieve dans le répertoire mais un seul sera actif !

On déterminera le fichier actif par un lien symbolique appelé defaultbc

Les scripts sont stockés en language “humain” avec l'extension .script ensuite compilé en .bc

Voici un simple exemple de fichier sieve.script

# Antispam
 
require ["vacation", "regex", "imapflags", "fileinto", "reject", "envelope", "subaddress"];
 
if anyof ( header :comparator "i;octet" :contains "Subject" "***SPAM***", header :comparator "i;octet" :contains "X-Spam-Level" "***" ) { 
    fileinto "INBOX/Junk";
}

Rien de bien complexe au niveau de la syntaxe, ici le script va déposer dans le dossier junk du user les mails dont le sujet contient *SPAM* ou dont le level spam sera de 3 étoiles.

Pour créer vos propores script, le module ingo du webmail horde fonctionne très bien =)

Ensuite il suffit de compiler se script via la commande

/usr/lib/cyrus/bin/sievec antispam.script antispam.bc

Sievec fait partie du paquet cyrus-common

Le script, va rechercher la liste des tous les users, ensuite reprend le script actif du user, ajoute mes règles, recompile le tout et écrase le fichier actif du user

Voici mon script

#!/bin/bash
#
# Ce script parcour la liste des utilisateurs ayant un mail
# test si le user a un dossier sieve (language de filtre pour mail)
# test si règle de spam mise
# si pas ajoute regle spam
# jf 28/08/2009 
 
#***********
# PARAMETERS
#***********
 
commonscript="antispam.script"
dossiersieve="/var/spool/sieve"
cmdsievec="/usr/lib/cyrus/bin/sievec"
filelog="result.log"
nameln="defaultbc"
 
mv ./$filelog ancien.log
 
#
#on sauvegarde les regles !
#
export LC_ALL=fr_FR.UTF-8
today=`date '+%d-%m-%Y'`
nomsave="save-rule-sieve-"$today".tgz"
tar cfz $nomsave $dossiersieve >/dev/null 2>&1
 
#obtiens tous les logins dans staff
ldapsearch -x -b ou=Users,ou=Empl,dc=domaine,dc=be -h ldap.mondomaine.be '' uid | grep ^uid: | sed 's/uid: //'  > user_list
(
# boucle pour chaque user dont l'uid est dans $f
cat user_list | while read f; do
 
echo "------------------------------------------"$f >> $filelog
 
#ici commence a construire le chemin vers son dossier sieve
# je recuper la premier lettre du login
initial=`echo $f | cut -c1`
rep=$dossiersieve"/"$initial"/"$f
 
# si rep existe
if [ -d $rep ]
then
    #j obtiens le nom du fichier qui contient ses regles sieve
    cheminscript=$rep"/"$nameln    
    nomscriptcompile=`readlink $cheminscript`
    # renomme l'extension du fichier
    nomscript=${nomscriptcompile%??}script
    fichier=$rep"/"$nomscript
 
    # test si ce fichier existe bien
    if [ -f $fichier ]
    then	
        #test si user dispose de ma regle antispam
	nbrule=`grep -oc 'Antispam-Jf' -a $fichier`
 
	if [ $nbrule -ge 1 ]
	then
	    echo 'Have already the anti-spam filter' >> $filelog
	else	    
	    cat $commonscript > new.script
	    #je retire le require du script, car j'en ai un dans mon script anti spam	
            sed -e 's/require/\#require/g' $fichier >> new.script	    
	    #cat $fichier >> new.script
	    /usr/lib/cyrus/bin/sievec new.script new.bc >> $filelog 	    
	    #>/dev/null 2>&1
	    if [ -f ./new.bc ]
	    then
		echo oki >> $filelog
		cp new.script $rep"/"$nomscript
		cp new.bc $rep"/"$nomscriptcompile
		rm ./new.bc
		rm ./new.script
	    else
		echo "compilation foireuse" >> $filelog
	    fi
	fi
    else    
	echo 'Pas de fichier sieve'$fichier >> $filelog
    fi
else
    echo 'Pas de dossier sieve' >> $filelog
fi
done
) 2>&1 | tee create_all_users.log
#antispam.script
# Antispam-Jf
 
require ["vacation", "regex", "imapflags", "fileinto", "reject", "envelope", "subaddress"];
 
if anyof ( header :comparator "i;octet" :contains "Subject" "***SPAM***", header :comparator "i;octet" :contains "X-Spam-Level" "***" ) { 
    fileinto "INBOX/Junk";
}
 
# Antivirus-Jf
if header :comparator "i;octet" :contains "Subject" "VIRUS-STOPPED"  { 
    fileinto "INBOX/Junk";
}

Discussion

Entrer votre commentaire
Si vous ne pouvez déchiffrer le code, téléchargez ce fichier .wav pour l'entendre.
 
 
linux/creer_un_regle_sieve_pour_tous_les_users.txt · Dernière modification: 2009/08/31 17:13 par admin
 
Sauf mention contraire, le contenu de ce wiki est placé sous la licence suivante:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki