Correction de bugs et mise en prod .

This commit is contained in:
Gabriel Detraz 2015-04-01 23:34:39 +02:00
parent 407c1e4799
commit edfdd8ccc6

View file

@ -28,6 +28,12 @@ if '--dry-run' in sys.argv[1:]:
else: else:
DRY_RUN = False DRY_RUN = False
# Exécuter le script en mode débug
if '--debug' in sys.argv[1:]:
DEBUG = True
print("Mode débug\n")
else:
DEBUG = False
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
# 0) Initialisation de LDAP,objets + fcts utiles # 0) Initialisation de LDAP,objets + fcts utiles
@ -40,11 +46,14 @@ else:
MAX_CHAR = 160 MAX_CHAR = 160
# Connexion à la base LDAP # Connexion à la base LDAP
ldap = shortcuts.lc_ldap_test() ldap = shortcuts.lc_ldap_admin()
# Serveur boite aux lettres # Serveur boite aux lettres
MAILBOX_SERVER = 'zamok.crans.org' MAILBOX_SERVER = 'zamok.crans.org'
if DEBUG:
log_file = open(os.getenv('HOME')+'/alertsms.log', mode='w')
# Serveurs pouvant distribuer les mails de manière légitime # Serveurs pouvant distribuer les mails de manière légitime
TRUSTED_SERVERS = [ ( TRUSTED_SERVERS = [ (
name.replace('freebox.crans.org','titanic.crans.org'), name.replace('freebox.crans.org','titanic.crans.org'),
@ -115,6 +124,8 @@ def get_trusted_servers_v6():
""" """
return [(name,adm_name,ip_dict['ipv6']) for name,adm_name,ip_dict in TRUSTED_SERVERS ] return [(name,adm_name,ip_dict['ipv6']) for name,adm_name,ip_dict in TRUSTED_SERVERS ]
if DEBUG:
log_file.writelines(['Phase 0 : OK\n'])
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
# 1) Lire le mail dans le flux stdin # 1) Lire le mail dans le flux stdin
@ -137,14 +148,21 @@ by_chain = get_all_by_info(msg)
mail_subject = msg['Subject'] mail_subject = msg['Subject']
mail_content = msg.get_payload().replace('\n',' ') mail_content = msg.get_payload().replace('\n',' ')
if DEBUG:
log_file.writelines(['Phase 1 : OK\n'])
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
# 2) Ce message est-il destiné à être envoyé par SMS ? # 2) Ce message est-il destiné à être envoyé par SMS ?
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
if '[SMS]' not in mail_subject: if '[SMS]' not in mail_subject:
print("Message non destiné au service SMS") if DEBUG:
log_file.writelines(["Message non destiné au service SMS"])
sys.exit(200) sys.exit(200)
if DEBUG:
log_file.writelines(['Phase 2 : OK\n'])
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
# 3) Analyse de la chaine de réception du message # 3) Analyse de la chaine de réception du message
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
@ -153,15 +171,18 @@ if '[SMS]' not in mail_subject:
# Il faut aussi vérifier qui a distribué le mail # Il faut aussi vérifier qui a distribué le mail
if len(received_chain) < 2: if len(received_chain) < 2:
print("La chaine de réception n'est pas assez longue") if DEBUG:
log_file.writelines(["La chaine de réception n'est pas assez longue"])
sys.exit(300) sys.exit(300)
if by_chain[0] != MAILBOX_SERVER: if by_chain[0] != MAILBOX_SERVER:
print("La boîte aux lettres est suspecte :\ if DEBUG:
{0} au lieu de {1}".format(repr(by_chain[0]),MAILBOX_SERVER)) log_file.writelines(["La boîte aux lettres est suspecte :\
{0} au lieu de {1}".format(repr(by_chain[0]),MAILBOX_SERVER)])
sys.exit(301) sys.exit(301)
print("Boîte aux lettres : " + MAILBOX_SERVER) if DEBUG:
log_file.writelines(["Boîte aux lettres : " + MAILBOX_SERVER])
trusted_server = False trusted_server = False
sender,real_sender,ipv4,ipv6 = received_chain[0] sender,real_sender,ipv4,ipv6 = received_chain[0]
@ -174,15 +195,19 @@ elif ipv6:
trusted_server = server in get_trusted_servers_v6() trusted_server = server in get_trusted_servers_v6()
if not trusted_server: if not trusted_server:
print("Le serveur de distribution du courrier est suspect") if DEBUG:
log_file.writelines(["Le serveur de distribution du courrier est suspect"])
sys.exit(302) sys.exit(302)
print("Serveur de distribution : " + repr(server) + "\n") if DEBUG:
log_file.writelines(["Serveur de distribution : " + repr(server) + "\n"])
# On fait confiance à la boîte aux lettres et au serveur de distribution # On fait confiance à la boîte aux lettres et au serveur de distribution
# Le serveur de distribution est le premier serveur Crans à recevoir le mail # Le serveur de distribution est le premier serveur Crans à recevoir le mail
# Au-delà, on a aucun contrôle : On est obligé de faire confiance # Au-delà, on a aucun contrôle : On est obligé de faire confiance
log_file.writelines(['Phase 3 : OK\n'])
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
# 4) Vérifier l'identité de l'expéditeur # 4) Vérifier l'identité de l'expéditeur
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
@ -204,14 +229,16 @@ if not special_auth:
sender_ip = sender_ipv6 sender_ip = sender_ipv6
f = filter.human_to_ldap('ip6HostNumber=' + sender_ipv6) f = filter.human_to_ldap('ip6HostNumber=' + sender_ipv6)
else: else:
print("Identification impossible : L'expéditeur n'a ni IPv4 ni IPv6") if DEBUG:
log_file.writelines(["Identification impossible : L'expéditeur n'a ni IPv4 ni IPv6"])
sys.exit(402) sys.exit(402)
sender = ldap.search(f) sender = ldap.search(f)
# --> Si il n'y a aucun résultat, on quitte le script # --> Si il n'y a aucun résultat, on quitte le script
if not sender: if not sender:
print('Aucun résultat pour l\'expéditeur dans la base LDAP') if DEBUG:
log_file.writelines(['Aucun résultat pour l\'expéditeur dans la base LDAP'])
sys.exit(400) sys.exit(400)
sender = sender[0] sender = sender[0]
@ -235,10 +262,12 @@ if not special_auth:
# On quitte le script si on a pas l'autorisation # On quitte le script si on a pas l'autorisation
if not is_authorized: if not is_authorized:
print("Impossible d'envoyer le SMS (Autorisation refusée)") if DEBUG:
log_file.writelines(["Impossible d'envoyer le SMS (Autorisation refusée)"])
sys.exit(401) sys.exit(401)
print(u"Expéditeur : " + pseudo + " [" + sender_ip + "]" + "\n") if DEBUG:
log_file.writelines(['Phase 4 : OK\n'])
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
# 5) Contacter le démon sms # 5) Contacter le démon sms
@ -251,9 +280,12 @@ if not DRY_RUN:
except GSMError: except GSMError:
# On quitte si l'initialisation a échoué # On quitte si l'initialisation a échoué
print("Impossible de contacter le démon SMS") if DEBUG:
log_file.writelines(["Impossible de contacter le démon SMS"])
sys.exit(500) sys.exit(500)
if DEBUG:
log_file.writelines(['Phase 5 : OK\n'])
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
# 6) Ecrire le SMS # 6) Ecrire le SMS
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
@ -272,7 +304,7 @@ tel_pattern = re.compile('^((336)|(337)|(06)|(07))[0-9]{8}$')
# On vérifie que ce soit un numéro de téléphone mobile valide # On vérifie que ce soit un numéro de téléphone mobile valide
if not tel_pattern.match(number): if not tel_pattern.match(number):
print("Numéro du destinataire invalide") log_file.writelines(["Numéro du destinataire invalide"])
sys.exit(600) sys.exit(600)
# Si le numéro commence par l'indicatif 33, on rajoute le + # Si le numéro commence par l'indicatif 33, on rajoute le +
@ -287,9 +319,12 @@ message = {
'SMSC' : { 'Location' : 1 }, 'SMSC' : { 'Location' : 1 },
'Number' : number, 'Number' : number,
} }
print(u"Destinataire : " + user)
print(u"Contenu du message : " + text + "\n")
if DEBUG:
log_file.writelines([u"Destinataire : " + user])
log_file.writelines([u"Contenu du message : " + text + "\n"])
log_file.writelines(['Phase 6 : OK\n'])
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
# 7) L'envoyer # 7) L'envoyer
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
@ -300,6 +335,9 @@ if not DRY_RUN:
daemon.InjectSMS([message]) daemon.InjectSMS([message])
except GSMError: except GSMError:
print("Le message n'a pas pu être placé dans la file d'attente") if DEBUG:
log_file.writelines(["Le message n'a pas pu être placé dans la file d'attente"])
sys.exit(700) sys.exit(700)
if DEBUG:
log_file.writelines(['Phase 7 : OK\n'])