Encodage en UTF-8 : Il reste encore beaucoup de boulot.

This commit is contained in:
Vincent Le Gallic 2014-04-18 20:21:56 +02:00
parent fc9ac609fc
commit 5fb0ee8bd5
16 changed files with 138 additions and 138 deletions

View file

@ -1,7 +1,7 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
# Pour envoyer effectivement des mails, il faut désactiver le debug
# Pour envoyer effectivement des mails, il faut désactiver le debug
debug = 1
import os,sys
@ -19,9 +19,9 @@ for i in range(5):
sys.exit(1)
# On définit ici une liste d'adresse mail qui ne sont pas à prévenir
# à utiliser par exemple si on a commencé à prévenir des adhérents mais que
# tous ne l'ont pas été
# On définit ici une liste d'adresse mail qui ne sont pas à prévenir
# à utiliser par exemple si on a commencé à prévenir des adhérents mais que
# tous ne l'ont pas été
try :
exempts = []
file = open('/home/salles/mails_envoyes',"r")
@ -33,25 +33,25 @@ try :
except :
print "Aucune exemption d'adresses mails ne sera prise en compte"
# On définit ici la liste des mails perdus et qui sont inscrits dans les logs
# Dans le cas du 11/09/2007, les mails perdus étaient identifiables avec
# On définit ici la liste des mails perdus et qui sont inscrits dans les logs
# Dans le cas du 11/09/2007, les mails perdus étaient identifiables avec
# le message "too many hops"
# On a donc créé le fichier mails_perdus avec la commande suivante :
# On a donc créé le fichier mails_perdus avec la commande suivante :
# cat /var/log/mail.log | grep "too many hops" | grep '(!) FWD via SMTP' | awk -F ' ' '{print $1 " " $2 " " $3 " " $11 " " $12 " " $13}' | tr \[:upper:\] \[:lower:\] | sed 's/,$//g' > mails_perdus
# Le fichier se présente alors sous la forme :
# Le fichier se présente alors sous la forme :
# Mois Jour Heure <emetteur@adresse.mail> -> <recepteur@adresse.mail.2>
file = open('/home/salles/mails_perdus',"r")
# On crée les 2 dictionnaire qui vont contenir les 2 types d'avertissemnts à
# On crée les 2 dictionnaire qui vont contenir les 2 types d'avertissemnts à
# communiquer :
# - les messages envoyés par des adhérents au serveur mais qui ne sont pas
# - les messages envoyés par des adhérents au serveur mais qui ne sont pas
#partis vers leur destinataire
unsend = {}
# - les messages reçus par le serveur mais non distribués aux adhérents
# - les messages reçus par le serveur mais non distribués aux adhérents
unreceived = {}
def is_crans(mail) :
""" Détermine si l'adresse mail concerne un adhérent"""
""" Détermine si l'adresse mail concerne un adhérent"""
# Je remarque que les adresses de clubs et de mailings-listes ne sont
# pas pris en compte @lists.crans.
if mail.find('@crans.') > 0 :
@ -61,16 +61,16 @@ def is_crans(mail) :
def append(dict, chain, value, date) :
""" Définit une méthode pour ajouter un mail perdu dans l'un des
""" Définit une méthode pour ajouter un mail perdu dans l'un des
dictionnaires.
Les dictionnaires ont pour clés l'adresse mail d'un adhérent aux quelles
sont associés une liste des mails perdus sur la forme ['adresse_mail2', 'date']
Les dictionnaires ont pour clés l'adresse mail d'un adhérent aux quelles
sont associés une liste des mails perdus sur la forme ['adresse_mail2', 'date']
"""
if not dict.has_key(chain) :
# Si la clé n'existe pas : initialisation
# Si la clé n'existe pas : initialisation
dict[chain] = [ [value, date] ]
else :
# Sinon on ajoute le nouveau mail perdu à la liste existante
# Sinon on ajoute le nouveau mail perdu à la liste existante
dict[chain].append([value, date])
# On traite maintenant la liste des mails perdus
@ -78,9 +78,9 @@ line = file.readline()
# Pour chaque mail perdu
while line:
datas = line.split()
# Il pourrait y avoir plusieurs expéditeurs pour le même mail
# Il pourrait y avoir plusieurs expéditeurs pour le même mail
senders = datas[3].split(",")
# Il peut y avoir plusieurs destinataires pour un mail (ça c'est sur)
# Il peut y avoir plusieurs destinataires pour un mail (ça c'est sur)
receivers = datas[5].split(",")
# On tente d'enlever les adresses nulles de ces 2 listes
try :
@ -95,7 +95,7 @@ while line:
# On reformate le champ date en inversant Jour et Mois
date = u"%s %s %s" % (datas[1], datas[0], datas[2])
# Pour chaque couple de mail perdu associé à une source et un destinataire
# Pour chaque couple de mail perdu associé à une source et un destinataire
for sender in senders :
for receiver in receivers :
# L'expediteur et le receveur sont du crans ?
@ -109,14 +109,14 @@ while line:
if is_crans(receiver) and not is_crans(sender) :
append(unreceived, receiver, sender, date)
# On passe à la ligne suivante
# On passe à la ligne suivante
line = file.readline()
file.close()
# On traite le formatage des mails pour indiquer aux adhérents les
# mails qui ne leur ont pas été délivrés
# On traite le formatage des mails pour indiquer aux adhérents les
# mails qui ne leur ont pas été délivrés
for adh in unreceived.keys() :
text = u"""From: CRANS (Nounous) <nounous@crans.org>
To: %s
@ -125,30 +125,30 @@ Content-Type: text/plain; charset="iso-8859-15"
Bonjour,
Nous t'informons que suite à une erreur sur le serveur de mail
de l'association, il est fort probable que nous ayons égaré des
messages te concernant dans la période allant du lundi 10/09/2007
23h00 à ce mardi 11/09/2007 9h50.
Nous t'informons que suite à une erreur sur le serveur de mail
de l'association, il est fort probable que nous ayons égaré des
messages te concernant dans la période allant du lundi 10/09/2007
23h00 à ce mardi 11/09/2007 9h50.
Tu trouveras ci-dessous le détail des messages que tu n'as pas pu
Tu trouveras ci-dessous le détail des messages que tu n'as pas pu
recevoir et/ou envoyer.\n""" % adh
for unrecv in unreceived[adh] :
text += u""" - mail non reçu : envoyé par %s avant le %s\n""" % (unrecv[0], unrecv[1])
text += u""" - mail non reçu : envoyé par %s avant le %s\n""" % (unrecv[0], unrecv[1])
text += u"""Nous te conseillons de contacter les personnes qui figurent dans
cette liste si tu souhaites recevoir leur message, car elles n'ont
pas été informé de cette erreur de livraison.
pas été informé de cette erreur de livraison.
"""
# Au passage, on vérifie s'il n'y a pas des mails que l'adhérents auraient
# Au passage, on vérifie s'il n'y a pas des mails que l'adhérents auraient
# voulu envoyer qui se seraient aussi perdus
if unsend.has_key(adh) :
text += u"""
"""
for unsnd in unsend[adh] :
text += u""" - mail non envoyé : adressé à %s le %s\n""" % (unsnd[0], unsnd[1])
text += u""" - mail non envoyé : adressé à %s le %s\n""" % (unsnd[0], unsnd[1])
text += u"""Pour les mails que tu as pu essayé d'envoyer, et si ce n'est pas
déjà le cas, il te faut les réexpédier si tu souhaites que tes
destinataires les reçoivent.
text += u"""Pour les mails que tu as pu essayé d'envoyer, et si ce n'est pas
déjà le cas, il te faut les réexpédier si tu souhaites que tes
destinataires les reçoivent.
"""
text += u"""
@ -167,8 +167,8 @@ Les nounous du CRANS"""
pass
# Le message est légèrement différent dans le cas où l'adhérent n'a perdu
# des mails qu'à l'envoi.
# Le message est légèrement différent dans le cas où l'adhérent n'a perdu
# des mails qu'à l'envoi.
for adh in unsend.keys() :
if not unreceived.has_key(adh) :
text = u"""From: CRANS (Nounous) <nounous@crans.org>
@ -178,20 +178,20 @@ Content-Type: text/plain; charset="iso-8859-15"
Bonjour,
Nous t'informons que suite à une erreur sur le serveur de mail
Nous t'informons que suite à une erreur sur le serveur de mail
de l'association, il est fort probable que nous n'ayons pas pu
transmettre certains de tes messages dans la période allant du
lundi 10/09/2007 23h00 à ce mardi 11/09/2007 9h50.
transmettre certains de tes messages dans la période allant du
lundi 10/09/2007 23h00 à ce mardi 11/09/2007 9h50.
Tu trouveras ci-dessous le détail des messages que nous n'avons
Tu trouveras ci-dessous le détail des messages que nous n'avons
pas pu envoyer.\n""" % adh
for unsnd in unsend[adh] :
text += u""" - mail non envoyé : adressé à %s le %s\n""" % (unsnd[0], unsnd[1])
text += u""" - mail non envoyé : adressé à %s le %s\n""" % (unsnd[0], unsnd[1])
text += u"""Pour les mails que tu as pu essayé d'envoyer, et si ce n'est
pas déjà le cas, il te faut les réexpédier si tu souhaites que tes
destinataires les reçoivent.
text += u"""Pour les mails que tu as pu essayé d'envoyer, et si ce n'est
pas déjà le cas, il te faut les réexpédier si tu souhaites que tes
destinataires les reçoivent.
"""
text += u"""
@ -207,4 +207,4 @@ Les nounous du CRANS"""
except :
pass

View file

@ -1,9 +1,9 @@
#!/bin/sh
# À exécuter en tant que l'utilisateur dont on veut déplacer les mails
# À exécuter en tant que l'utilisateur dont on veut déplacer les mails
if [[ $USER = "root" ]]; then
echo "Ce script doit être exécuté en tant que l'utilisateur dont on veut déplacer les mails !"
echo "Ce script doit être exécuté en tant que l'utilisateur dont on veut déplacer les mails !"
exit 1
fi
@ -14,9 +14,9 @@ set -e
echo -n "Sauvegarde en cours vers $BACKUP... "
test ! -a $BACKUP
cp -a $MAIL $BACKUP
# On évite l'* qui risque de donner trop d'arguments
# On ne supprime pas non plus de répertoire car on peut ne pas avoir les
# droits pour le recréer avec les mêmes permissions
# On évite l'* qui risque de donner trop d'arguments
# On ne supprime pas non plus de répertoire car on peut ne pas avoir les
# droits pour le recréer avec les mêmes permissions
find $MAIL/{cur,tmp,new} -type f -print0 | xargs -0 rm -f || true
find $BACKUP -type f | xargs chmod 600
find $BACKUP -type d | xargs chmod 700

View file

@ -11,7 +11,7 @@ import annuaires_pg
from iptools import AddrInNet
def chap_ok(password, challenge, clear_pass) :
""" Test l'authentification chap fournie
password et chalenge doivent être données
password et chalenge doivent être données
en hexa (avec ou sans le 0x devant)
retourne True si l'authentification est OK
@ -31,39 +31,39 @@ def paiement_ok(adh):
paid = max(adh.paiement() + [0])
if periode_transitoire:
# Si periode transitoire, on accepte les personnes n'ayant pas
# réadhéré
# réadhéré
ann_scol -= 1
return ann_scol <= paid
def do_auth(mac, prise):
"""Effectue l'authentification. Renvoie (success, msg,
vlan). success est 0 si l'authentification est réussie, msg est
pour les logs et vlan est le vlan non taggé à utiliser pour la
vlan). success est 0 si l'authentification est réussie, msg est
pour les logs et vlan est le vlan non taggé à utiliser pour la
prise."""
global ann_scol
# Test chap (comme cela on est sur que c'est bien un switch qui demande)
if not chap_ok(os.getenv('CHAP_PASSWORD'), os.getenv('CHAP_CHALLENGE'), mac):
return (-1, "Échec test CHAP", "")
return (-1, "Échec test CHAP", "")
# Mac dans la base LDAP
conn = crans_ldap(readonly=True)
m = conn.search('mac=%s' % mac)['machine']
if len(m) == 0:
# Est-ce un ancien client de l'offre Crous ?
# on le met sur le vlan install-party où on aura activé un forwarding
# on le met sur le vlan install-party où on aura activé un forwarding
# (uniquement en attendant qu'il soit inscrit proprement)
for chbre in annuaires_pg.reverse(prise[0], prise[1:]):
if not annuaires_pg.is_crans(prise[0], chbre):
return (0, "TMP: ancien client CROUS", 'event')
return (0, "Mac inconnue", "accueil")
elif len(m) > 1:
return (-1, "Pb recherche mac (nb résultat %d!=1)" % len(m), "")
return (-1, "Pb recherche mac (nb résultat %d!=1)" % len(m), "")
# N'appartient pas au Crans et n'a pas de prise attribuée
# donc sur uplink ou switch non filtré
# But : éviter le spoof d'une mac d'une machine clef
# N'appartient pas au Crans et n'a pas de prise attribuée
# donc sur uplink ou switch non filtré
# But : éviter le spoof d'une mac d'une machine clef
proprio = m[0].proprietaire()
if proprio.__class__ == AssociationCrans:
return (-1, "Machine du crans", "")
@ -72,7 +72,7 @@ def do_auth(mac, prise):
if 'bloq' in m[0].blacklist_actif():
return (-1, "Bloquage total des services pour cette machine", "")
# les gens qui doivent être isolés
# les gens qui doivent être isolés
if ('virus' in m[0].blacklist_actif() or 'ipv6_ra' in m[0].blacklist_actif()
or 'autodisc_virus' in m[0].blacklist_actif()):
return (0, "Bad boy", "isolement")
@ -82,10 +82,10 @@ def do_auth(mac, prise):
# Paiement proprio ?
if not paiement_ok(proprio):
return (0, "N'a pas payé", "accueil")
return (0, "N'a pas payé", "accueil")
# Si l'adhérent n'est pas membre actif, il doit se brancher depuis la prise
# d'un autre adhérent à jour de cotisation
# Si l'adhérent n'est pas membre actif, il doit se brancher depuis la prise
# d'un autre adhérent à jour de cotisation
if not proprio.droits():
try:
chbre = prise[0] + annuaires_pg.reverse(prise[0], prise[1:])[0]
@ -96,15 +96,15 @@ def do_auth(mac, prise):
if paiement_ok(hebergeur):
break
else:
return (0, "Hébergeur non à jour", "accueil")
return (0, "Hébergeur non à jour", "accueil")
# Cas des personnels logés dans les appartements de l'ENS
# Cas des personnels logés dans les appartements de l'ENS
if (proprio.etudes(0) == 'Personnel ENS' or
('Nounou' in proprio.droits() and AddrInNet(m[0].ip(),'10.2.9.0/24'))):
return (0, "Personnel ENS", "appts")
# C'est bon
return (0, "Accès adhérent OK", "adherent")
return (0, "Accès adhérent OK", "adherent")
if __name__ == '__main__' :
mac = os.getenv('USER_NAME', '').replace('"', '')
@ -112,7 +112,7 @@ if __name__ == '__main__' :
prise = (len(switch) == 6 and (switch[3] + switch[5]) or (switch + "-"))
prise += "%02d" % int(os.getenv("NAS_PORT", 0))
# On vérifie si la mac est autorisée
# On vérifie si la mac est autorisée
(r, msg, vlan) = do_auth(mac, prise)
# On logue la prise sur laquelle a lieu la tentative
@ -120,13 +120,13 @@ if __name__ == '__main__' :
syslog("%s -> %s [%s]" % (prise, mac, msg))
if vlan:
# Cela indique au switch comment configurer le vlan par défaut
# Cela indique au switch comment configurer le vlan par défaut
# pour cette prise
print ", ".join(["Tunnel-Type = VLAN",
"Tunnel-Medium-Type = IEEE-802",
"Tunnel-Private-Group-Id = \"%d\"" % vlans[vlan]])
# On tente de logguer la dernière mac sur une prise donnée
# On tente de logguer la dernière mac sur une prise donnée
try:
f = open('/usr/scripts/var/last_macs/' + prise,'w')
f.write(mac)