00001 #include <stdlib.h>
00002 #include <sys/wait.h>
00003 #include <stdio.h>
00004 #include <string.h>
00005 #include <errno.h>
00006 #include <signal.h>
00007 #include <stdarg.h>
00008
00009 #include "../include/signalHandling.h"
00010 #include "../include/monitor.h"
00011
00012
00013 #define MONITORCMD "/usr/bin/monitor"
00014 #define MONITORTYPE "test"
00015 #define MONITORNAME "virtualitemlogreceiver"
00016
00017 const char severity[][10] = {
00018 "info",
00019 "warning",
00020 "critical",
00021 "failure"
00022 };
00023
00024
00025 int
00026 monitor(
00027 unsigned int sev,
00028 const char * pattern,
00029 const char * message
00030 ) {
00031 char monCall[1024];
00032 int ret;
00033
00034 snprintf(monCall, 1023,
00035 "%s %s %s.%s.%s \"%s\"",
00036 MONITORCMD,
00037 severity[sev],
00038 MONITORTYPE,
00039 MONITORNAME,
00040 pattern,
00041 message);
00042
00043 ret = system(monCall);
00044
00045 if (WIFSIGNALED(ret)) {
00046 switch (WTERMSIG(ret)) {
00047 case SIGINT:
00048 case SIGQUIT:
00049 syslog(LOG_INFO, "interrupted in monitor call");
00050 doShutdown=1;
00051 }
00052 }
00053
00054 if (-1 == ret || 0 != WEXITSTATUS(ret)) {
00055 syslog(LOG_ERR, "call monitoring failed: %s", strerror(errno));
00056 }
00057
00058 return ret;
00059 }
00060
00061
00062
00063
00064
00065 int
00066 syslogMonitor(
00067 unsigned int logLvl,
00068 unsigned int sev,
00069 const char * pattern,
00070 const char * message,
00071 ...
00072 ) {
00073 va_list args;
00074 char buffer[1025];
00075 int maxBuf = sizeof(buffer)/sizeof(buffer[0]);
00076
00077 memset(buffer, 0, maxBuf);
00078
00079 va_start(args, message);
00080 vsnprintf(buffer, 1024, message, args);
00081 va_end(args);
00082
00083 syslog(logLvl, "%s", buffer);
00084 monitor(sev, pattern, buffer);
00085
00086 return 0;
00087 }