wcs-dynexport : intégration du basculement vers PostgreSQL (suite)
[progfou.git] / outils / auf-estmp-sizes
CommitLineData
156b9020
P
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3"""
4auf-esmtp-sizes — Vérification des tailles de messages ESMTP acceptées
5
6Copyright : Agence universitaire de la Francophonie — www.auf.org
7Licence : GNU General Public Licence, version 3
8Auteur : Jean Christophe André
9Date de création : 1 mars 2013
10
11Dépendance Debian : python-dnspython
12"""
13import sys
14import time
15import smtplib
16import aufrefer
17import dns.resolver
18
19SMTP_TIMEOUT = 60 # 5 suffit pour la moitié, 30 ne suffit pas pour tout le monde
20
21moinmoin = (len(sys.argv) > 1) and (sys.argv[1] == '--moinmoin')
22
23# on cherche le meilleur MX, ou sinon le domaine lui-même
24def get_mail_exchanger(domain):
25 mx_hostname = domain
26 mx_preference = 1000
27 for rdata in dns.resolver.query(domain + '.', 'MX'):
28 if rdata.preference < mx_preference:
29 mx_hostname = rdata.exchange.to_text()
30 mx_preference = rdata.preference
31 return mx_hostname
32
33# on contacte le MX en ESMTP pour obtenir sa taille limite
34def get_mx_size(mx):
35 try:
36 smtp = smtplib.SMTP(mx, timeout=SMTP_TIMEOUT)
37 smtp.ehlo_or_helo_if_needed()
38 except:
39 raise Exception("non joignable")
40 if not smtp.does_esmtp:
41 raise Exception("non compatible ESMTP ?!?")
42 try:
43 size = int(smtp.esmtp_features['size'])
44 except:
45 raise Exception("sans taille valide")
46 smtp.quit()
47 return size
48
49# liste des domaines internes de communication à l'AuF
50domains = [u['redir'].split('@')[1] for u in aufrefer.get('annuaire.json')]
51domains = [d for d in set(domains)]
52domains.sort()
53
54if moinmoin:
55 today = time.strftime('%d/%m/%Y')
56 print u"== Tailles acceptées pour les courriels au %s ==" % today
57 print u"||'''Domaine'''||'''Taille acceptée'''||"
58
59# pour chaque domaine, vérifier la taille sur le MX principal
60for domain in domains:
61 mx = get_mail_exchanger(domain)
62 #print "Test de '%s'..." % mx
63 try:
64 size = get_mx_size(mx)
65 except Exception, e:
66 if moinmoin:
67 print "||%s||''%s''||" % (domain, e.message)
68 else:
69 print "Domaine '%s' %s." % (domain, e.message)
70 continue
71 if moinmoin:
72 if size <= 0:
73 color = '#ff0000'
74 elif size <= 3*1024*1024:
75 color = '#00ff00'
76 elif size <= 10*1024*1024:
77 color = '#ffff00'
78 else:
79 color = '#ff0000'
80 print "||%s||<)%s>%s||" % (domain, color, size)
81 else:
82 print "Taille pour le domaine '%s' : %s" % (domain, size)
83