1
2
3
4
5
6
7
8
9 """
10 Agent Zéphir pour l'étude des Statistiques Exim
11 """
12
13 from zephir.monitor.agentmanager.agent import Agent
14 from zephir.monitor.agentmanager.data import HTMLData, TableData
15 from twisted.internet.utils import getProcessOutput
16 from zephir.monitor.agentmanager import status
17
18
29
30
32
34 Agent.__init__(self, name, **params)
35 self.status = status.OK()
36 title1 = HTMLData("<h3>Etat du trafic<h3>")
37 self.table = TableData([
38 ('label', '', {'align':'center'}, None),
39 ('quantity', 'Volume de données', {'align':'center'}, None),
40 ('number', 'Nombre de messages', {'align':'center'}, None),
41 ])
42 title2 = HTMLData("<h3>Erreurs<h3>")
43 self.table2 = TableData([
44 ('label', '', {'align':'center'}, None),
45 ('value', 'Valeur', {'align':'center'}, None),
46 ])
47 self.tdate = TableData([
48 ('date', 'Période de mesure', {'align':'center'}, None),
49 ])
50 self.data = [self.tdate, title1, self.table, title2, self.table2]
51
53 """
54 Utilisation de la commande eximstats :
55 eximstats -nt -h0 -tnl -t0 -nr -nvr -q60 /var/log/exim4/mainlog
56 2011 : utilisation d'un script externe pour la gestion du mode conteneur
57 """
58 res = getProcessOutput("/usr/share/zephir/monitor/bin/eximstats.sh",
59 env = {'LC_ALL': 'C'})
60 res.addCallback(self.measure_process)
61 return res
62
64 """
65 traitement du résultat
66 """
67
68 res1 = []
69 res2 = []
70 date = []
71 Queue = False
72 if result == '' or result.startswith('****'):
73
74 return self.no_measure()
75 for ligne in result.splitlines():
76
77 if ligne.startswith('Errors encountered:') :
78
79
80 res2.insert (0, {'label' : 'Nombre d\'erreurs', 'value' : ligne[20:]} )
81 if ligne.startswith('Exim statistics from') :
82 l = ligne.split()
83 deb = l[3].split('-')
84 fin = l[6].split('-')
85 date.append ({'date' : 'du %s/%s/%s au %s/%s/%s' % (deb[2], deb[1], deb[0],
86 fin[2], fin[1], fin[0])})
87
88 elif ligne.startswith(' Received '):
89 l = ligne.split()
90 res1.append ({'label' : 'Réception', 'quantity' : format_quantity(l[1]), 'number' : l[2] })
91 res2.append ({'label' : 'Pourcentage de mails en attente', 'value' : l[5] })
92 res2.append ({'label' : 'Pourcentage de mails en erreur', 'value' : l[7] })
93
94
95 elif ligne.startswith(' Delivered'):
96 l = ligne.split()
97 res1.append ({'label' : 'Envoi', 'quantity' : format_quantity(l[1]), 'number' : l[2] })
98
99
100 elif ligne.startswith('Under 1m') and Queue==False:
101
102
103 Queue = True
104 l = ligne.split()
105 res2.insert (0, {'label' : 'Mails ayant passé plus de 1 minute en queue',
106 'value' : '%.1f%%' % ( float(100) - float(l[3][:-1]) ) })
107
108 if res1 == []:
109
110 return self.no_measure()
111
112 return { 'statistics' : res1,
113 'statistics2' : res2,
114 'statdate' : date
115 }
116
118 """
119 affichage élégant si pas d'erreur
120 """
121 return { 'statistics' : [{'label' : '', 'quantity' : '0', 'number' : '0'}],
122 'statistics2' : [{'label' : '', 'value' : '---'}],
123 'statdate' : [{'date' : '---' }],
124 }
125
127 """
128 écriture du résultat
129 """
130 Agent.write_data(self)
131 if self.last_measure is not None:
132 self.table.table_data = self.last_measure.value['statistics']
133 self.table2.table_data = self.last_measure.value['statistics2']
134 self.tdate.table_data = self.last_measure.value['statdate']
135
137 """
138 calcul du statut
139 """
140 return self.status
141