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