Clean : (Grégory Starck) clean of some getattr code, bis.
[shinken.git] / shinken / modules / merlindb_broker / merlindb_broker.py
blob575f70f74d8a0e59fe3e730d840dbfff68f07a42
1 #!/usr/bin/python
2 #Copyright (C) 2009 Gabes Jean, naparuba@gmail.com
4 #This file is part of Shinken.
6 #Shinken is free software: you can redistribute it and/or modify
7 #it under the terms of the GNU Affero General Public License as published by
8 #the Free Software Foundation, either version 3 of the License, or
9 #(at your option) any later version.
11 #Shinken is distributed in the hope that it will be useful,
12 #but WITHOUT ANY WARRANTY; without even the implied warranty of
13 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 #GNU Affero General Public License for more details.
16 #You should have received a copy of the GNU Affero General Public License
17 #along with Shinken. If not, see <http://www.gnu.org/licenses/>.
20 #This Class is a plugin for the Shinken Broker. It is in charge
21 #to brok information into the merlin database. for the moment
22 #only Mysql is supported. This code is __imported__ from Broker.
23 #The managed_brok function is called by Broker for manage the broks. It calls
24 #the manage_*_brok functions that create queries, and then run queries.
27 import copy
28 import time
30 def get_objs_names(objs):
31 s = ''
32 for o in objs:
33 s += get_obj_name(o)
34 return s
36 def get_obj_name(obj):
37 print "Get name on", obj.get_name()
38 return obj.get_name()
41 def list_to_comma(lst):
42 #For ['d', 'r', 'u'] will return d,r,u
43 return ','.join(lst)
46 #Class for the Merlindb Broker
47 #Get broks and puts them in merlin database
48 class Merlindb_broker:
49 def __init__(self, name, backend, host=None, user=None, password=None, database=None, character_set=None, database_path=None):
50 #Mapping for name of data, rename attributes and transform function
51 self.mapping = {
52 #Program status
53 'program_status' : {'program_start' : {'transform' : None},
54 'pid' : {'transform' : None},
55 'last_alive' : {'transform' : None},
56 'is_running' : { 'transform' : None},
57 'instance_id' : {'transform' : None},
59 #Program status update (every 10s)
60 'update_program_status' : {'program_start' : {'transform' : None},
61 'pid' : {'transform' : None},
62 'last_alive' : {'transform' : None},
63 'is_running' : { 'transform' : None},
64 'instance_id' : {'transform' : None},
66 #Host
67 'initial_host_status' : {
68 'id' : {'transform' : None},
69 'instance_id' : {'transform' : None},
70 'host_name': {'transform' : None},
71 'alias': {'transform' : None},
72 'display_name': {'transform' : None},
73 'address': {'transform' : None},
74 'initial_state': {'transform' : None},
75 'max_check_attempts': {'transform' : None},
76 'check_interval': {'transform' : None},
77 'retry_interval': {'transform' : None},
78 'active_checks_enabled': {'transform' : None},
79 'passive_checks_enabled': {'transform' : None},
80 'obsess_over_host': {'transform' : None},
81 'check_freshness': {'transform' : None},
82 'freshness_threshold': {'transform' : None},
83 'event_handler_enabled': {'transform' : None},
84 'low_flap_threshold': {'transform' : None},
85 'high_flap_threshold': {'transform' : None},
86 'flap_detection_enabled': {'transform' : None},
87 'process_perf_data': {'transform' : None},
88 'notification_interval': {'transform' : None},
89 'first_notification_delay': {'transform' : None},
90 'notifications_enabled': {'transform' : None},
91 'notes': {'transform' : None},
92 'notes_url': {'transform' : None},
93 'action_url': {'transform' : None},
94 'last_chk' : {'transform' : None, 'name' : 'last_check'},
95 'next_chk' : {'transform' : None, 'name' : 'next_check'},
96 'attempt' : {'transform' : None, 'name' : 'current_attempt'},
97 'state_id' : {'transform' : None, 'name' : 'current_state'},
98 'state_type_id' : {'transform' : None, 'name' : 'state_type'},
99 'current_event_id' : {'transform' : None},
100 'last_event_id' : {'transform' : None},
101 'last_state_id' : {'transform' : None, 'name' : 'last_state'},
102 'last_state_change' : {'transform' : None},
103 'last_hard_state_change' : {'transform' : None},
104 'last_hard_state' : {'transform' : None},
105 'is_flapping' : {'transform' : None},
106 'flapping_comment_id' : {'transform' : None},
107 'percent_state_change' : {'transform' : None},
108 'problem_has_been_acknowledged' : {'transform' : None},
109 'acknowledgement_type' : {'transform' : None},
110 'check_type' : {'transform' : None},
111 'has_been_checked' : {'transform' : None},
112 'should_be_scheduled' : {'transform' : None},
113 'last_problem_id' : {'transform' : None},
114 'current_problem_id' : {'transform' : None},
115 'execution_time' : {'transform' : None},
116 'last_notification' : {'transform' : None},
117 'current_notification_number' : {'transform' : None},
118 'current_notification_id' : {'transform' : None},
119 'check_flapping_recovery_notification' : {'transform' : None},
120 'scheduled_downtime_depth' : {'transform' : None},
121 'pending_flex_downtime' : {'transform' : None},
123 'update_host_status' : {
124 'id' : {'transform' : None},
125 'instance_id' : {'transform' : None},
126 'host_name': {'transform' : None},
127 'alias': {'transform' : None},
128 'display_name': {'transform' : None},
129 'address': {'transform' : None},
130 'initial_state': {'transform' : None},
131 'max_check_attempts': {'transform' : None},
132 'check_interval': {'transform' : None},
133 'retry_interval': {'transform' : None},
134 'active_checks_enabled': {'transform' : None},
135 'passive_checks_enabled': {'transform' : None},
136 'obsess_over_host': {'transform' : None},
137 'check_freshness': {'transform' : None},
138 'freshness_threshold': {'transform' : None},
139 'event_handler_enabled': {'transform' : None},
140 'low_flap_threshold': {'transform' : None},
141 'high_flap_threshold': {'transform' : None},
142 'flap_detection_enabled': {'transform' : None},
143 'process_perf_data': {'transform' : None},
144 'notification_interval': {'transform' : None},
145 'first_notification_delay': {'transform' : None},
146 'notifications_enabled': {'transform' : None},
147 'notes': {'transform' : None},
148 'notes_url': {'transform' : None},
149 'action_url': {'transform' : None},
150 'last_chk' : {'transform' : None, 'name' : 'last_check'},
151 'next_chk' : {'transform' : None, 'name' : 'next_check'},
152 'attempt' : {'transform' : None, 'name' : 'current_attempt'},
153 'state_id' : {'transform' : None, 'name' : 'current_state'},
154 'state_type_id' : {'transform' : None, 'name' : 'state_type'},
155 'current_event_id' : {'transform' : None},
156 'last_event_id' : {'transform' : None},
157 'last_state_id' : {'transform' : None, 'name' : 'last_state'},
158 'last_state_change' : {'transform' : None},
159 'last_hard_state_change' : {'transform' : None},
160 'last_hard_state' : {'transform' : None},
161 'is_flapping' : {'transform' : None},
162 'flapping_comment_id' : {'transform' : None},
163 'percent_state_change' : {'transform' : None},
164 'problem_has_been_acknowledged' : {'transform' : None},
165 'acknowledgement_type' : {'transform' : None},
166 'check_type' : {'transform' : None},
167 'has_been_checked' : {'transform' : None},
168 'should_be_scheduled' : {'transform' : None},
169 'last_problem_id' : {'transform' : None},
170 'current_problem_id' : {'transform' : None},
171 'execution_time' : {'transform' : None},
172 'last_notification' : {'transform' : None},
173 'current_notification_number' : {'transform' : None},
174 'current_notification_id' : {'transform' : None},
175 'check_flapping_recovery_notification' : {'transform' : None},
176 'scheduled_downtime_depth' : {'transform' : None},
177 'pending_flex_downtime' : {'transform' : None},
179 'host_check_result' : {
180 'latency' : {'transform' : None},
181 'last_time_unreachable' : {'transform' : None},
182 'attempt' : {'transform' : None, 'name' : 'current_attempt'},
183 'check_type' : {'transform' : None},
184 'state_type_id' : {'transform' : None, 'name' : 'state_type'},
185 'execution_time' : {'transform' : None},
186 'start_time' : {'transform' : None},
187 'acknowledgement_type' : {'transform' : None},
188 'return_code' : {'transform' : None},
189 'last_time_down' : {'transform' : None},
190 'instance_id' : {'transform' : None},
191 'long_output' : {'transform' : None},
192 'end_time' : {'transform' : None},
193 'last_chk' : {'transform' : None, 'name' : 'last_check'},
194 'timeout' : {'transform' : None},
195 'output' : {'transform' : None},
196 'state_id' : {'transform' : None, 'name' : 'current_state'},
197 'last_time_up' : {'transform' : None},
198 'early_timeout' : {'transform' : None},
199 'perf_data' : {'transform' : None},
200 'host_name' : {'transform' : None},
202 'host_next_schedule' : {
203 'instance_id' : {'transform' : None},
204 'next_chk' : {'transform' : None, 'name' : 'next_check'},
205 'host_name' : {'transform' : None},
207 #Service
208 'initial_service_status' : {
209 'id' : {'transform' : None},
210 'instance_id' : {'transform' : None},
211 'host_name' : {'transform' : None},
212 'service_description' : {'transform' : None},
213 'display_name' : {'transform' : None},
214 'is_volatile' : {'transform' : None},
215 'initial_state' : {'transform' : None},
216 'max_check_attempts' : {'transform' : None},
217 'check_interval' : {'transform' : None},
218 'retry_interval' : {'transform' : None},
219 'active_checks_enabled' : {'transform' : None},
220 'passive_checks_enabled' : {'transform' : None},
221 'obsess_over_service' : {'transform' : None},
222 'check_freshness' : {'transform' : None},
223 'freshness_threshold' : {'transform' : None},
224 'event_handler_enabled' : {'transform' : None},
225 'low_flap_threshold' : {'transform' : None},
226 'high_flap_threshold' : {'transform' : None},
227 'flap_detection_enabled' : {'transform' : None},
228 'process_perf_data' : {'transform' : None},
229 'notification_interval' : {'transform' : None},
230 'first_notification_delay' : {'transform' : None},
231 'notifications_enabled' : {'transform' : None},
232 'notes' : {'transform' : None},
233 'notes_url' : {'transform' : None},
234 'action_url' : {'transform' : None},
235 'last_chk' : {'transform' : None, 'name' : 'last_check'},
236 'next_chk' : {'transform' : None, 'name' : 'next_check'},
237 'attempt' : {'transform' : None, 'name' : 'current_attempt'},
238 'state_id' : {'transform' : None, 'name' : 'current_state'},
239 'current_event_id' : {'transform' : None},
240 'last_event_id' : {'transform' : None},
241 'last_state_id' : {'transform' : None, 'name' : 'last_state'},
242 'last_state_change' : {'transform' : None},
243 'last_hard_state_change' : {'transform' : None},
244 'last_hard_state' : {'transform' : None},
245 'state_type_id' : {'transform' : None, 'name' : 'state_type'},
246 'is_flapping' : {'transform' : None},
247 'flapping_comment_id' : {'transform' : None},
248 'percent_state_change' : {'transform' : None},
249 'problem_has_been_acknowledged' : {'transform' : None},
250 'acknowledgement_type' : {'transform' : None},
251 'check_type' : {'transform' : None},
252 'has_been_checked' : {'transform' : None},
253 'should_be_scheduled' : {'transform' : None},
254 'last_problem_id' : {'transform' : None},
255 'current_problem_id' : {'transform' : None},
256 'execution_time' : {'transform' : None},
257 'last_notification' : {'transform' : None},
258 'current_notification_number' : {'transform' : None},
259 'current_notification_id' : {'transform' : None},
260 'check_flapping_recovery_notification' : {'transform' : None},
261 'scheduled_downtime_depth' : {'transform' : None},
262 'pending_flex_downtime' : {'transform' : None},
264 'update_service_status' : {
265 'id' : {'transform' : None},
266 'instance_id' : {'transform' : None},
267 'host_name' : {'transform' : None},
268 'service_description' : {'transform' : None},
269 'display_name' : {'transform' : None},
270 'is_volatile' : {'transform' : None},
271 'initial_state' : {'transform' : None},
272 'max_check_attempts' : {'transform' : None},
273 'check_interval' : {'transform' : None},
274 'retry_interval' : {'transform' : None},
275 'active_checks_enabled' : {'transform' : None},
276 'passive_checks_enabled' : {'transform' : None},
277 'obsess_over_service' : {'transform' : None},
278 'check_freshness' : {'transform' : None},
279 'freshness_threshold' : {'transform' : None},
280 'event_handler_enabled' : {'transform' : None},
281 'low_flap_threshold' : {'transform' : None},
282 'high_flap_threshold' : {'transform' : None},
283 'flap_detection_enabled' : {'transform' : None},
284 'process_perf_data' : {'transform' : None},
285 'notification_interval' : {'transform' : None},
286 'first_notification_delay' : {'transform' : None},
287 'notifications_enabled' : {'transform' : None},
288 'notes' : {'transform' : None},
289 'notes_url' : {'transform' : None},
290 'action_url' : {'transform' : None},
291 'last_chk' : {'transform' : None, 'name' : 'last_check'},
292 'next_chk' : {'transform' : None, 'name' : 'next_check'},
293 'attempt' : {'transform' : None, 'name' : 'current_attempt'},
294 'state_id' : {'transform' : None, 'name' : 'current_state'},
295 'current_event_id' : {'transform' : None},
296 'last_event_id' : {'transform' : None},
297 'last_state_id' : {'transform' : None, 'name' : 'last_state'},
298 'last_state_change' : {'transform' : None},
299 'last_hard_state_change' : {'transform' : None},
300 'last_hard_state' : {'transform' : None},
301 'state_type_id' : {'transform' : None, 'name' : 'current_state'},
302 'is_flapping' : {'transform' : None},
303 'flapping_comment_id' : {'transform' : None},
304 'percent_state_change' : {'transform' : None},
305 'problem_has_been_acknowledged' : {'transform' : None},
306 'acknowledgement_type' : {'transform' : None},
307 'check_type' : {'transform' : None},
308 'has_been_checked' : {'transform' : None},
309 'should_be_scheduled' : {'transform' : None},
310 'last_problem_id' : {'transform' : None},
311 'current_problem_id' : {'transform' : None},
312 'execution_time' : {'transform' : None},
313 'last_notification' : {'transform' : None},
314 'current_notification_number' : {'transform' : None},
315 'current_notification_id' : {'transform' : None},
316 'check_flapping_recovery_notification' : {'transform' : None},
317 'scheduled_downtime_depth' : {'transform' : None},
318 'pending_flex_downtime' : {'transform' : None},
320 'service_check_result' : {
321 'check_type' : {'transform' : None},
322 'last_time_critical': {'transform' : None},
323 'last_time_warning' : {'transform' : None},
324 'latency' : {'transform' : None},
325 'last_chk' : {'transform' : None, 'name' : 'last_check'},
326 'last_time_ok' : {'transform' : None},
327 'end_time' : {'transform' : None},
328 'last_time_unknown' : {'transform' : None},
329 'execution_time' : {'transform' : None},
330 'start_time' : {'transform' : None},
331 'return_code' : {'transform' : None},
332 'output' : {'transform' : None},
333 'service_description' : {'transform' : None},
334 'early_timeout' : {'transform' : None},
335 'attempt' : {'transform' : None, 'name' : 'current_attempt'},
336 'state_type_id' : {'transform' : None, 'name' : 'state_type'},
337 'acknowledgement_type' : {'transform' : None},
338 'instance_id' : {'transform' : None},
339 'long_output' : {'transform' : None},
340 'host_name' : {'transform' : None},
341 'timeout' : {'transform' : None},
342 'state_id' : {'transform' : None, 'name' : 'current_state'},
343 'perf_data' : {'transform' : None},
345 'service_next_schedule' : {
346 'next_chk' : {'transform' : None, 'name' : 'next_check'},
347 'service_description' : {'transform' : None},
348 'instance_id' : {'transform' : None},
349 'host_name' : {'transform' : None},
352 #Contact
353 'initial_contact_status' : {
354 'service_notifications_enabled' : {'transform' : None},
355 'can_submit_commands' : {'transform' : None},
356 'contact_name' : {'transform' : None},
357 'id' : {'transform' : None},
358 'retain_status_information' : {'transform' : None},
359 'address1' : {'transform' : None},
360 'address2' : {'transform' : None},
361 'address3' : {'transform' : None},
362 'address4' : {'transform' : None},
363 'address5' : {'transform' : None},
364 'address6' : {'transform' : None},
365 'service_notification_commands' : {'transform' : get_objs_names},
366 'pager' : {'transform' : None},
367 'host_notification_period' : {'transform' : get_obj_name},
368 'host_notifications_enabled' : {'transform' : None},
369 'host_notification_commands' : {'transform' : get_objs_names},
370 'service_notification_period' : {'transform' : get_obj_name},
371 'email' : {'transform' : None},
372 'alias' : {'transform' : None},
373 'host_notification_options' : {'transform' : list_to_comma},
374 'service_notification_options' : {'transform' : list_to_comma},
376 #Contact group
377 'initial_contactgroup_status' : {
378 'contactgroup_name' : {'transform' : None},
379 'alias': {'transform' : None},
380 'instance_id' : {'transform' : None},
381 'id' : {'transform' : None},
382 'members' : {'transform' : None},
384 #Host group
385 'initial_hostgroup_status' : {
386 'hostgroup_name' : {'transform' : None},
387 'notes' : {'transform' : None},
388 'instance_id': {'transform' : None},
389 'action_url' : {'transform' : None},
390 'notes_url' : {'transform' : None},
391 'members' : {'transform' : None},
392 'id' : {'transform' : None},
396 self.name = name
397 self.backend = backend
398 self.host = host
399 self.user = user
400 self.password = password
401 self.database = database
402 self.character_set = character_set
403 self.database_path = database_path
406 #Now get a backend_db of our backend type
407 if backend == 'mysql':
408 # from mysql_backend import Mysql_backend
409 from shinken.db_mysql import DBMysql
410 print "Creating a mysql backend"
411 self.db_backend = DBMysql(host, user, password, database, character_set)
413 if backend == 'sqlite':
414 # from sqlite_backend import Sqlite_backend
415 from shinken.db_sqlite import DBSqlite
416 print "Creating a sqlite backend"
417 self.db_backend = DBSqlite(self.database_path)
420 def get_name(self):
421 return self.name
424 def preprocess(self, type, brok):
425 new_brok = copy.deepcopy(brok)
426 #Only preprocess if we can apply a mapping
427 if type in self.mapping:
428 to_del = []
429 to_add = []
430 mapping = self.mapping[brok.type]
431 for prop in new_brok.data:
432 #ex : 'name' : 'program_start_time', 'transform'
433 if prop in mapping:
434 #print "Got a prop to change", prop
435 val = brok.data[prop]
436 if mapping[prop]['transform'] != None:
437 print "Call function for", type, prop
438 f = mapping[prop]['transform']
439 val = f(val)
440 name = prop
441 if 'name' in mapping[prop]:
442 name = mapping[prop]['name']
443 to_add.append((name, val))
444 to_del.append(prop)
445 else:
446 to_del.append(prop)
447 for prop in to_del:
448 del new_brok.data[prop]
449 for (name, val) in to_add:
450 new_brok.data[name] = val
451 else:
452 print "No preprocess type", brok.type
453 print brok.data
454 return new_brok
457 #Called by Broker so we can do init stuff
458 #TODO : add conf param to get pass with init
459 #Conf from arbiter!
460 def init(self):
461 print "I connect to Merlin database"
462 self.db_backend.connect_database()
465 #Get a brok, parse it, and put in in database
466 #We call functions like manage_ TYPEOFBROK _brok that return us queries
467 def manage_brok(self, b):
468 type = b.type
469 manager = 'manage_'+type+'_brok'
470 #print "(Merlin) I search manager:", manager
471 if hasattr(self, manager):
472 new_b = self.preprocess(type, b)
473 f = getattr(self, manager)
474 queries = f(new_b)
475 #Ok, we've got queries, now : run them!
476 for q in queries :
477 self.db_backend.execute_query(q)
478 return
482 #Ok, we are at launch and a scheduler want him only, OK...
483 #So ca create several queries with all tables we need to delete with
484 #our instance_id
485 #This brob must be send at the begining of a scheduler session,
486 #if not, BAD THINGS MAY HAPPENED :)
487 def manage_clean_all_my_instance_id_brok(self, b):
488 instance_id = b.data['instance_id']
489 tables = ['command', 'comment', 'contact', 'contactgroup', 'downtime', 'host',
490 'hostdependency', 'hostescalation', 'hostgroup', 'notification', 'program_status',
491 'scheduled_downtime', 'service', 'serviceescalation',
492 'servicegroup', 'timeperiod']
493 res = []
494 for table in tables:
495 q = "DELETE FROM %s WHERE instance_id = '%s' " % (table, instance_id)
496 res.append(q)
497 return res
500 #Program status is .. status of program? :)
501 #Like pid, daemon mode, last activity, etc
502 #We aleady clean database, so insert
503 def manage_program_status_brok(self, b):
504 instance_id = b.data['instance_id']
505 del_query = "DELETE FROM program_status WHERE instance_id = '%s' " % instance_id
506 query = self.db_backend.create_insert_query('program_status', b.data)
507 return [del_query,query]
510 #Program status is .. status of program? :)
511 #Like pid, daemon mode, last activity, etc
512 #We aleady clean database, so insert
513 def manage_update_program_status_brok(self, b):
514 instance_id = b.data['instance_id']
515 del_query = "DELETE FROM program_status WHERE instance_id = '%s' " % instance_id
516 query = self.db_backend.create_insert_query('program_status', b.data)
517 return [del_query,query]
520 #Initial service status is at start. We need an insert because we
521 #clean the base
522 def manage_initial_service_status_brok(self, b):
523 b.data['last_update'] = time.time()
524 #It's a initial entry, so we need insert
525 query = self.db_backend.create_insert_query('service', b.data)
526 return [query]
529 #A service check have just arrived, we UPDATE data info with this
530 def manage_service_check_result_brok(self, b):
531 data = b.data
532 b.data['last_update'] = time.time()
533 #We just impact the service :)
534 where_clause = {'host_name' : data['host_name'] , 'service_description' : data['service_description']}
535 query = self.db_backend.create_update_query('service', data, where_clause)
536 return [query]
539 #A new service schedule have just arrived, we UPDATE data info with this
540 def manage_service_next_schedule_brok(self, b):
541 data = b.data
542 #We just impact the service :)
543 where_clause = {'host_name' : data['host_name'] , 'service_description' : data['service_description']}
544 query = self.db_backend.create_update_query('service', data, where_clause)
545 return [query]
549 #A full service status? Ok, update data
550 def manage_update_service_status_brok(self, b):
551 data = b.data
552 b.data['last_update'] = time.time()
553 where_clause = {'host_name' : data['host_name'] , 'service_description' : data['service_description']}
554 query = self.db_backend.create_update_query('service', data, where_clause)
555 return [query]
558 #A host have just be create, database is clean, we INSERT it
559 def manage_initial_host_status_brok(self, b):
560 b.data['last_update'] = time.time()
561 query = self.db_backend.create_insert_query('host', b.data)
562 return [query]
565 #A new host group? Insert it
566 #We need to do something for the members prop (host.id, host_name)
567 #They are for host_hostgroup table, with just host.id hostgroup.id
568 def manage_initial_hostgroup_status_brok(self, b):
569 data = b.data
571 #Here we've got a special case : in data, there is members
572 #and we do not want it in the INSERT query, so we crate a
573 #tmp_data without it
574 tmp_data = copy.copy(data)
575 del tmp_data['members']
576 query = self.db_backend.create_insert_query('hostgroup', tmp_data)
577 res = [query]
579 #Ok, the hostgroup table is uptodate, now we add relations
580 #between hosts and hostgroups
581 for (h_id, h_name) in b.data['members']:
582 #First clean
583 q_del = "DELETE FROM host_hostgroup WHERE host = '%s' and hostgroup='%s'" % (h_id, b.data['id'])
584 res.append(q_del)
585 #Then add
586 q = "INSERT INTO host_hostgroup (host, hostgroup) VALUES ('%s', '%s')" % (h_id, b.data['id'])
587 res.append(q)
588 return res
591 #same from hostgroup, but with servicegroup
592 def manage_initial_servicegroup_status_brok(self, b):
593 data = b.data
595 #Here we've got a special case : in data, there is members
596 #and we do not want it in the INSERT query, so we create a
597 #tmp_data without it
598 tmp_data = copy.copy(data)
599 del tmp_data['members']
600 query = self.db_backend.create_insert_query('servicegroup', tmp_data)
601 res = [query]
603 #Now the members part
604 for (s_id, s_name) in b.data['members']:
605 #first clean
606 q_del = "DELETE FROM service_servicegroup WHERE service='%s' and servicegroup='%s'" % (s_id, b.data['id'])
607 res.append(q_del)
608 #Then add
609 q = "INSERT INTO service_servicegroup (service, servicegroup) VALUES ('%s', '%s')" % (s_id, b.data['id'])
610 res.append(q)
611 return res
614 #Same than service result, but for host result
615 def manage_host_check_result_brok(self, b):
616 b.data['last_update'] = time.time()
617 data = b.data
618 #Only the host is impacted
619 where_clause = {'host_name' : data['host_name']}
620 query = self.db_backend.create_update_query('host', data, where_clause)
621 return [query]
624 #Same than service result, but for host new scheduling
625 def manage_host_next_schedule_brok(self, b):
626 data = b.data
627 #Only the host is impacted
628 where_clause = {'host_name' : data['host_name']}
629 query = self.db_backend.create_update_query('host', data, where_clause)
630 return [query]
633 #Ok the host is updated
634 def manage_update_host_status_brok(self, b):
635 b.data['last_update'] = time.time()
636 data = b.data
637 #Only this host
638 where_clause = {'host_name' : data['host_name']}
639 query = self.db_backend.create_update_query('host', data, where_clause)
640 return [query]
643 #A contact have just be created, database is clean, we INSERT it
644 def manage_initial_contact_status_brok(self, b):
645 query = self.db_backend.create_insert_query('contact', b.data)
646 return [query]
649 #same from hostgroup, but with servicegroup
650 def manage_initial_contactgroup_status_brok(self, b):
651 data = b.data
653 #Here we've got a special case : in data, there is members
654 #and we do not want it in the INSERT query, so we create a
655 #tmp_data without it
656 tmp_data = copy.copy(data)
657 del tmp_data['members']
658 query = self.db_backend.create_insert_query('contactgroup', tmp_data)
659 res = [query]
661 #Now the members part
662 for (c_id, c_name) in b.data['members']:
663 #first clean
664 q_del = "DELETE FROM contact_contactgroup WHERE contact='%s' and contactgroup='%s'" % (c_id, b.data['id'])
665 res.append(q_del)
666 #Then add
667 q = "INSERT INTO contact_contactgroup (contact, contactgroup) VALUES ('%s', '%s')" % (c_id, b.data['id'])
668 res.append(q)
669 return res
671 #A notification have just be created, we INSERT it
672 def manage_notification_raise_brok(self, b):
673 query = self.db_backend.create_insert_query('notification', b.data)
674 return [query]