1
2
3
4
5
6
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
20 """ suppression du 0 initial pour l'affichage """
21 if var.startswith('0'):
22 return var[1:]
23 return var
24
25
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
48 - def __init__(self, name, monitor, **params):
49 Agent.__init__(self, name, **params)
50
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
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
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
86 data[1] = str(float(data[1])/10)
87 ups_charge = data[1].strip()
88 listing[data[0]] = data[1].strip()
89
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
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
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
130