Package zephir :: Package monitor :: Package agents :: Module eximstats
[hide private]
[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 zephir 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  from os.path import isfile 
 18   
 19   
20 -class EximStats(Agent):
21 - def __init__(self, name, **params):
22 Agent.__init__(self, name, **params) 23 self.status = status.OK() 24 title1 = HTMLData("<h3>Etat du trafic<h3>") 25 self.table = TableData([ 26 ('label', '', {'align':'center'}, None), 27 ('quantity', 'Volume de données', {'align':'center'}, None), 28 ('number', 'Nombre de messages', {'align':'center'}, None), 29 ]) 30 title2 = HTMLData("<h3>Erreurs<h3>") 31 self.table2 = TableData([ 32 ('label', '', {'align':'center'}, None), 33 ('value', 'Valeur', {'align':'center'}, None), 34 ]) 35 self.tdate = TableData([ 36 ('date', 'Période de mesure', {'align':'center'}, None), 37 ]) 38 self.data = [self.tdate, title1, self.table, title2, self.table2]
39
40 - def _format_quantity(self, quantity):
41 """ 42 L'option "-nvr" permet de toujours avoir le résulat en bytes 43 Il n'y a plus qu'à le transformer en ko ou en Mo 44 """ 45 quantity = float(quantity)/1024 46 if quantity < 1000: 47 return '%.1f ko' % quantity 48 else: 49 return '%.1f Mo' % (quantity/1024)
50
51 - def measure(self):
52 """Utilisation de la commande eximstats""" 53 """eximstats -nt -h0 -tnl -t0 -nr -nvr -q60 /var/log/exim4/mainlog""" 54 args = ['-nt', '-h0', '-tnl', '-t0', '-nr', '-nvr', '-q60'] 55 56 f_log1 = '/var/log/exim4/mainlog' 57 f_log2 = '/var/log/exim4/mainlog.01' 58 59 if not isfile(f_log1) and not isfile(f_log2) : 60 # si pas fichier on court à la catastrophe :) 61 return self.no_measure() 62 63 if isfile(f_log1) : 64 args.append(f_log1) 65 if isfile(f_log2) : 66 args.append(f_log2) 67 68 res = getProcessOutput("/usr/sbin/eximstats", 69 args = args, 70 env = {'LC_ALL': 'C'}) 71 72 res.addCallback(self.measure_process) 73 return res
74 75
76 - def measure_process(self,result):
77 # étude du résultat 78 res1 = [] 79 res2 = [] 80 date = [] 81 Queue = False 82 if result.startswith('****'): 83 # No valid log lines read 84 return self.no_measure() 85 for ligne in result.splitlines(): 86 # dernier ! 87 if ligne.startswith('Errors encountered:') : 88 # en première ligne 89 # L.insert(index, object) -- insert object before index 90 res2.insert (0, {'label' : 'Nombre d\'erreurs', 'value' : ligne[20:]} ) 91 if ligne.startswith('Exim statistics from') : 92 l = ligne.split() 93 deb = l[3].split('-') 94 fin = l[6].split('-') 95 date.append ({'date' : 'du %s/%s/%s au %s/%s/%s' % (deb[2],deb[1],deb[0],fin[2],fin[1],fin[0])}) 96 # 1er 97 elif ligne.startswith(' Received '): 98 l = ligne.split() 99 res1.append ({'label' : 'Réception', 'quantity' : self._format_quantity(l[1]), 'number' : l[2] }) 100 res2.append ({'label' : 'Pourcentage de mails en attente', 'value' : l[5] }) 101 res2.append ({'label' : 'Pourcentage de mails en erreur', 'value' : l[7] }) 102 103 # 2ème 104 elif ligne.startswith(' Delivered'): 105 l = ligne.split() 106 res1.append ({'label' : 'Envoi', 'quantity' : self._format_quantity(l[1]), 'number' : l[2] }) 107 108 # 3ème 109 elif ligne.startswith('Under 1m') and Queue==False: 110 # tour de passe-passe car la ligne y est 2 fois 111 # on prend la première ! 112 Queue = True 113 l = ligne.split() 114 res2.insert (0, {'label' : 'Mails ayant passé plus de 1 minute en queue', 115 'value' : '%.1f%%' % ( float(100) - float(l[3][:-1]) ) }) 116 117 return { 'statistics' : res1, 118 'statistics2' : res2, 119 'statdate' : date 120 }
121 122
123 - def no_measure(self):
124 return { 'statistics' : [{'label' : '', 'quantity' : '0', 'number' : '0'}], 125 'statistics2' : [{'label' : '', 'value' : '---'}], 126 'statdate' : [{'date' : '---' }], 127 }
128 129
130 - def write_data(self):
131 Agent.write_data(self) 132 if self.last_measure is not None: 133 self.table.table_data = self.last_measure.value['statistics'] 134 self.table2.table_data = self.last_measure.value['statistics2'] 135 self.tdate.table_data = self.last_measure.value['statdate']
136
137 - def check_status(self):
138 return self.status
139