Nagios::Object - perl objects/parser for Nagios config & log
Al Tobey
tobeya at tobert.org
Tue Nov 25 16:43:34 CET 2003
This announcement is also at:
http://use.perl.org/~tobert/journal/16004
I've been working on Nagios::Object, a set of perl modules for parsing
and working with Nagios objects in perl. The first cut of this module
is available at http://www.tobert.org/perl/Nagios-Object-0.01.tar.gz .
It's a little rough around the edges, but I need people to look at the
API and tell me what it needs.
There are three modules in the distribution (for now):
Nagios::Object - represent Nagios objects as perl objects
Nagios::Object::Config - parse Nagios object configs
Nagios::StatusLog - parse Nagios status logs
Some possible modules in the future:
Nagios::Default - parse files like nagios.cfg (will be in v0.02)
DBD::Nagios - DBI/SQL interface to the Nagios configuration
Nagios::HTML - HTML widgets for Nagios configuration & statuses
My hope is that as time goes by, these modules make it possible to
rewrite the Nagios CGIs in perl. I also plan on looking at making the
backend of Nagios::Object be able to read Nagios v2's DBM cache or even
get it directly from Nagios via SHM or something crazy like that.
All (451) of my tests succeed on my Linux laptop, but I'd like for some
of you out there to beat on it and let me know what you think. I'm
planning on posting version 0.02 to CPAN this weekend if I get some
feedback.
Attachment is output of pod2text for Nagios::Object.
-Al Tobey
-------------- next part --------------
NAME
Nagios::Object
DESCRIPTION
This module contains the code for creating perl objects to represent any
of the Nagios objects. All of the perl classes are auto-generated at
compile-time, so it's pretty trivial to add new attributes or even
entire objects. The following is a list of currently supported classes:
Nagios::TimePeriod
Nagios::Command
Nagios::Contact
Nagios::ContactGroup
Nagios::Host
Nagios::Service
Nagios::HostGroup
Nagios::ServiceEscalation
Nagios::HostDependency
Nagios::HostEscalation
Nagios::HostGroupEscalation
Nagios::ServiceDependency
EXAMPLE
use Nagios::Object;
my $generic_host = Nagios::Host->new(
register => 0,
parents => undef,
check_command => $some_command,
max_check_attempts => 3,
checks_enabled => 1,
event_handler => $some_command,
event_handler_enabled => 0,
low_flap_threshhold => 0,
high_flap_threshhold => 0,
flap_detection_enabled => 0,
process_perf_data => 1,
retain_status_information => 1,
retain_nonstatus_information => 1,
notification_interval => $timeperiod,
notification_options => [qw(d u r)],
notifications_enabled => 1,
stalking_options => [qw(o d u)]
);
my $localhost = Nagios::Host->new(
use => $generic_host,
host_name => "localhost",
alias => "Loopback",
address => "127.0.0.1"
);
my $hostname = $localhost->host_name();
printf "max check attempts for $hostname is %s.\n",
$localhost->max_check_attempts;
$localhost->set_event_handler(
Nagios::Command->new(
command_name => "new_event_handler",
command_line => "/bin/true"
)
);
METHODS
new()
Create a new object of one of the types listed above.
Nagios::Host->new( ... );
dump()
Output a Nagios define { } block from an object. This is still
EXPERIMENTAL, but may eventually be robust enough to use for a
configuration GUI.
print $object->dump();
name()
This method is common to all calles created by this module. It
should always return the textual name for an object. It is used
internally by the Nagios::Object modules to allow polymorphism,
which is what makes this module so compact. Also of note is that
this is the only way to retrieve the name of a template, since they
have a "name" field that they are identified by.
my $svc_desc = $service->name;
my $hostname = $host->name;
Which is just short for:
my $svc_desc = $service->service_description;
my $hostname = $service->host_name;
register()
Returns true/undef to indicate whether the calling object is
registerable or not.
if ( $object->register ) { print $object->name, " is registerable." }
has_attribute()
Returns true/undef to indicate whether the calling object has the
attribute specified as the only argument.
# check to see if $object has attribute "command_line"
die if ( !$object->has_attribute("command_line") );
list_attributes()
Returns a list of valid attributes for the calling object.
my @host_attributes = $host->list_attributes();
attribute_type()
Returns the type of data expected by the object's set_ method for
the given attribute.
my $type = $host->attribute_type("notification_period");
attribute_is_list()
Returns true if the attribute is supposed to be a list (ARRAYREF).
if ( $object->attribute_is_list("members") ) {
$object->set_members( [$member] );
} else {
$object->set_members( $member );
}
attribute_allows_undef()
Returns true if the attribute provided is allowed to have a value of
undef. Setting an attribute to undef will cause the templates to be
searched until a non-undef answer is found.
NOTE: this may go away, since I'm not sure if it's really useful at
all.
my $answer = $object->attribute_allows_undef("command_line");
AUTHOR
Al Tobey <tobeya at cpan.org>
Thank you to the fine people of #perl on freenode.net for helping me
with some hairy code and silly optimizations.
WARNINGS
See AUTHOR.
More information about the Developers
mailing list