2 # Copyright (C) 2009-2010 :
3 # Gabes Jean, naparuba@gmail.com
4 # Gerhard Lausser, Gerhard.Lausser@consol.de
6 # This file is part of Shinken.
8 # Shinken is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU Affero General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
13 # Shinken is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU Affero General Public License for more details.
18 # You should have received a copy of the GNU Affero General Public License
19 # along with Shinken. If not, see <http://www.gnu.org/licenses/>.
23 Here is a node class for dependency_node(s) and a factory to create them
28 #pat = "(h1;db | h2;db | h3;db) & (h4;Apache & h5;Apache & h6;Apache) & (h7;lvs | h8;lvs)"
29 #pat2 = "h1;db | h2;db"
30 #pat3 = "(h1;db | h2;db | h3;db) & (h4;Apache & h5;Apache)"
31 #pat4 = "2 of: h1;db | h2;db | h3;db"
33 class DependencyNode(object):
40 return "Op:'%s' Val:'%s' Sons:'[%s]'" % (self
.operand
, self
.of_values
, ','.join([str(s
) for s
in self
.sons
]))
43 # We will get the state of this node, by looking at the state of
44 # our sons, and apply our operand
46 print "Ask state of me", self
48 # If we are a host or a service, wee just got the host/service
50 if self
.operand
in ['host', 'service']:
51 state
= self
.sons
[0].last_hard_state_id
52 print "Get the hard state (%s) for the object %s" % (state
, self
.sons
[0].get_name())
53 # Make DOWN look as CRITICAL (2 instead of 1)
54 if self
.operand
== 'host' and state
== 1:
58 # First we get teh state of all our sons
64 # We will surely need the worse state
65 worse_state
= max(states
)
67 # We look for the better state but not OK/UP
68 no_ok
= [s
for s
in states
if s
!= 0]
70 better_no_good
= min(no_ok
)
72 # Now look at the rule. For a or
73 if self
.operand
== '|':
75 print "We find a OK/UP match in an OR", states
77 # no ok/UP-> return worse state
79 print "I send the better no good state...in an OR", better_no_good
, states
82 # With an AND, we just send the worse state
83 if self
.operand
== '&':
84 print "We raise worse state for a AND", worse_state
,states
87 # Ok we've got a 'of:' rule
88 nb_search
= self
.of_values
89 # Look if we've got enouth 0
90 if len([s
for s
in states
if s
== 0]) >= nb_search
:
91 print "Good, we find at least %d 0 in states for a of:" % nb_search
, states
94 # Now maybe at least enouth WARNING, still beter than CRITICAL...
95 if len([s
for s
in states
if s
== 1]) >= nb_search
:
96 print "Beter than nothing, we find at least %d 1 in states for a of:" % nb_search
, states
99 # Sic... not good, return 2
100 print "ARG, not enough 1 or 0, return 2..."
104 #return a list of all host/service in our node and below
105 def list_all_elements(self
):
108 #We are a host/service
109 if self
.operand
in ['host', 'service']:
110 return [self
.sons
[0]]
113 r
.extend(s
.list_all_elements())
120 class DependencyNodeFactory(object):
124 # the () will be eval in a recursiv way, only one level of ()
125 def eval_cor_patern(self
, patern
, hosts
, services
):
126 patern
= patern
.strip()
127 print "*****Loop", patern
130 # Look if it's a complex patern (with rule) or
131 # if it's a leef ofit, like a host/service
138 node
= DependencyNode()
139 p
= "^(\d+) *of: *(.+)"
143 print "Match the of: thing N=", m
.groups()
145 node
.of_values
= int(m
.groups()[0])
146 patern
= m
.groups()[1]
148 print "Is so complex?", patern
, complex_node
150 # if it's a single host/service
152 print "Try to find?", patern
153 node
.operand
= 'object'
154 obj
= self
.find_object(patern
, hosts
, services
)
156 # Set host or service
157 node
.operand
= obj
.__class
__.my_type
158 node
.sons
.append(obj
)
170 o
= self
.eval_cor_patern(tmp
, hosts
, services
)
171 print "1( I've %s got new sons" % patern
, o
178 print "Evaling sub pat", tmp
179 o
= self
.eval_cor_patern(tmp
, hosts
, services
)
180 print "2) I've %s got new sons" % patern
, o
183 print "Fuck a node son!"
189 current_rule
= node
.operand
190 print "Current rule", current_rule
191 if current_rule
!= None and current_rule
!= 'of:' and c
!= current_rule
:
192 print "Fuck, you mix all dumbass!"
194 if current_rule
!= 'of:':
198 o
= self
.eval_cor_patern(tmp
, hosts
, services
)
199 print "3&| I've %s got new sons" % patern
, o
210 o
= self
.eval_cor_patern(tmp
, hosts
, services
)
211 print "4end I've %s got new sons" % patern
, o
214 print "End, tmp", tmp
215 print "R %s :" % patern
, node
219 # We've got an object, like h1,db1 that mean the
220 # db1 service of the host db1, or just h1, that mean
222 def find_object(self
, patern
, hosts
, services
):
223 print "Finding object", patern
225 # h_name, service_desc are , separated
226 elts
= patern
.split(',')
228 # Look if we have a service
231 service_description
= elts
[1]
233 obj
= services
.find_srv_by_name_and_hostname(host_name
, service_description
)
234 print "Find service", obj
.get_name()
237 obj
= hosts
.find_by_name(host_name
)
238 print "Find host", obj
.get_name()