/** * Post event or status data message to mmonit * @param E An event object or NULL for status data * @return If failed, return HANDLER_MMONIT flag or HANDLER_SUCCEEDED flag if succeeded */ int handle_mmonit(Event_T E) { int rv = HANDLER_MMONIT; Socket_T socket = NULL; Mmonit_T C = Run.mmonits; /* The event is sent to mmonit just once - only in the case that the state changed */ if (! C || (E && ! E->state_changed)) return HANDLER_SUCCEEDED; StringBuffer_T sb = StringBuffer_create(256); for (; C; C = C->next) { if (! (socket = socket_create_t(C->url->hostname, C->url->port, SOCKET_TCP, C->ssl, C->timeout))) { LogError("M/Monit: cannot open a connection to %s -- %s\n", C->url->url, STRERROR); goto error; } status_xml(sb, E, E ? LEVEL_SUMMARY : LEVEL_FULL, 2, socket_get_local_host(socket)); if (! data_send(socket, C, StringBuffer_toString(sb))) { LogError("M/Monit: cannot send %s message to %s\n", E ? "event" : "status", C->url->url); goto error; } StringBuffer_clear(sb); socket_shutdown_write(socket); if (! data_check(socket, C)) { LogError("M/Monit: %s message to %s failed\n", E ? "event" : "status", C->url->url); goto error; } rv = HANDLER_SUCCEEDED; // Return success if at least one M/Monit succeeded DEBUG("M/Monit: %s message sent to %s\n", E ? "event" : "status", C->url->url); error: if (socket) socket_free(&socket); } StringBuffer_free(&sb); return rv; }
static void open_server(SendMail_T *S) { MailServer_T mta = Run.mailservers; if (mta) { S->server = mta->host; S->port = mta->port; S->username = mta->username; S->password = mta->password; S->ssl = mta->ssl; } else { THROW(IOException, "No mail servers are defined -- see manual for 'set mailserver' statement"); } do { /* wait with ssl-connect if SSL_VERSION_TLSV1 is set (rfc2487) */ if (! S->ssl.use_ssl || S->ssl.version == SSL_VERSION_TLSV1) S->socket = socket_new(S->server, S->port, SOCKET_TCP, FALSE, Run.mailserver_timeout); else S->socket = socket_create_t(S->server, S->port, SOCKET_TCP, S->ssl, Run.mailserver_timeout); if (S->socket) break; LogError("Cannot open a connection to the mailserver '%s:%i' -- %s\n", S->server, S->port, STRERROR); if (mta && (mta = mta->next)) { S->server = mta->host; S->port = mta->port; S->username = mta->username; S->password = mta->password; S->ssl = mta->ssl; LogInfo("Trying the next mail server '%s:%i'\n", S->server, S->port); continue; } else { THROW(IOException, "No mail servers are available"); } } while (TRUE); S->quit = TRUE; }
Socket_T socket_new(const char *host, int port, int type, int use_ssl, int timeout) { Ssl_T ssl; ssl.use_ssl= use_ssl; ssl.version= SSL_VERSION_AUTO; ssl.certmd5= NULL; return socket_create_t(host, port, type, ssl, timeout); }