[config_mail] Ajout du dossier pour déplacer les spams

This commit is contained in:
Pierre-Elliott Bécue 2013-03-10 19:22:16 +01:00
parent 21fc3e42d6
commit a2d0eaf5ea

View file

@ -30,10 +30,10 @@
""" """
Script permetant de gérer sa configuration mail Script permetant de gérer sa configuration mail
Usage : ConfigMail.py [--forward=(|<mail>)] [--spam=(accepte|marque|supprime)] Usage : ConfigMail.py [--forward=(|<mail>)] [--spam=(accepte|marque|deplace|supprime)]
Retourne : Retourne :
forward=(|<mail>) forward=(|<mail>)
spam=(accepte|marque|supprime) spam=(accepte|marque|deplace|supprime)
""" """
procmail_warning = """################################################################ procmail_warning = """################################################################
@ -46,6 +46,24 @@ procmail_warning = """##########################################################
""" """
# Pour éviter des crash
procmail_mark_old = """# Passage des mails dans spamassassin
:0 Whbf
* < 256000
| spamc
# Serveur blacklisté
:0
* ^X-Reject: 554
* !^X-Spam-Status: Yes
{
:0 Whf
* ^Subject:\/.*
| formail -i "Subject: *****SPAM***** $MATCH"
}
"""
procmail_mark = """# Passage des mails dans spamassassin procmail_mark = """# Passage des mails dans spamassassin
:0 Whbf :0 Whbf
* < 256000 * < 256000
@ -61,13 +79,37 @@ procmail_mark = """# Passage des mails dans spamassassin
| formail -i "Subject: *****SPAM***** $MATCH" | formail -i "Subject: *****SPAM***** $MATCH"
} }
:0
* ^X-Spam-Status: Yes
{
:0 Whf
* ^Subject:\/.*
| formail -i "Subject: *****SPAM***** $MATCH"
}
""" """
procmail_delete_spam = """# Suppression des spams procmail_delete_spam = """# Suppression des spams
:0 Whf :0 Whf
* ^Subject: *****SPAM***** * ^Subject: *****SPAM*****
/dev/null /dev/null
"""
procmail_move = """#Déplacement des spams
:0 Whbf
* < 256000
| spamc
# Serveur blacklisté
:0
* ^X-Reject: 554
* !^X-Spam-Status: Yes
.%(spamdir)s
# Mail de spam
:0
* ^X-Spam-Status: Yes
.%(spamdir)s
""" """
procmail_forward = """# Redirection des mails procmail_forward = """# Redirection des mails
@ -82,13 +124,20 @@ forward_procmail = '"|exec /usr/bin/procmail"\n'
from commands import getstatusoutput from commands import getstatusoutput
import os, sys, pwd, getopt import os
import sys
import pwd
import getopt
home = pwd.getpwuid(os.getuid())[5] home = pwd.getpwuid(os.getuid())[5]
import re import re
class MailConfigError(ReferenceError): class MailConfigError(ReferenceError):
pass pass
def Log(content):
with open('/tmp/intranet.log', 'a') as log:
log.writelines(content+"\n")
############################################################################ ############################################################################
## Fonctions utiles ## Fonctions utiles
@ -118,11 +167,11 @@ def _GetConfig():
raise MailConfigError, 'Fichier forward trop long' raise MailConfigError, 'Fichier forward trop long'
fic_forward = fic_forward[0] fic_forward = fic_forward[0]
except IOError: except IOError:
return {'forward':'', 'spam':'accepte'} return {'forward':'', 'spam':'accepte', 'spamdir':None}
# forward simple # forward simple
if _IsMail(fic_forward): if _IsMail(fic_forward):
return {'forward':fic_forward, 'spam':'accepte'} return {'forward':fic_forward, 'spam':'accepte', 'spamdir':None}
# utilisation de procmail # utilisation de procmail
if fic_forward != _Clean(forward_procmail)[0]: if fic_forward != _Clean(forward_procmail)[0]:
@ -140,27 +189,41 @@ def _GetConfig():
# forward simple dans le procmailrc # forward simple dans le procmailrc
if not fic_procmail: if not fic_procmail:
return {'forward':forward, 'spam':'accepte'} return {'forward':forward, 'spam':'accepte', 'spamdir':None}
# marquage des spams # marquage des spams
tmp = _Clean( procmail_mark ) tmp = _Clean( procmail_mark )
if fic_procmail[:len(tmp)] != tmp: tmp2 = _Clean( procmail_move )
tmp3 = _Clean( procmail_mark_old )
mark = False
move = False
if fic_procmail[:len(tmp)] != tmp and fic_procmail[:len(tmp)] != tmp3:
if len(fic_procmail) != len(tmp2):
raise MailConfigError, 'Fichier de procmail non compréhensible' raise MailConfigError, 'Fichier de procmail non compréhensible'
else:
spamdir = fic_procmail[-1][1:]
fic_procmail = fic_procmail[len(tmp2):]
move = True
else:
fic_procmail = fic_procmail[len(tmp):] fic_procmail = fic_procmail[len(tmp):]
spamdir = ""
mark = True
# suppression des spams ? # suppression des spams ?
if not fic_procmail: if (not fic_procmail) and mark:
return {'forward':forward, 'spam':'marque'} return {'forward':forward, 'spam':'marque', 'spamdir':None}
elif (not fic_procmail) and move:
return {'forward':forward, 'spam':'deplace', 'spamdir':spamdir}
elif fic_procmail == _Clean(procmail_delete_spam): elif fic_procmail == _Clean(procmail_delete_spam):
return {'forward':forward, 'spam':'supprime'} return {'forward':forward, 'spam':'supprime', 'spamdir':None}
else: else:
raise MailConfigError, 'Fichier de procmail non compréhensible' raise MailConfigError, 'Fichier de procmail non compréhensible'
def _SetConfig(forward = None, spam= None): def _SetConfig(forward = None, spam= None, spamdir=None):
""" Modifie la configuration de l'utilisateur courant """ """ Modifie la configuration de l'utilisateur courant """
# variable new_spam # variable new_spam
if spam in ['accepte','supprime','marque']: if spam in ['accepte', 'deplace', 'supprime','marque']:
new_spam = spam new_spam = spam
elif spam == None: elif spam == None:
new_spam = _GetConfig()['spam'] new_spam = _GetConfig()['spam']
@ -175,6 +238,14 @@ def _SetConfig(forward = None, spam= None):
else: else:
raise ValueError, 'Adresse mail invalide' raise ValueError, 'Adresse mail invalide'
if spamdir == None:
new_spamdir = _GetConfig()['spamdir']
elif re.match('^[a-zA-Z0-9_-]+$', spamdir):
new_spamdir = spamdir
else:
raise ValueError, 'Nom de dossier invalide'
# génération des fichiers # génération des fichiers
if new_spam=='accepte': if new_spam=='accepte':
# suppression du .procmailrc # suppression du .procmailrc
@ -189,16 +260,19 @@ def _SetConfig(forward = None, spam= None):
os.remove('%s/.forward'%home) os.remove('%s/.forward'%home)
else: else:
# écriture du .procmailc # écriture du .procmailc
if new_spam == 'marque':
txt = procmail_warning + procmail_mark txt = procmail_warning + procmail_mark
if new_spam=='supprime': if new_spam=='supprime':
txt += procmail_delete_spam txt = procmail_warning + procmail_mark + procmail_delete_spam
if new_spam == 'deplace':
txt = procmail_warning + procmail_move % ({'spamdir':new_spamdir})
if new_forward: if new_forward:
txt += procmail_forward % new_forward txt += procmail_forward % new_forward
open('%s/.procmailrc'%home,'w').write(txt) open('%s/.procmailrc'%home,'w').write(txt)
# écriture du .forward # écriture du .forward
open('%s/.forward'%home,'w').write(forward_procmail) open('%s/.forward'%home,'w').write(forward_procmail)
def _Sudo(uid, forward=None, spam=None): def _Sudo(uid, forward=None, spam=None, spamdir=None):
""" Execute le script pour un autre utilisateur """ """ Execute le script pour un autre utilisateur """
# construction de la ligne de commande # construction de la ligne de commande
if __file__[-4:]=='.pyc': if __file__[-4:]=='.pyc':
@ -210,6 +284,8 @@ def _Sudo(uid, forward=None, spam=None):
c += " --forward=%s" % forward c += " --forward=%s" % forward
if spam!=None: if spam!=None:
c += " --spam=%s" % spam c += " --spam=%s" % spam
if spamdir!=None:
c += " --spamdir=%s" %spamdir
# execution de la commande # execution de la commande
status, output = getstatusoutput(c) status, output = getstatusoutput(c)
@ -231,21 +307,22 @@ def _Sudo(uid, forward=None, spam=None):
## ##
############################################################################ ############################################################################
def MailConfig(uid=None, forward=None, spam=None): def MailConfig(uid=None, forward=None, spam=None, spamdir=None):
""" Modifie ou retourne la configuration mail de l'utilisateur """ Modifie ou retourne la configuration mail de l'utilisateur
user = utilisateur à configurer, si None configure l'utilisateur courant user = utilisateur à configurer, si None configure l'utilisateur courant
forward = adresse vers laquelle rediriger les mails, chaine vide si pas de redirection forward = adresse vers laquelle rediriger les mails, chaine vide si pas de redirection
spam = action à effectuer sur les spams (accepte, supprime, marque) spam = action à effectuer sur les spams (accepte, supprime, marque)
spamdir = dossier déplacer le spam.
Pour les champs forward et spam, la valeur None ne touche pas au champ. Pour les champs forward et spam, la valeur None ne touche pas au champ.
Retourne un dictionnaire { 'forward':'', 'spam':'' } Retourne un dictionnaire { 'forward':'', 'spam':'', 'spamdir:''}
""" """
## demande pour un autre utilisateur ## demande pour un autre utilisateur
if uid: if uid:
return _Sudo(uid=uid, forward=forward, spam=spam) return _Sudo(uid=uid, forward=forward, spam=spam, spamdir=spamdir)
## nettoyage des variables ## nettoyage des variables
cfg = _GetConfig() cfg = _GetConfig()
@ -253,10 +330,14 @@ def MailConfig(uid=None, forward=None, spam=None):
forward = None forward = None
if spam == cfg['spam']: if spam == cfg['spam']:
spam = None spam = None
if spamdir == cfg['spamdir']:
spamdir = None
if spamdir == "":
spamdir = None
## modifications ## modifications
if forward!=None or spam!=None: if forward != None or spam != None or spamdir != None:
_SetConfig(forward=forward, spam=spam) _SetConfig(forward=forward, spam=spam, spamdir=spamdir)
## on renvoie la configuration ## on renvoie la configuration
return _GetConfig() return _GetConfig()
@ -265,15 +346,26 @@ if __name__=="__main__":
## parsage des arguments ## parsage des arguments
forward = None forward = None
spam = None spam = None
opts, args = getopt.getopt(sys.argv[1:], "", ['forward=', 'spam=']) spamdir = None
opts, args = getopt.getopt(sys.argv[1:], "", ['forward=', 'spam=', 'spamdir='])
if ('--spam','deplace') in opts:
optgood = False
for o, v in opts:
if o == '--spamdir':
optgood = True
if not optgood:
raise ValueError, 'Il faut renseigner un dossier pour déplacer le spam'
for o, v in opts: for o, v in opts:
if o == "--forward": if o == "--forward":
forward = v forward = v
elif o == '--spam': elif o == '--spam':
spam = v spam = v
elif o == '--spamdir':
spamdir = v
## execution de MailConfig ## execution de MailConfig
res = MailConfig(forward=forward, spam=spam) res = MailConfig(forward=forward, spam=spam, spamdir=spamdir)
## affichage des résultats ## affichage des résultats
for i in res.items(): for i in res.items():