summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: dd7a268)
raw | patch | inline | side by side (parent: dd7a268)
author | Sebastian Harl <sh@tokkee.org> | |
Thu, 13 Dec 2012 13:15:12 +0000 (14:15 +0100) | ||
committer | Sebastian Harl <sh@tokkee.org> | |
Thu, 13 Dec 2012 13:15:12 +0000 (14:15 +0100) |
This is done using the livestatus 'GET services' command.
src/backend/mk-livestatus.c | patch | blob | history |
index 9f99c46191517a532275df8ce9fbebfaabce9ddb..0edbc3d25f842012c1140e61112036e47d3e4615 100644 (file)
*/
static int
-sc_livestatus_get_data(sc_unixsock_client_t __attribute__((unused)) *client,
+sc_livestatus_get_host(sc_unixsock_client_t __attribute__((unused)) *client,
size_t n, sc_data_t *data, sc_object_t __attribute__((unused)) *user_data)
{
char *hostname = NULL;
hostname, timestamp);
free(hostname);
return 0;
-} /* sc_livestatus_get_data */
+} /* sc_livestatus_get_host */
+
+static int
+sc_livestatus_get_svc(sc_unixsock_client_t __attribute__((unused)) *client,
+ size_t n, sc_data_t *data, sc_object_t __attribute__((unused)) *user_data)
+{
+ char *hostname = NULL;
+ char *svcname = NULL;
+ sc_time_t timestamp = 0;
+
+ sc_service_t svc = SC_SVC_INIT;
+
+ int status;
+
+ assert(n == 3);
+ assert((data[0].type == SC_TYPE_STRING)
+ && (data[1].type == SC_TYPE_STRING)
+ && (data[2].type == SC_TYPE_DATETIME));
+
+ hostname = strdup(data[0].data.string);
+ svcname = strdup(data[1].data.string);
+ timestamp = data[2].data.datetime;
+
+ svc.hostname = hostname;
+ svc.svc_name = svcname;
+ svc.svc_last_update = timestamp;
+
+ status = sc_store_service(&svc);
+
+ if (status < 0) {
+ fprintf(stderr, "MK Livestatus backend: Failed to store/update "
+ "service '%s / %s'.\n", hostname, svcname);
+ free(hostname);
+ free(svcname);
+ return -1;
+ }
+ else if (status > 0) /* value too old */
+ return 0;
+
+ fprintf(stderr, "MK Livestatus backend: Added/updated service '%s / %s' "
+ "(last update timestamp = %"PRIscTIME").\n",
+ hostname, svcname, timestamp);
+ free(hostname);
+ free(svcname);
+ return 0;
+} /* sc_livestatus_get_svc */
/*
* plugin API
sc_unixsock_client_shutdown(client, SHUT_WR);
- if (sc_unixsock_client_process_lines(client, sc_livestatus_get_data,
+ if (sc_unixsock_client_process_lines(client, sc_livestatus_get_host,
/* user data */ NULL, /* -> EOF */ -1, /* delim */ ";",
/* column count */ 2, SC_TYPE_STRING, SC_TYPE_DATETIME)) {
fprintf(stderr, "MK Livestatus backend: Failed to read response "
- "from livestatus @ %s.\n", sc_unixsock_client_path(client));
+ "from livestatus @ %s while reading hosts.\n",
+ sc_unixsock_client_path(client));
return -1;
}
sc_strerror(errno, errbuf, sizeof(errbuf)));
return -1;
}
+
+ status = sc_unixsock_client_send(client, "GET services\r\n"
+ "Columns: host_name description last_check");
+ if (status <= 0) {
+ fprintf(stderr, "MK Livestatus backend: Failed to send "
+ "'GET services' command to livestatus @ %s.\n",
+ sc_unixsock_client_path(client));
+ return -1;
+ }
+
+ sc_unixsock_client_shutdown(client, SHUT_WR);
+
+ if (sc_unixsock_client_process_lines(client, sc_livestatus_get_svc,
+ /* user data */ NULL, /* -> EOF */ -1, /* delim */ ";",
+ /* column count */ 3, SC_TYPE_STRING, SC_TYPE_STRING,
+ SC_TYPE_DATETIME)) {
+ fprintf(stderr, "MK Livestatus backend: Failed to read response "
+ "from livestatus @ %s while reading services.\n",
+ sc_unixsock_client_path(client));
+ return -1;
+ }
+
+ if ((! sc_unixsock_client_eof(client))
+ || sc_unixsock_client_error(client)) {
+ char errbuf[1024];
+ fprintf(stderr, "MK Livestatus backend: Failed to read services "
+ "from livestatus @ %s: %s\n",
+ sc_unixsock_client_path(client),
+ sc_strerror(errno, errbuf, sizeof(errbuf)));
+ return -1;
+ }
return 0;
} /* sc_livestatus_collect */