wcs-dynexport : intégration du basculement vers PostgreSQL (suite)
[progfou.git] / outils / auf-estmp-sizes
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3 """
4 auf-esmtp-sizes — Vérification des tailles de messages ESMTP acceptées
5
6 Copyright : Agence universitaire de la Francophonie — www.auf.org
7 Licence : GNU General Public Licence, version 3
8 Auteur : Jean Christophe André
9 Date de création : 1 mars 2013
10
11 Dépendance Debian : python-dnspython
12 """
13 import sys
14 import time
15 import smtplib
16 import aufrefer
17 import dns.resolver
18
19 SMTP_TIMEOUT = 60 # 5 suffit pour la moitié, 30 ne suffit pas pour tout le monde
20
21 moinmoin = (len(sys.argv) > 1) and (sys.argv[1] == '--moinmoin')
22
23 # on cherche le meilleur MX, ou sinon le domaine lui-même
24 def 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
34 def 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
50 domains = [u['redir'].split('@')[1] for u in aufrefer.get('annuaire.json')]
51 domains = [d for d in set(domains)]
52 domains.sort()
53
54 if 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
60 for 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