/** * Prints a event description into the given buffer. * @param E Event object * @param B StringBuffer object */ static void status_event(Event_T E, StringBuffer_T B) { struct timeval *tv = Event_get_collected(E); StringBuffer_append(B, "<event>" "<collected_sec>%ld</collected_sec>" "<collected_usec>%ld</collected_usec>" "<service>%s</service>" "<type>%d</type>" "<id>%ld</id>" "<state>%d</state>" "<action>%d</action>" "<message><![CDATA[%s]]></message>", tv->tv_sec, (long)tv->tv_usec, Event_get_id(E) == Event_Instance ? "Monit" : Event_get_source_name(E), Event_get_source_type(E), Event_get_id(E), Event_get_state(E), Event_get_action(E), Event_get_message(E)); Service_T s = Event_get_source(E); if (s && s->token) StringBuffer_append(B, "<token>%s</token>", s->token); StringBuffer_append(B, "</event>"); }
/** * Notify registred users about the event * @param E An Event object * @return If failed, return HANDLER_ALERT flag or HANDLER_SUCCEEDED if succeeded */ int handle_alert(Event_T E) { Service_T s; int rv = HANDLER_SUCCEEDED; ASSERT(E); s= Event_get_source(E); if(!s) { LogError("Aborting alert\n"); return rv; } if(s->maillist || Run.maillist) { Mail_T m; Mail_T n; Mail_T list= NULL; /* * Build a mail-list with local recipients that has registered interest * for this event. */ for(m= s->maillist; m; m= m->next) { if( /* particular event notification type is allowed for given recipient */ IS_EVENT_SET(m->events, Event_get_id(E)) && ( /* state change notification is sent always */ E->state_changed || /* in the case that the state is failed for more cycles we check * whether we should send the reminder */ (E->state && m->reminder && E->count % m->reminder == 0) ) ) { Mail_T tmp= NULL; NEW(tmp); copy_mail(tmp, m); substitute(&tmp, E); replace_bare_linefeed(&tmp); tmp->next= list; list= tmp; DEBUG("%s notification is sent to %s\n", Event_get_description(E), m->to); } } /* * Build a mail-list with global recipients that has registered interest * for this event. Recipients which are defined in the service localy * overrides the same recipient events which are registered globaly. */ for(m= Run.maillist; m; m= m->next) { int skip= FALSE; for(n= s->maillist; n; n= n->next) { if(IS(m->to, n->to)) { skip= TRUE; break; } } if( /* the local service alert definition has not overrided the global one */ !skip && /* particular event notification type is allowed for given recipient */ IS_EVENT_SET(m->events, Event_get_id(E)) && ( /* state change notification is sent always */ E->state_changed || /* in the case that the state is failed for more cycles we check * whether we should send the reminder */ (E->state && m->reminder && E->count % m->reminder == 0) ) ) { Mail_T tmp= NULL; NEW(tmp); copy_mail(tmp, m); substitute(&tmp, E); replace_bare_linefeed(&tmp); tmp->next= list; list= tmp; DEBUG("%s notification is sent to %s\n", Event_get_description(E), m->to); } } if(list) { if(!sendmail(list)) rv = HANDLER_ALERT; gc_mail_list(&list); } } return rv; }