def get_trigger_result(self): """ Get return code from trigger calculator """ errors = { 'unknown': 3, 'critical': 2, 'warning': 1, 'ok': 0, } try: for error_name in ['critical', 'warning']: error_code = errors[error_name] for trigger_name, trigger in self.triggers.items(): rpn_list = [] if error_name in trigger: for el in trigger[error_name]: # function ? tmp = el.split(".") if len(tmp) > 1: # detect oid with function ds, fct = tmp if self.oids[ds].value is None: return int(trigger['default_status']) fct, args = fct.split("(") if hasattr(self.oids[ds], fct): if args == ')': value = getattr(self.oids[ds], fct)() else: args = args[:-1] args = args.split(",") value = getattr(self.oids[ds], fct)(**args) else: logger.error( "[SnmpBooster] Trigger function not " "found: %s" % fct) # return UNKNOW return 3 elif el in self.oids: # detect oid value = self.oids[ds].value else: value = el rpn_list.append(value) error = rpn_calculator(rpn_list) if error: return error_code return errors['ok'] except Exception, e: logger.error("[SnmpBooster] Get Trigger error: %s" % str(e)) return int(trigger['default_status'])
def get_trigger_result(self): """ Get return code from trigger calculator """ errors = {'unknown': 3, 'critical': 2, 'warning': 1, 'ok': 0, } try: for error_name in ['critical', 'warning']: error_code = errors[error_name] for trigger_name, trigger in self.triggers.items(): rpn_list = [] if error_name in trigger: for el in trigger[error_name]: # function ? tmp = el.split(".") if len(tmp) > 1: # detect oid with function ds, fct = tmp if self.oids[ds].value is None: return int(trigger['default_status']) fct, args = fct.split("(") if hasattr(self.oids[ds], fct): if args == ')': value = getattr(self.oids[ds], fct)() else: args = args[:-1] args = args.split(",") value = getattr(self.oids[ds], fct)(**args) else: logger.error("[SnmpBooster] Trigger function not " "found: %s" % fct) # return UNKNOW return 3 elif el in self.oids: # detect oid value = self.oids[ds].value else: value = el rpn_list.append(value) error = rpn_calculator(rpn_list) if error: return error_code return errors['ok'] except Exception, e: logger.error("[SnmpBooster] Get Trigger error: %s" % str(e)) return int(trigger['default_status'])
def get_trigger_result(service): """ Get return code from trigger calculator return error_message, exit_code :error_message: is None if there no error :exit_code: 0, 1, 2 or 3 """ errors = {'unknown': 3, 'critical': 2, 'warning': 1, 'ok': 0, } try: # First we launch critical triggers for each datasource # If one is true, then we are in critical # Second we launch warning triggers for each datasource # If one is true, then we are in waring # Third we launch unknown triggers for each datasource # If one is true, then we are in unknown for error_name in ['critical', 'warning', 'unknown']: # Browse all triggers for trigger in service['triggers'].values(): rpn_list = [] if error_name in trigger: # Check if the trigger is set for this state if trigger[error_name] is None: # Trigger not set for this state (warning or critical) continue # If yes we will try to evaluate it for element in trigger[error_name]: tmp = element.split(".") if len(tmp) > 1: # detect ds_name with function ds_name, fct = tmp # Check if ds_name is define in the service ds_data = service['ds'].get(ds_name) if ds_data is None: error_message = ("DS %s not found to compute " "the trigger (%s). Please " "check your datasource " "file." % (ds_name, trigger)) logger.error("[SnmpBooster] [code 0701] " "[%s, %s] " "%s" % (service['host'], service['service'], error_message)) return (error_message, int(trigger['default_status'])) # Check if the ds_name have a computed value if ds_data.get('ds_oid_value_computed', None) is None: # No computed value found # Check if we have a raw value if ds_data.get('ds_oid_value') is None: # No raw value found error_message = ("No data found for " "DS: '%s'" % ds_name) logger.warning("[SnmpBooster] [code 0702]" " [%s, %s] " "%s" % (service['host'], service['service'], error_message)) else: # Raw value found error_message = ("No computed data found " "for DS: '%s'" % ds_name) logger.warning("[SnmpBooster] [code 0703] " "[%s, %s] " "%s" % (service['host'], service['service'], error_message)) return (error_message, int(trigger['default_status'])) # Prepare trigger function func, args = fct.split("(") # Check if trigger function exists if func in RPN_FUNCTIONS: try: if args == ')': # Launch trigger function # without argument value = RPN_FUNCTIONS[func](ds_data) else: # Launch trigger function # with arguments args = args[:-1] args = args.split(",") value = RPN_FUNCTIONS[func](ds_data, *args) except Exception as exp: logger.error("[SnmpBooster] [code 0704] " "[%s, %s] Trigger function " "error: found: " "%s" % (service['host'], service['service'], str(exp))) return (str(exp), int(trigger['default_status'])) else: # Trigger function doesn't exist error_message = ("Trigger function '%s' not " "found" % fct) logger.error("[SnmpBooster] [code 0705] " "[%s, %s] " "%s" % (service['host'], service['service'], error_message)) return (error_message, int(trigger['default_status'])) elif element in service['ds']: # Element is a ds_name, # sowe go get value in ds_data value = service['ds'][element].get('ds_oid_value_computed', None) if value is None: # The computed value is not here yet error_message = ("No data found for DS: " "'%s'" % element) logger.warning("[SnmpBooster] [code 0706] " "[%s, %s] " "%s" % (service['host'], service['service'], error_message)) return (error_message, int(trigger['default_status'])) else: # element is already a value value = element rpn_list.append(value) # Launch rpn calculator try: ret = rpn_calculator(rpn_list) except Exception as exp: error_message = ("RPN calculation Error: %s - " "%s" % (str(exp), str(rpn_list))) logger.error("[SnmpBooster] [code 0707] [%s, %s] " "%s" % (service['host'], service['service'], error_message)) return (error_message, int(trigger['default_status'])) # rpn_calcultor return True # So the trigger triggered if ret is True: logger.info("[SnmpBooster] [code 0708] [%s, %s] " "trigger triggered " "%s" % (service['host'], service['service'], str(rpn_list))) return None, errors[error_name] # Neither critical trigger, neither warning trigger triggered # So the trigger return OK ! return None, errors['ok'] except Exception as exp: # Handle all other errors error_message = "Trigger error: %s" % (str(exp)) logger.error("[SnmpBooster] [code 0709] [%s, %s] " "%s" % (service['host'], service['service'], error_message)) return error_message, int(trigger['default_status'])
def calculation(self, value): """ Get result from self.calc """ return rpn_calculator([value, ] + self.calc)
def calculation(self, value): """ Get result from self.calc """ return rpn_calculator([ value, ] + self.calc)