Package zephir :: Package monitor :: Package agents :: Module eximstats
[frames] | no frames]

Source Code for Module zephir.monitor.agents.eximstats

  1  # -*- coding: UTF-8 -*- 
  2  ########################################################################### 
  3  # Eole NG - 2007 
  4  # Copyright Pole de Competence Eole  (Ministere Education - Academie Dijon) 
  5  # Licence CeCill  cf /root/LicenceEole.txt 
  6  # eole@ac-dijon.fr 
  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   
19 -def format_quantity(quantity):
20 """ 21 L'option "-nvr" d'eximstats permet de toujours avoir le résulat en bytes 22 Il n'y a plus qu'à le transformer en ko ou en Mo 23 """ 24 quantity = float(quantity)/1024 25 if quantity < 1000: 26 return '%.1f ko' % quantity 27 else: 28 return '%.1f Mo' % (quantity/1024)
29 30
31 -class EximStats(Agent):
32
33 - def __init__(self, name, **params):
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
52 - def measure(self):
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
63 - def measure_process(self, result):
64 """ 65 traitement du résultat 66 """ 67 # étude du résultat 68 res1 = [] 69 res2 = [] 70 date = [] 71 Queue = False 72 if result == '' or result.startswith('****'): 73 # No valid log lines read 74 return self.no_measure() 75 for ligne in result.splitlines(): 76 # dernier ! 77 if ligne.startswith('Errors encountered:') : 78 # en première ligne 79 # L.insert(index, object) -- insert object before index 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 # 1er 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 # 2ème 95 elif ligne.startswith(' Delivered'): 96 l = ligne.split() 97 res1.append ({'label' : 'Envoi', 'quantity' : format_quantity(l[1]), 'number' : l[2] }) 98 99 # 3ème 100 elif ligne.startswith('Under 1m') and Queue==False: 101 # tour de passe-passe car la ligne y est 2 fois 102 # on prend la première ! 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 # rien trouvé ? 110 return self.no_measure() 111 112 return { 'statistics' : res1, 113 'statistics2' : res2, 114 'statdate' : date 115 }
116
117 - def no_measure(self):
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
126 - def write_data(self):
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
136 - def check_status(self):
137 """ 138 calcul du statut 139 """ 140 return self.status
141