Package zephir :: Package monitor :: Package agents :: Module rvp
[hide private]
[frames] | no frames]

Source Code for Module zephir.monitor.agents.rvp

  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 le test des tunnels 
 11  """ 
 12   
 13  from twisted.python import log 
 14  from twisted.internet.utils import getProcessOutput 
 15  from zephir.monitor.agentmanager.agent import Agent, RRDAgent 
 16  from zephir.monitor.agentmanager.data import HTMLData, TableData 
 17  from zephir.monitor.agentmanager.util import status_to_img 
 18  from zephir.monitor.agentmanager import status 
 19   
 20  import os 
 21   
22 -def parse_ipsec_status(response):
23 """parses ipsec status info 24 response format : 25 ['18:', '"C-amon1-0-sphynx"', 'STATE_QUICK_R2', '(IPsec', 'SA', 'established);', 'EVENT_SA_REPLACE', 'in', '8219s;', 'newest', 'IPSEC;', 'eroute', 'owner'] 26 ['18:', '"C-amon1-0-sphynx"', 'esp.9c0c70fd@192.168.230.59', '(5016', 'bytes,', '519s', 'ago)', 'esp.c4cacef1@192.168.230.49', '(2772', 'bytes,', '519s', 'ago);', 'tunnel'] 27 ['C-amon1-0-sphynx":', '172.16.36.0/24===192.168.230.49[@sphynxNG.agriates.lan]---192.168.230.254...192.168.230.254---192.168.230.59[@amon1]===10.21.10.0/24;', 'erouted;', 'eroute', 'owner:', '#18'] *** si owner = #0 --> tunnel down *** 28 """ 29 response = response.split('\n') 30 tunnels = [] 31 total=up=down=0 32 for line in response: 33 if not line[4:].startswith('#') and line.count('routed') > 0: 34 data = line[4:].split(';') 35 name, adresses = data[0].split(':') 36 src = adresses[:adresses.index('---')] 37 dst = adresses[adresses.rindex('---')+3:] 38 if 'erouted' in [line.strip() for line in data] or 'unrouted' in [line.strip() for line in data]: 39 conn_id = line[line.index('owner:')+6:].strip() 40 if conn_id != '#0': 41 # l'eroute existe (infos à récupérer) 42 status = 'On' 43 up += 1 44 else: 45 status = 'Off' 46 down += 1 47 total += 1 48 tunnels.append({'name':name.replace('"',''), 'src':src, 'dst':dst, 'status':status}) 49 return tunnels, total, up, down
50
51 -class RvpAmon(Agent):
52
53 - def __init__(self, name, 54 **params):
55 Agent.__init__(self, name, **params) 56 self.status = status.Unknown() 57 self.table = TableData([ 58 ('name', "Identifiant", {'align':'left'}, None), 59 ('status', "Etat", {'align':'center'}, status_to_img), 60 ('src', "Source", {'align':'left'}, None), 61 ('dst', "Destination", {'align':'left'}, None), 62 ]) 63 self.data = [self.table] 64 self.measure_data = {}
65
66 - def measure(self):
67 self.status = status.OK() 68 cmd = "/usr/sbin/ipsec" 69 update = getProcessOutput(cmd, ['status']) 70 return update.addCallbacks(self.callback_tunnels, self.errback_tunnels)
71
72 - def callback_tunnels(self,response):
73 tunnels, total, up, down = parse_ipsec_status(response) 74 if down > 0: 75 self.status=status.Error() 76 for data in tunnels: 77 self.measure_data[data['name']] = (data['src'], data['dst'], data['status']) 78 self.measure_data['ok'] = up 79 self.measure_data['bad'] = down 80 return {'statistics':tunnels}
81
82 - def errback_tunnels(self, err):
83 self.status = status.Error("Erreur d'execution : ipsec status") 84 return {'statistics':None}
85
86 - def write_data(self):
87 Agent.write_data(self) 88 if self.last_measure is not None: 89 self.table.table_data = self.last_measure.value['statistics']
90
91 - def check_status(self):
92 return self.status
93
94 -class RvpSphynx(RRDAgent):
95 96 pourcentok = 100 97
98 - def measure(self):
99 self.status = status.OK() 100 cmd = "/usr/sbin/ipsec" 101 update = getProcessOutput(cmd, ['status']) 102 return update.addCallbacks(self.callback_tunnels, self.errback_tunnels)
103
104 - def callback_tunnels(self,response):
105 tunnels, total, up, down = parse_ipsec_status(response) 106 self.measure_data['ok'] = up 107 self.measure_data['bad'] = down 108 if total != 0: 109 self.pourcentok = (100*up)/total 110 else: 111 self.pourcentok = 100 112 return {'ok':up,'bad':down,'total':total,'pourcentok':self.pourcentok}
113
114 - def errback_tunnels(self, err):
115 self.status = status.Error("Erreur d'execution : ipsec status") 116 res = None 117 self.pourcentok = 100 118 return {'statistics':res}
119
120 - def check_status(self):
121 if self.pourcentok < 75: 122 return status.Error("plus de 25% de tunnels en erreur") 123 if self.pourcentok < 95: 124 return status.Warn("plus de 5% de tunnels en erreur") 125 return status.OK()
126