zephir.monitor.agents.eximstats

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