index 3c37e5c104a858c9faeed19794f18fb776410813..132fada5c518a87647c19a399e77a89c4baed975 100644 (file)
</author>
</authorgroup>
- <pubdate>2005</pubdate>
+ <pubdate>2006</pubdate>
<title>Nagios plug-in development guidelines</title>
<revhistory>
<revision>
- <revnumber>$Revision$</revnumber>
- <date>$Date$</date>
+ <revnumber>1796</revnumber>
+ <date>2007-09-24 14:51:07 -0400 (Mon, 24 Sep 2007)</date>
</revision>
</revhistory>
<copyright>
- <year>2000 - 2005</year>
+ <year>2000 - 2006</year>
<holder>Nagios Plugins Development Team</holder>
</copyright>
the plug-in developers and encourage the standarization of the
different kind of plug-ins: C, shell, perl, python, etc.</para>
- <para>Nagios Plug-in Development Guidelines Copyright (C) 2000-2005
+ <para>Nagios Plug-in Development Guidelines Copyright (C) 2000-2006
(Nagios Plugins Team)</para>
<para>Permission is granted to make and distribute verbatim
<literallayout>
gnu make 3.79
- automake 1.8
- autoconf 2.58
- gettext 0.11.5
+ automake 1.9.2
+ autoconf 2.59
+ gnu m4 1.4.2
+ gnu libtool 1.5
</literallayout>
To compile from CVS, after you have checked out the code, run:
the entire output to appear in a pager message, which will get chopped
off after a certain length.</para>
+ <para>As Nagios does not capture stderr output, you should only output to
+ STDOUT and not print to STDERR.</para>
+
<section><title>Print only one line of text</title>
<para>Nagios will only grab the first line of text from STDOUT
when it notifies contacts about potential problems. If you print
- multiple lines, you're out of luck. Remember, keep it short and
- to the point.</para>
+ multiple lines, you're out of luck (though this will be a feature of
+ Nagios 3). Remember, keep your output short and to the point.</para>
<para>Output should be in the format:</para>
<literallayout>
<section><title>Screen Output</title>
<para>The plug-in should print the diagnostic and just the
- synopsis part of the help message. A well written plugin would
+ usage part of the help message. A well written plugin would
then have --help as a way to get the verbose help.</para>
+
<para>Code and output should try to respect the 80x25 size of a
crt (remember when fixing stuff in the server room!)</para>
</section>
</section>
- <section id="thresholdformat"><title>Threshold range format</title>
- <para>Thresholds ranges define the warning and critical levels for plugins to
- alert on. The theory is that the plugin will do some sort of check which returns
+ <section id="thresholdformat"><title>Threshold and ranges</title>
+ <para>A range is defined as a start and end point (inclusive) on a numeric scale (possibly
+ negative or positive infinity).
+ </para>
+ <para>A threshold is a range with an alert level (either warning or critical). Use the
+ set_thresholds(thresholds *, char *, char *) function to set the thresholds.
+ </para>
+ <para>The theory is that the plugin will do some sort of check which returns
back a numerical value, or metric, which is then compared to the warning and
- critical thresholds.
- This is the generalised format for threshold ranges:</para>
+ critical thresholds. Use the get_status(double, thresholds *) function to
+ compare the value against the thresholds.</para>
+ <para>This is the generalised format for ranges:</para>
<literallayout>
[@]start:end
<para>Notes:</para>
<orderedlist>
- <listitem><para>start > end</para>
+ <listitem><para>start ≤ end</para>
</listitem>
<listitem><para>start and ":" is not required if start=0</para>
</listitem>
</listitem>
</orderedlist>
- <para>Note: Not all plugins are coded to expect ranges in this format. It is
- planned for a future release to
- provide standard libraries to parse and compare metrics against ranges. There
- will also be some work in providing multiple metrics.</para>
+ <para>Note: Not all plugins are coded to expect ranges in this format yet.
+ There will be some work in providing multiple metrics.</para>
+
+ <table id="ExampleRanges"><title>Example ranges</title>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry><para>Range definition</para></entry>
+ <entry><para>Generate an alert if x...</para></entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>10</entry>
+ <entry>< 0 or > 10, (outside the range of {0 .. 10})</entry>
+ </row>
+ <row>
+ <entry>10:</entry>
+ <entry>< 10, (outside {10 .. ∞})</entry>
+ </row>
+ <row>
+ <entry>~:10</entry>
+ <entry>> 10, (outside the range of {-∞ .. 10})</entry>
+ </row>
+ <row>
+ <entry>10:20</entry>
+ <entry>< 10 or > 20, (outside the range of {10 .. 20})</entry>
+ </row>
+ <row>
+ <entry>@10:20</entry>
+ <entry>≥ 10 and ≤ 20, (inside the range of {10 .. 20})</entry>
+ </row>
+ <row>
+ <entry>10</entry>
+ <entry>< 0 or > 10, (outside the range of {0 .. 10})</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <table id="CommandLineExamples"><title>Command line examples</title>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry><para>Command line</para></entry>
+ <entry><para>Meaning</para></entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>check_stuff -w10 -c20</entry>
+ <entry>Critical if "stuff" is over 20, else warn if over 10 (will be critical if "stuff" is less than 0)</entry>
+ </row>
+ <row>
+ <entry>check_stuff -w~:10 -c~:20</entry>
+ <entry>Same as above. Negative "stuff" is OK</entry>
+ </row>
+ <row>
+ <entry>check_stuff -w10: -c20</entry>
+ <entry>Critical if "stuff" is over 20, else warn if "stuff" is below 10 (will be critical if "stuff" is less than 0)</entry>
+ </row>
+ <row>
+ <entry>check_stuff -c1:</entry>
+ <entry>Critical if "stuff" is less than 1</entry>
+ </row>
+ <row>
+ <entry>check_stuff -w~:0 -c10</entry>
+ <entry>Critical if "stuff" is above 10; Warn if "stuff" is above zero</entry>
+ </row>
+ <row>
+ <entry>check_stuff -c5:6</entry>
+ <entry>The only noncritical range is 5:6</entry>
+ </row>
+ <row>
+ <entry>check_stuff -c10:20</entry>
+ <entry>Critical if "stuff" is 10 to 20</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
</section>
<section><title>Performance data</title>
<section><title>Translations</title>
<para>If possible, use translation tools for all output to respect the user's language
- settings. See <xref linkend="translations_developers"> for guidelines
+ settings. See <xref linkend="translationsdevelopers"> for guidelines
for the core plugins.
</para>
</section>
</para>
<para>
-See the <ulink url="http://tinderbox.altinity.org">Nagios Plugins Tinderbox server</ulink>
+See the <ulink url="http://tinderbox.opsera.com">Nagios Plugins Tinderbox server</ulink>
for the daily test results.
</para>
</para>
<para>
-If you want a summary test, run: "cd plugins && perl -MTest::Harness -e 'runtests(@ARGV)' t/check_disk.t".
+If you want a summary test, run: "cd plugins && prove t/check_disk.t".
This runs the test in a summary format.
</para>
<section><title>Testing the C library functions</title>
<para>
-Will be looking at using libtap, which is utilised by the FreeBSD team. The output is
-based on perl's TAP (Test Anything Protocol) format, so that Test::Harness will understand
-results. This is still in planning stages.
+We use <ulink url="http://jc.ngo.org.uk/trac-bin/trac.cgi/wiki/LibTap">the libtap library</ulink>, which gives
+perl's TAP
+(Test Anything Protocol) output. This is used by the FreeBSD team for their regression testing.
+</para>
+
+<para>
+To run tests using the libtap library, download the latest tar ball and extract.
+There is a problem with tap-1.01 where
+<ulink url="http://jc.ngo.org.uk/trac-bin/trac.cgi/ticket/25">pthread support doesn't appear to work</ulink>
+properly on non-FreeBSD systems. Install with 'CPPFLAGS="-UHAVE_LIBPTHREAD" ./configure && make && make check && make install'.
+</para>
+
+<para>
+When you run Nagios Plugins' configure, it will look for the tap library and will automatically
+setup the tests. Run "make test" to run all the tests.
</para>
</section>
<section id="CodingGuidelines"><title>Coding guidelines</title>
<para>See <ulink url="http://www.gnu.org/prep/standards_toc.html">GNU
Coding standards</ulink> for general guidelines.</para>
- <section><title>Comments</title>
+ <section><title>C coding</title>
+
+ <para>Variables should be declared at the beginning of code blocks and
+ not inline because of portability with older compilers.</para>
+
<para>You should use /* */ for comments and not // as some compilers
do not handle the latter form.</para>
+
+ <para>You should also avoid using the type "bool" and its values
+ "true" and "false". Instead use the "int" type and the plugins' own
+ "TRUE"/"FALSE" values to keep the code uniformly.</para>
+ </section>
+
+ <section><title>Crediting sources</title>
<para>If you have copied a routine from another source, make sure the licence
from your source allows this. Add a comment referencing the ACKNOWLEDGEMENTS
file, where you can put more detail about the source.</para>
</section>
<section><title>CVS comments</title>
- <para>When adding CVS comments at commit time, you can use the following prefixes:
- <variablelist>
- <varlistentry><term>- comment</term>
- <listitem>
- <para>for a comment that can be removed from the Changelog</para>
- </listitem>
- </varlistentry>
- <varlistentry><term>* comment</term>
- <listitem>
- <para>for an important amendment to be included into a features list</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
<para>If the change is due to a contribution, please quote the contributor's name
and, if applicable, add the SourceForge Tracker number. Don't forget to
update the THANKS.in file.</para>
+ <para>If you have a change that is useful for noting in the next release, please
+ update the NEWS file.</para>
+ <para>All CVS commit comments will be written to a ChangeLog at release time.
+ </para>
</section>
- <section id="translations_developers"><title>Translations for developers</title>
+ <section id="translationsdevelopers"><title>Translations for developers</title>
<para>To make the job easier for translators, please follow these guidelines:</para>
<orderedlist>
<listitem><para>
Credit will always be given for any patches through a THANKS file in the distribution.</para>
</section>
- <section id="Newplugins"><title>New plugins</title>
+ <section id="Contributedplugins"><title>Contributed plugins</title>
+ <para>Plugins that have been contributed to the project and
+ distributed with the Nagios Plugin files are held in the contrib/ directory and are not installed
+ by default. These plugins are not officially supported by the team.
+ The current policy is that these plugins should be owned and maintained by the original
+ contributor, preferably hosted on <ulink url="http://www.nagiosexchange.org">NagiosExchange</ulink>.
+ </para>
+ <para>If patches or bugs are raised to an contributed plugin, we will start communications with the
+ original contributor, but seek to remove the plugin from our distribution.
+ </para>
+ <para>The aim is to distribute only code that the Nagios Plugin team are responsible for.
+ </para>
+ </section>
+
+ <section id="Newplugins"><title>New plugins</title>
<para>If you would like others to use your plugins, please add it to
the official 3rd party plugin repository,
<ulink url="http://www.nagiosexchange.org">NagiosExchange</ulink>.
<orderedlist>
<listitem>
- <para>Include copyright and license information in all files</para>
+ <para>Include copyright and license information in all files. Copyright must be solely
+ granted to the Nagios Plugin Development Team</para>
</listitem>
<listitem>
<para>The standard command options are supported (--help, --version,