From edfdd8ccc68bd67d39a73b082b3f9d026b7aa225 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Wed, 1 Apr 2015 23:34:39 +0200 Subject: [PATCH] Correction de bugs et mise en prod . --- utils/alertsms.py | 72 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 55 insertions(+), 17 deletions(-) diff --git a/utils/alertsms.py b/utils/alertsms.py index 37f8b5c2..e39818ed 100755 --- a/utils/alertsms.py +++ b/utils/alertsms.py @@ -28,6 +28,12 @@ if '--dry-run' in sys.argv[1:]: else: 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 @@ -40,11 +46,14 @@ else: MAX_CHAR = 160 # Connexion à la base LDAP -ldap = shortcuts.lc_ldap_test() +ldap = shortcuts.lc_ldap_admin() # Serveur boite aux lettres 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 TRUSTED_SERVERS = [ ( 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 ] +if DEBUG: + log_file.writelines(['Phase 0 : OK\n']) #------------------------------------------------------------------------------- # 1) Lire le mail dans le flux stdin @@ -137,14 +148,21 @@ by_chain = get_all_by_info(msg) mail_subject = msg['Subject'] 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 ? #------------------------------------------------------------------------------- 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) +if DEBUG: + log_file.writelines(['Phase 2 : OK\n']) + #------------------------------------------------------------------------------- # 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 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) if by_chain[0] != MAILBOX_SERVER: - print("La boîte aux lettres est suspecte :\ - {0} au lieu de {1}".format(repr(by_chain[0]),MAILBOX_SERVER)) + if DEBUG: + 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) -print("Boîte aux lettres : " + MAILBOX_SERVER) +if DEBUG: + log_file.writelines(["Boîte aux lettres : " + MAILBOX_SERVER]) trusted_server = False sender,real_sender,ipv4,ipv6 = received_chain[0] @@ -174,15 +195,19 @@ elif ipv6: trusted_server = server in get_trusted_servers_v6() 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) -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 # 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 + log_file.writelines(['Phase 3 : OK\n']) + #------------------------------------------------------------------------------- # 4) Vérifier l'identité de l'expéditeur #------------------------------------------------------------------------------- @@ -204,14 +229,16 @@ if not special_auth: sender_ip = sender_ipv6 f = filter.human_to_ldap('ip6HostNumber=' + sender_ipv6) 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) sender = ldap.search(f) # --> Si il n'y a aucun résultat, on quitte le script 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) sender = sender[0] @@ -235,10 +262,12 @@ if not special_auth: # On quitte le script si on a pas l'autorisation 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) -print(u"Expéditeur : " + pseudo + " [" + sender_ip + "]" + "\n") +if DEBUG: + log_file.writelines(['Phase 4 : OK\n']) #------------------------------------------------------------------------------- # 5) Contacter le démon sms @@ -251,9 +280,12 @@ if not DRY_RUN: except GSMError: # 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) +if DEBUG: + log_file.writelines(['Phase 5 : OK\n']) #------------------------------------------------------------------------------- # 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 if not tel_pattern.match(number): - print("Numéro du destinataire invalide") + log_file.writelines(["Numéro du destinataire invalide"]) sys.exit(600) # Si le numéro commence par l'indicatif 33, on rajoute le + @@ -287,9 +319,12 @@ message = { 'SMSC' : { 'Location' : 1 }, '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 #------------------------------------------------------------------------------- @@ -300,6 +335,9 @@ if not DRY_RUN: daemon.InjectSMS([message]) 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) +if DEBUG: + log_file.writelines(['Phase 7 : OK\n'])