DESCRIPTION Nagio is expects that passive checks are send to a named pipe, as indicated by the 'command_file' variable specided configuration file 'nagios.cnf' -- in my configuration, I have set it to '/var/nagios/rw/nagios.cmd'. This must be a named pipe and not a regular file. All attemps by 'notify_nagios.c' to lseek or lock a named pipe will always fail and notifications to nagios will, thus, always fail.
This in undesirable. The patch bellow removes locking and lseek: locking is not needed since POSIX guarantees that writes of size less than PIPE_BUF are atomic; if write(2) fails, the writer must attempt again, which notify_nagios.c will do since it writes using swrite() . The lseek() call always fails on pipes and becomes a problem since we must write to a pipe. EXPECTED BEHAVIOR The <notify_nagios> plugin should be able to notify Nagios via the named pipe designated by Nagios server PRESENT BEHAVIOR The <notify_nagios> plugin fails to write to a the named pipe since it assumes it must write to a file Bellow is the patch that fixes these issues and collectd is now able to notify Nagios. Tested to work on OSX 10.11.6, collectd-5.7.0, and nagios4 . Thanks Ioannis Tambouras <[email protected]> Postgres DBA --- src/notify_nagios.c | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/notify_nagios.c b/src/notify_nagios.c index c95f7cb..3e2c2bd 100644 --- a/src/notify_nagios.c +++ b/src/notify_nagios.c @@ -74,29 +74,6 @@ static int nagios_print(char const *buffer) /* {{{ */ return status; } - lock.l_type = F_WRLCK; - lock.l_whence = SEEK_END; - - status = fcntl(fd, F_GETLK, &lock); - if (status != 0) { - char errbuf[1024]; - status = errno; - ERROR("notify_nagios plugin: Failed to acquire write lock on \"%s\": %s", - file, sstrerror(status, errbuf, sizeof(errbuf))); - close(fd); - return status; - } - - status = (int)lseek(fd, 0, SEEK_END); - if (status == -1) { - char errbuf[1024]; - status = errno; - ERROR("notify_nagios plugin: Seeking to end of \"%s\" failed: %s", file, - sstrerror(status, errbuf, sizeof(errbuf))); - close(fd); - return status; - } - status = (int)swrite(fd, buffer, strlen(buffer)); if (status != 0) { char errbuf[1024]; -- 2.7.4 (Apple Git-66) _______________________________________________ collectd mailing list [email protected] https://mailman.verplant.org/listinfo/collectd
