This is the frequently asked questions
General questions about this project
Nagios Enterprises own the Nagios Plugins project, hence the domain names of the site belong to Nagios Enterprises. However, the Nagios Plugins Development Team are responsible for the running of the project. This means that decisions about the web site and the development of code related to the project are handled independently by the team.
The Nagios Plugins is currently distributed using the GNU General Public License version 2.
There is a task to convert the project to be under GPLv3. This is because some C code that we depend upon, from the GNUlib project, is under GPLv3 and therefore some of our C plugins also need to be GPLv3.
So the team has decided rather than having a mixed license, we'll distribute the core Nagios Plugins code as GPLv3.
This page will be updated when this has been completed.
Currently, the copyrights for individual files and plugins are mixed. Sometimes, they are copyrighted to the individual that originally wrote the plugin, though any new changes are copyrighted by the Nagios Plugin Development Team (as listed on Sourceforge).
All code is released under the GPLv3.
There is a task to ensure all code is owned (solely or dual copyright) to the Nagios Plugins Development Team, to avoid confusion about ownership in future. This page will be updated to reflect when this has been completed.
All new code will be copyright to the Nagios Plugins Development team. A disclaimer is shown when submitting a new patch to Sourceforge which says:
By submitting a patch, you are stating that:
* this is your own work or you have full rights to publish and license it
* that it can be released under the GPL
If your patch is accepted, we will:
* add a comment with your name when committing to version control
* add your name to the list of contributors in the THANKS file
The reason for copyright ownership is simple: individuals come and go, but the team takes on responsibility for code changes forever. Ambiguity about ownership then causes difficulties later. We are pre-empting issues now by having clarity that the team owns and will be responsible for changes to the core code.
Of course you can! This is an open source project!
Ideally, fork our repository and create a pull request on Github, so your patch doesn't get lost. Then chase up via the nagiosplug-devel mailing list, if nothing happens. But be aware, this project is run by volunteers, so there is not necessarily immediate response!
By submitting a patch, you are stating that:
If you disagree with handing over copyright, it maybe possible to dual copyright your change - please ask on the nagiosplug-devel mailing list.
We require the copyright ownership for legal reasons.
If your patch is accepted, we will:
The Nagios Plugins team are accepting donations for the project. We have a separate Paypal account that is used for donations, which is administered by the team leader and the deputy.
Donations go towards paying for the small administrative charges we have, such as DNS registration costs. We also use some of the funds for team beer when we meet up in person (which is not often enough :( ).
On Matthias' suggestion, on the 1st April every year, we will donate 10% of the current fund to a charity of our choice. The charity will be listed on this page.
To compile the plugins, you run:
gunzip -c nagios-plugins-1.4.10.tar.gz | tar -xf -
cd nagios-plugins-1.4.10
./configure
make
If you find that the configure script appears to hang on this line:
checking for redhat spopen problem...
Then you probably have a badly configured DNS server. This part of configure is testing for a pthread problem in Bind that is a kernel problem on some Red Hat derived versions of Linux (around kernel 2.6.9-11). It runs 10 x 100 nslookup calls to see if your kernel has this problem. If it does, then at least 1 of those calls will fail. Failure rate could be anywhere between 1% and 50%.
To force the workaround and ignore the test, run ./configure with the --enable-redhat-pthread-workaround switch.
Due to a bug in the 1.4.7 and 1.4.8 releases, check_ldap, check_radius and check_pgsql won''t compile if MySQL libs are present even if configure output says the required libraries are present. This is fixed in 1.4.9
Here's the easiest way to compile and install these plugins:
To get the SSL features, you need to have the SSL libraries available. Either OpenSSL or GNUTLS is suitable.
Check the ./configure output to see if the SSL libraries have been detected.
This is currently an optional setting at configure time. You need to run:
./configure --enable-perl-modules
Then, make, make install, make test, and make clean, will include the perl modules that are in the perlmods/ directory as expected.
The perl modules are installed into $prefix/perl.
If you are using GCC and your MySQL version was compiled using Sun's C compiler (or the other way round), then it is likely that the configure options will fail as configure will run mysql_config to get the appropriate CFLAGS.
There are various options:
This is a known problem with the Nagios::Plugin perl module: http://rt.cpan.org//Ticket/Display.html?id=29339.
However, it is now fixed in Nagios::Plugin 0.21, which is distributed with Nagios Plugins 1.4.10.
Solaris systems restrict the information that is available when you run ps. On other Unix systems, running ps will list you the entire arguments, but Solaris restricts the arguments to the first 64 characters at the kernel.
This is a problem if you need to access the arguments to find out a specific process (common for listing java programs).
/usr/ucb/ps does list the full arguments, but only for your own processes. If you are root, then running /usr/ucb/ps can get the full arguments for all processes. However, the columns for RSS and VSZ merge together when the values are too large and check_procs cannot pull the value out correctly.
The chosen approach is to create our own ps-like command, pst3. This outputs the required information in a known format for check_procs to parse. This is the default if you run ./configure on a Solaris system.
Because pst3 needs access to some kernel structures, it needs to be compiled in 32 and 64 bit modes.
If you are comfortable with the limitations, it is possible to use a Solaris ps command by specifying these options to ./configure:
--with-ps-command="/usr/bin/ps -eo 's uid pid ppid vsz rss pcpu etime
comm args'" \
--with-ps-format="%s %d %d %d %d %d %f %s %s %n" \
--with-ps-cols=10 \
--with-ps-varlist="procstat,&procuid,&procpid,&procppid,\
&procvsz,&procrss,&procpcpu,procetime,procprog,&pos"
(The with-ps-varlist should be on one line - separated here for readability).
make install
There are a few plugins which require root access. These are compiled under the plugins-root subdirectory. A make install will install it with the install user's owner and group permissions. However, if you run make install without root, this message will appear:
WARNING: insufficient access; not installing setuid plugins
NOTE: to install setuid plugins, run 'make install-root' as root"
To install, run as root:
make install-root
Even if you are not root, the plugins will still be installed. This is for packagers which can then alter the permissions of the plugins before packaging.
This behaviour is used by coreutils for the su binary and is duplicated for this project.
If you run ./configure with --with-user=nagios, then at make install time, the installation will set the ownership of the plugins to the nagios user (similarly for --with-group). If these options are not set, the plugins will be installed with the install user's owner and group permissions - it is your responsibility to set other permissions, if required.
The only exception are root plugins. These are under plugins-root/ and are also installed with the install user's owner and group permissions.
If you run:
make install-root
This will set permissions to root, assuming you are either root or using fakeroot. If not, the setuid is still set, but the plugin may not work correctly. This is the behaviour used by coreutils for the su binary and is duplicated in this project.
There are two types of plugins included in the distribution:
Sooner or later all the contrib plugins should be hosted at the official 3rd Party Nagios plugin page Nagios Exchange
Contrib plugins have to be installed manually. They are not affected by the build process.
Here is a list of the actively maintained Plugins:
check_apt, check_breeze, check_by_ssh, check_clamd, check_cluster, check_dhcp, check_dig, check_disk, check_disk_smb, check_dns, check_dummy, check_file_age, check_flexlm, check_fping, check_ftp, check_game, check_hpjd, check_http, check_icmp, check_ide_smart, check_ifoperstatus, check_ifstatus, check_imap, check_ircd, check_jabber, check_ldap, check_load, check_log, check_mailq, check_mrtg, check_mrtgtraf, check_mssql, check_mysql, check_mysql_query, check_nagios, check_netdns, check_nntp, check_nntps, check_nt, check_ntp_peer, check_ntp_time, check_nwstat, check_oracle, check_overcr, check_pgsql, check_ping, check_pop, check_procs, check_radius, check_real, check_rpc, check_sensors, check_simap, check_smtp, check_snmp, check_spop, check_ssh, check_ssmtp, check_swap, check_tcp, check_time, check_udp, check_ups, check_users, check_wave
And these plugins are currently distributed in the contrib directory:
check_adptraid, check_apache, check_apc_ups, check_appletalk, check_arping, check_asterisk, check_axis, check_backup, check_bgpstate, check_breeze, check_cluster, check_cluster2, check_compaq_insight, check_cpqarray, check_digitemp, check_dlswcircuit, check_dns_random, check_email_loop, check_fan_cpq_present, check_fan_fsc_present, check_flexlm, check_frontpage, check_hltherm, check_hprsc, check_http-with-client-certificate, check_hw, check_ica_master_browser, check_ica_metaframe_pub_apps, check_ica_program_neigbourhood, check_inodes, check_inodes-freebsd, check_ipxping, check_javaproc, check_joy, check_linux_raid, check_lmmon, check_log2, check_lotus, check_maxchannels, check_maxwanstate, check_mem, check_ms_spooler, check_mssql, check_nagios, check_nagios_db, check_nagios_db_pg, check_netapp, check_nmap, check_oracle_instance, check_oracle_tbs, check_ora_table_space, check_pcpmetric, check_pfstate, check_qmailq, check_rbl, check_remote_nagios_status, check_rrd_data, check_sap, check_smart, check_smb, check_snmp_disk_monitor, check_snmp_printer, check_snmp_process_monitor, check_snmp_procs, check_sockets, check_temp_cpq, check_temp_fsc, check_timeout, check_traceroute, check_traceroute-pure_perl, check_uptime, check_vcs, check_wave, check_wins
There are two mailing lists you can ask for support:
Note: Before sending email to a list, you must be subscribed to it. This is due to the amount of spam received and the administrative burden it was causing.
These mailing lists are specifically for the Nagios Plugins. If you have a question about Nagios (or NRPE, NSCA or NDOutils), see here for the relevant lists.
You can find archives of the nagiosplug-help and nagiosplug-devel mailing lists at gmane.org.
Be aware that these mailing lists are read by volunteers, so responses may take time, if at all.
There is an IRC channel, #Nagios at irc.freenode.net, where the topic is anything about Nagios.
After the 1.4.13 release, the Nagios Plugins development team moved to Git for its code repositories. This document is a quick introduction to Git.
There are three projects:
You can see all the projects from the following web interface:
https://github.com/nagios-plugins/repositories
The following notes are for the "nagios-plugins" project, but can be substituted for any of the others.
To work on a project you first have to clone it. This creates your own local repository and until you want to distribute your change or merge changes from someone else everything that follows can happen offline.
If you have push access, run the command:
git clone git@github.com:nagios-plugins/nagios-plugins.git
If you just want a local copy or wish to clone it to your workstation, you can run this command instead:
git clone git://github.com/nagios-plugins/nagios-plugins.git
This will create a directory called "nagios-plugins" in your current directory with all the "master" code and history (this is roughly equivalent to CVS/SVN HEAD). Change directory to nagios-plugins.
You can edit the files in the working area. To check the status, use:
git status
This will show a list of changes in the working directory. Newly make changes appear in RED, while changes added to the index are shown in green. You can use git diff to see changes between the current working directory and the index (untracked files will not be shown)
Use git add to specify which new files/changes you want to commit; this will add the changes to the index. You can select only partial diffs with git add -p too. If you want to commit everything you can use git commit -a directly.
You can see the changes you are about to commit (difference between HEAD and the index) with git diff --cached, and then commit them with:
git commit
Add a comment (you have read the developers guidelines, right? :) ). This commit will be local (affecting only your own repository) so you will have to either push your changes, or have someone to pull them from you (in the latter case you will most likely still push to a publicly accessible clone of your local repository).
If the change is from a contributor, set the author at commit time:
git commit --author="Ton Voon <ton.voon@opsera.com>"
If you realize that you forgot something in your commit and haven't pushed it yet to a remote repository, you can amend your last commit with git commit --amend. You can also amend after a push and force the next update, however this will cause non-linear updates and should be done only if the developers using your repository are aware of it.
You can revert local modifications with the following steps.
First, if you have already staged the changes you will have to unstage them. As indicated in the "git status" message you can do so with the following command:
git reset HEAD <file>
Then you can revert unstaged changes with:
git checkout <file>
If you have already committed changes locally and need to undo your commit(s), you can use git reset. First find the commit names with git log and then do either one of these:
To keep local modifications (you can commit them again, stash them, etc.)
git reset --soft <commit>
Note that for the purpose of "re-doing" the last commit, git commit --amend will be much easier than a reset/commit with the same end result.
To discard local modifications (if you lose important changes with this command you may be able to recover them with git reflog and git checkout <commit>):
git reset --hard <file>
Do not reset changes that have already been pushed to remote repositories as this will cause non-linear updates. If you do so, developers using those repositories should be aware of it.
When you work on your local repository you'll need to keep it up to date with the development tree. This is very similar to svn update with the difference that it can't be done if the working tree has any unmerged changes. If you do, either commit them or put them aside (Tip: git stash). If you cloned from the main Git repository, this command will do a fetch then merge any new changes:
git pull
You can also merge changes from any other fork of the repository. This usually happens if someone ask you to pull from his own repo for some fix or enhancements. Together with --no-commit you will have a chance to review the changes and make any relevant correction before the merge. Ex:
git pull --no-commit git://host.xz/path/to/repo.git/ master
Once you're done with your commits and after pulling from the main repository, you can push you change back to it. If you cloned using the push url this command will push the master branch:
git push
It you're trying to push something that would generate merge conflicts, the push will be rejected. You will have yo do a pull first, fix the any conflicts locally and then push again.
If your commits are local (you haven't pulled them from someone else or published them somewhere) you can rebase to avoid a merge:
git pull --rebase
Like a merge, this may generate conflicts and let you fix them, but instead of creating a merge commit on top of the others, it will undo your commits, fast-forward and apply your commits again. This is cleaner but doesn't play well when it rewrites already published history.
If you are doing some development that you want to experiment with, you can create a new branch with:
git branch newbranchname
Switch to this branch with:
git checkout newbranchname
Show your current branch with:
git branch
This will list all branches with a * next to the current branch.
If you want to push a local branch up to a remote repository, run:
git push origin newbranchname:experimental/branchname
This tags the branch at the remote site with experimental/branchname.
This is a very quick introduction to Git. There are a lot more useful commands for manipulating changes and working with others. Be sure to have a look at the references below to better understand how git works. All standard commands are very well documented as well (git help [-a] for a list of commands, git help <cmd> or git <cmd> --help shows the man page).
I highly recommend reading Git for Computer Scientists (http://eagain.net/articles/git-for-computer-scientists/) to understand how rebase works.
The idea with the testing is to move as many functions as possible "lower down", ie to the lib/utils_*.c files. These functions can then be tested using the libtap routines in the lib/tests/test_*.c files. It is easier to do unit testing here than to try and do higher level plugin testing, because you can fake data easier at this level.
The routines available via libtap are equivalent to perl's Test::Simple ones.
The libtap tests are separated out from the plugins ones (in plugins/t) because:
* it is testing the files in lib/, so should reside there
* it requires compiling to run
Firstly, there is a distinction between a Nagios plugin and plugins from the Nagios Plugins project.
Although Nagios (the system) is licenced under the GPL, plugins are executed in their own environment so does not fall under the viral aspect of the GPL. Therefore, any plugin written for use by Nagios can be under any licence the copyright holder selects.
However, the plugins contained within the Nagios Plugins project are distributed under the GPL. If you distribute an application that includes the Nagios Plugins (modified or not), you are required to distribute a copy of the source code for the plugins under the terms of the GPL, regardless of the licensing for the rest of the application.
If you write a plugin which is a derivative work from code of the Nagios Plugins project, then your plugin must also be licenced under the GPL, although you own thecopyright for your modified portions.
Derivative work usually includes:
and does not usually include:
The developer guidelines provides the specifications for writing a Nagios plugin.
This is a document in DocBook format that is held in the Nagios Plugin subversion repository.
Nagiosmib is a set of MIBs for Nagios to allow traps sent from Nagios to be recognized by other NMSes.
To develop, the requirements are:
* make
* smistrip and smilint, part of the libsmi project (http://www.ibr.cs.tu-bs.de/projects/libsmi)
(On Debian Etch, apt-get install libsmi2 libsmi2-common to get the libsmi software.)
At the top level of nagiosmib, run make && make test.
If you get errors like:
./MIB/NAGIOS-ROOT-MIB:4: failed to locate MIB module `SNMPv2-SMI'
./MIB/NAGIOS-ROOT-MIB:6: failed to locate MIB module `SNMPv2-TC'
then you are missing some prerequisite MIBs. These need to be installed from the libsmi project.
Currently there are some warnings such as:
./MIB/NAGIOS-ROOT-MIB:35: warning: current type `NotifyType' is not referenced in this module
./MIB/NAGIOS-NOTIFY-MIB:153: warning: use Integer32 instead of INTEGER in SMIv2
I think these are okay.
To change the mib information, update the src-mib directory and run make to generate the MIBs. Run make test to check.
Update CHANGES file and commit.
To release, change the version number in Makefile and run make tarball. Publish tarball and md5sum on SF. Create news story on this site. Link back to here from tarball release.
We use libtap to test C routines that are in lib/utils_*.c. The tests are in lib/tests/test_*.c.
To start running tests with libtap, download the latest libtap. The latest version is currently 1.01. However, there is a bug with the thread implementation. To workaround, run:
CPPFLAGS="-UHAVE_LIBPTHREAD" ./configure
make
make check
make install
Now when you run the Nagios Plugins ./configure, it should find the libtap library and compile the tests and run them when you run "make test".
Gnulib provides replacement implementations of functions which are not available on all (Unix-like) operating systems. In order to sync with the latest Gnulib code, do something like:
$ git clone git://git.savannah.gnu.org/gnulib.git
$ cd gnulib
$ GNULIB_HEAD=$(git rev-parse --short HEAD)
$ cd ..
$ git clone git://nagiosplug.git.sourceforge.net/gitroot/nagiosplug/nagiosplug
$ cd nagiosplug
$ ../gnulib/gnulib-tool --update
$ find gl -name '*~' -o -name '.gitignore' | xargs rm
$ git status
$ git add gl
$ git commit -m "Sync with the latest Gnulib code ($GNULIB_HEAD)"
In order to make a given function available via Gnulib (on systems which don't provide it), the module must be imported using gnulib-tool, e.g. (in order to add the "strcase" module):
$ ../gnulib/gnulib-tool --no-vc-files --import strcase
$ find gl -name '*~' | xargs rm
$ git status
$ git add gl
$ git commit -m 'Add the Gnulib module "strcase"'
The Nagios::Plugin perl module can be obtained from two main locations:
If you install from the nagiosplug tarball, the perl module will be installed in $prefix/perl.
If you install from CPAN, the perl module will be installed by default into your perl's system directories.
To write your plugin, you should start it with:
use FindBin;
use lib "$FindBin::Bin/../perl/lib";
use Nagios::Plugin;
This bit of code tells perl to look for the Nagios::Plugin module in a directory relative to where the plugin is executed - this is a hard dependency. If Nagios::Plugin is not found there, perl's system directories will be searched.
This approach allows a system administrator to decide whether they want Nagios::Plugin installed via system directories or within the $prefix area of the plugins.
NPTest.pm is a perl module, originally written by Peter Bray, and provides some basic functions for testing the plugins. It has two main helpers:
Used to get parameters given in previous test runs. Use the 3 parameter version (the 4 parameter version is deprecated).
Saved parameters are put in /var/tmp/NPTest.cache. Unfortunately, there is no easy way of altering this - you will have to manually change this file to edit existing parameters
If you are adding new parameters, there are three values for the parameters that you need to be aware of:
You should try and ensure current tests are not affected when a new parameter is added. So it maybe better to say "NP_INTERNET_ACCESS", with information like 'default "yes", disable with "no"' and check for NP_INTERNET_ACCESS == "no" to skip the tests.
This runs a command and returns an NPTest object back. You can combine Test::More routines with the object to get the return code, output or perf data to test against expected values.
See plugins/t/check_disk.t as an example test script.
This page describes the Nagios Plugin routines that can be accessed from the internal library.
This page is in development, so these are not guaranteed to be available. As the API matures and is available in libraries, this information will be migrated to the developer guidelines.
Initialise the nagios plugin routines. Pass the plugin name and argc and argv from main().
A variable nagios_plugin will be created for internal use.
Sets the internally held argc and argv values.
Shouldn't really need this, but due to np_extra_opts, this is set after that call.
Used to cleanup allocated memory by the nagios_plugin variable. This is called by the die() routine before exiting.
Saving and restoring state allows a plugin to know the last results and thus work out differences. This is especially useful when a plugin is capturing counter information, which increases with every request.
This currently works by saving state information to a file, though the API doesn't care what the backend implementation is.
Note: Binary data is not currently supported
Some things to be aware of, if you use state information:
Enables the plugin state retention routines. Will set the filename for the state file to be .../{keyname}.
keyname will have any non alphanumerics replaced with "_".
If keyname is NULL, will generate an SHA1 keyname based on the argv of the plugin (using the extra-opts parsed version, if applicable).
Note: the keyname should be uniquely defined for a particular service, to avoid a 2nd invocation of the plugin to use the state information from a different invocation. If in doubt, set keyname=NULL and allow the routine to calculate the keyname.
Reads the state file and returns a state_data variable.
This routine will call die() with UNKNOWN if:
Returns NULL if:
Your plugin should always check for NULL. It is recommended that your plugin returns OK on NULL as this is similar to a "first run".
If valid data was read, a pointed will be returned which points to a struct of:
typedef struct state_data_struct {
time_t time;
void *data;
int length; /* Of binary data */
} state_data;
If data_time==0, use current time. Creates state file, with state format version. Writes data version, time, and data. Creates a temporary file and then renames into place. There is a possible loss of data if two things writing to same key at same time, but there will not be a corrupted state file.
Same as np_state_write_string, but writes binary data - currently unimplemented.
This website is for a friendly introduction into the Nagios Plugins.
Anyone can browse the site for information. If you wish to leave a comment, you must register (this is to prevent spam). Comments are published immediately, but may be subsequently edited.
This site has been created on Drupal CMS.