zephir.monitor.agents.nut

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

# Source Code for Module zephir.monitor.agents.nut

      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  Surveillance d'un onduleur géré par nut
     11  Nécessite un test préliminaire normalement réalisé dans la conf
     12  """
     13
     14  from zephir.monitor.agentmanager.agent import Agent
     15  from zephir.monitor.agentmanager.data import HTMLData, TableData
     16  from zephir.monitor.agentmanager import status
     17  from twisted.internet.utils import getProcessOutput
     18
     19 -def ze(var):
     20      """ suppression du 0 initial pour l'affichage """
     21      if var.startswith('0'):
     22          return var[1:]
     23      return var
     24
     25  # données tableau 1
     26  cle1 = ['ups.mfr', 'ups.model', 'driver.name', 'driver.parameter.port',
     27          'ups.status', 'battery.charge']
     28  tab1 = {'ups.mfr':'Marque',
     29          'ups.model':'Modèle',
     30          'driver.name':'Driver utilisé',
     31          'driver.parameter.port':'Port utilisé',
     32          'ups.status':"Etat de l'onduleur",
     33          'battery.charge':'Charge batterie'
     34         }
     35  cle2 = ['input.voltage', 'input.voltage.minimum', 'input.voltage.maximum',
     36          'battery.voltage', 'ups.load', 'ups.temperature', 'ups.test.result']
     37  tab2 = {'input.voltage' : 'Tension en entrée',
     38          'input.voltage.minimum' : 'Tension minimale',
     39          'input.voltage.maximum' : 'Tension maximale',
     40          'battery.voltage' : 'Tension batterie',
     41          'ups.load' : "Taux d'occupation de l'onduleur",
     42          'ups.temperature' : "Température de la batterie",
     43          'ups.test.result' : 'Resultat du dernier test',
     44         }
     45
     46
     47 -class Nut(Agent):
     48 -    def __init__(self, name, monitor, **params):
     49          Agent.__init__(self, name, **params)
     50          # monitor : nom de l'onduleur à surveiller (ex : ondul@localhost)
     51          self.monitor = monitor
     52          self.status = status.OK()
     53          self.table = TableData([
     54              ('label', 'Onduleur', {'align':'center'}, None),
     55              ('value', '', {'align':'center'}, None)
     56              ])
     57          self.table2 = TableData([
     58              ('label', 'Informations supplémentaires', {'align':'center'}, None),
     59              ('value', '', {'align':'center'}, None)
     60              ])
     61          title = HTMLData("<h3>Surveillance de l'onduleur : <i>%s</i></h3>" % self.monitor)
     62          title2 = HTMLData("<h3>Données supplémentaires</h3>")
     63          self.data = [title, self.table, title2, self.table2]
     64
     65 -    def measure(self):
     66          self.status = status.OK()
     67
     68          res = getProcessOutput('/bin/upsc',
     69                                 args = [self.monitor],
     70                                 env = {'LC_ALL': 'C'})
     71          res.addCallback(self.measure_process)
     72          res.addErrback(self.error)
     73          return res
     74
     75 -    def measure_process(self, result):
     76          listing = {}
     77          data1 = []
     78          data2 = []
     79          for line in result.splitlines():
     80              data = line.split(':')
     81              if data[0].strip() == 'ups.status':
     82                  ups_status = data[1].strip()
     83              if data[0].strip() == 'battery.charge':
     84                  if float(data[1].strip()) > 100:
     85                      # bug du genre 750 au lieu de 75 !
     86                      data[1] = str(float(data[1])/10)
     87                  ups_charge = data[1].strip()
     88              listing[data[0]] = data[1].strip()
     89          # ETAT (statut != "On Line")
     90          if 'OL' not in ups_status.split(' '):
     91              if float(ups_charge) < 20:
     92                  self.status = status.Error("Charge batterie Faible")
     93              else:
     94                  self.status = status.Warn("Fonctionnement sur batterie")
     95          # réorganisation des données
     96          for var in cle1:
     97              if listing.has_key(var):
     98                  if var == 'battery.charge':
     99                      data1.append({'label':tab1[var], 'value':"%s%%" % listing[var]})
    100                      continue
    101                  data1.append({'label':tab1[var], 'value':listing[var]})
    102          for var in cle2:
    103              if listing.has_key(var):
    104                  if 'voltage' in var:
    105                      data2.append({'label':tab2[var], 'value':"%sV" % listing[var]})
    106                      continue
    107                  if var == 'ups.load':
    108                      data2.append({'label':tab2[var], 'value':"%s%%" % ze(listing[var])})
    109                      continue
    110                  if var == 'ups.temperature':
    111                      data2.append({'label':tab2[var], 'value':"%s°C" % ze(listing[var])})
    112                      continue
    113                  data2.append({'label':tab2[var], 'value':listing[var]})
    114          return { 'statistics' : data1, 'statistics2' : data2}
    115
    116 -    def error(self, result):
    117          self.status = status.Error()
    118          msg = """Echec de la connexion à l'onduleur"""
    119          return { 'statistics' : [{'label':'Erreur', 'value':msg}],
    120                   'statistics2' : [{'label':'Erreur', 'value':msg}]}
    121
    122 -    def write_data(self):
    123          Agent.write_data(self)
    124          if self.last_measure is not None:
    125              self.table.table_data = self.last_measure.value['statistics']
    126              self.table2.table_data = self.last_measure.value['statistics2']
    127
    128 -    def check_status(self):
    129          return self.status
    130