[Nagiosplug-devel] check_maxchannels for perl framework
Howard Wilkinson
howard at cohtech.com
Wed Mar 31 00:43:18 CEST 2004
Stanley,
I intend to produce a design/suage document shortly. It will be small
with dot points if I can get it out shortly. The rational for this
approach is 2 fold. Adding the burden to the plugin writer to produce
the output of the usage, help, version and other standard function in a
consistent and complete fashion seems to me to be unnecessary which has
led to the thinking that perhaps a framework for the entire operation of
a plugin would be a good idea, which has led to this approach being
adopted. The second is the thing that got me started on all of this,
which was needing to get consistent, complet and upto date usage
information and help information in machine processable form for entry
into a database. This database is then used to provide a user interface
that can prompt for data from the user when building Nagios
configurations. I need to be able to do type checking, provide value
checks where possible, confirm that parameters will be compatible (e.g.
SNMPv1 with SNMPv3 authorisation arguments do not make much sense) and
so on.
Thus, I am led to the approach shown in the Plugin and Plugin::Parameter
modules. Probably coudl be done better, could certainly use Perl smarter
and give more consise files (but probably not faster executing) but it
does have some industrial strength and will if finished provide a much
easier environment within which plugins of greater content can be
written. I am working on standardising the SNMP framework to allow the
writer to concentrate on processing the MIB results, as well as,
providing a common error reporting framework and output production
framework.
On a note I received from Karl and have responded to but is related to
peerformance. Our exeperience so far is that this has little eimpact on
a running monitor environment, where about 50% of our plugin executions
have now been changed to operate this. The cost of loading the Plugin
could be reduced considerabley if the POD is removed from the Plugin.pm
and Plugin::Parameter.pm files - this could be done at compile time by
fixing the Makefile. This would reduce the file size by > 50% thus the
overhead is about 35K source code. Further pounding on my style could
easily bring this down by 50% so for smaller machines we could make this
a not problem.
I have not tested under ePN although I believe I have stuck to the rules
for compile once, run many operation. I would appreciate some live
running under ePN by someone and some feedback on what to fix, as we
will be implementign an ePN based environment later this year and I
would like to concentrate on getting working and not the plugin's.
Another note. All of the plugins now have taint checking on by default,
and have been fixed to work in this environment.
Regards, Howard.
Stanley Hopcroft wrote:
>Dear Sir,
>
>I am writing to thank you for your 'small patches' and compliment you on
>your prolificity.
>
>Well done !
>
>Please would you consider a group posting of
>
>. your rationale (small dot points for me please) for this approach
>
> - eg facilitate plugin integration in GUI config manager ?
>
>. the performance impact of the new framework (/usr/bin/time repeatd a
>few times [vi] of the original plugin and that in the framework)
>
>. how it performs under ePN - can't imagine it's a problem and I will
> probably try this.
>
>I like the 'opt in' approach to option checking; that alone should make
>a plugin authors lot a much easier one.
>
>Yours sincerely.
>
>--
>------------------------------------------------------------------------
>Stanley Hopcroft
>------------------------------------------------------------------------
>
>'...No man is an island, entire of itself; every man is a piece of the
>continent, a part of the main. If a clod be washed away by the sea,
>Europe is the less, as well as if a promontory were, as well as if a
>manor of thy friend's or of thine own were. Any man's death diminishes
>me, because I am involved in mankind; and therefore never send to know
>for whom the bell tolls; it tolls for thee...'
>
>from Meditation 17, J Donne.
>
>
>------------------------------------------------------------------------
>
>#!/usr/bin/perl -w
>
>use strict ;
>
>#
>#
># dotime
>#
># L Wall, "Programming Perl 1st ed" p 331
>#
># usage dotime repeat command
>
># updated for P 5 by S Hopcroft
>
>
>die "Usage: dotime <repeat> <command>\n" if @ARGV < 2 ;
>
>my $repeat = shift(@ARGV) ;
>die "Invalid repeat: $repeat, stopped"
> unless (($repeat > 0) && ($repeat < 999)) ;
>
>use vars qw($arg) ;
>
>my $times = ($repeat == 1 ? "once" : "$repeat times") ;
>print qq/Running @ARGV $times\n/ ;
>$| = 1 ;
>
>my %run_time = ( real => { total => 0, list => [] },
> user => { total => 0, list => [] },
> sys => { total => 0, list => [] }
> ) ;
>
>for my $pass (1 .. $repeat) {
> print "$pass " ;
> open (TIMES, "/usr/bin/time @ARGV 2>&1 |")
> || die "Can't run /usr/bin/time @ARGV 2>&1, stopped" ;
> while (<TIMES>) {
> my %t ;
> if ( @t{ qw(real user sys) } = /^\s*(\S+) real\s*(\S+) user\s*(\S+) sys/ ) {
> foreach my $time ( keys %run_time ) {
> $run_time{$time}{total} += $t{$time} ;
> push @{ $run_time{$time}{list} }, $t{$time} ;
> }
> }
> }
> close (TIMES) ;
>}
>
>print "done\n" ;
>
>my $fields_per_line = 15 ;
>my ($fields, $values, $avg, $form) ;
>
>$form = "format STDOUT =\n" ;
>
>if ( $repeat <= $fields_per_line) {
>
> $fields = '@<<<<@>>>>>>' . '@>>>>>>>>' x $repeat ;
> $values = '$arg,$avg ' . ',shift @_' x $repeat ;
> $form .=<<EOF ;
>$fields
>$values
>.
>EOF
>
>} else {
>
> # XXXX
> # The values must follow the picture lines.
> # So they must be wrapped also (otherwise a SEGV from the write statement).
> # XXXX
>
> my $data_fields = $fields_per_line - 2 ;
> # Only $fields_per_line - 2 datum are displayed on each line of output
>
> my $spaces = ' ' x 12 ;
>
> # the multiple of ' ' is the number of chars used by the $arg and $avg fields in the first line
> # PLUS the number 2 (for the '@' field markers) so that the fields line up for debugging.
>
> my $fields = '@<<<<@>>>>>>' . '@>>>>>>>>' x $data_fields ;
> my $values = '$arg,$avg ' . ',shift @_' x $data_fields ;
>
> $form .=<<EOF ;
>$fields
>$values
>EOF
>
> my $line_pics = $spaces . '@>>>>>>>>' x $data_fields ;
> my $line_vals = $spaces . ',shift @_' x $data_fields ;
>
> my $lines_remaining = int( ($repeat - $data_fields)/$data_fields ) ;
>
> $form .=<<EOF x $lines_remaining ;
>$line_pics
>$line_vals
>EOF
>
> my $fields_remaining = ($repeat - $data_fields) % $data_fields ;
> $fields = ( $fields_remaining ? $spaces . '@>>>>>>>>' x $fields_remaining : "\n" ) ;
> $values = ( $fields_remaining ? $spaces . ',shift @_' x $fields_remaining : "\n" ) ;
>
> $form .=<<EOF ;
>$fields
>$values
>.
>EOF
>
>}
>
># XXXX
>
>$arg = ' ' ;
>
># $arg __cannot__ be a lexical or its value is not displayed.
># XXXX
>
>eval $form ;
>
>sub write {
> $avg = shift ;
> write ;
>}
>
>&write('Avg', 1 .. $repeat) ;
>
>&write(split(' ', ' ------' x ($repeat + 1))) ;
>
>foreach $arg ( qw(real user sys) ) {
> &write( sprintf("%6.3f", $run_time{$arg}{total}/$repeat),
> @{ $run_time{$arg}{list} }
> ) ;
>}
>
>
--
Howard Wilkinson
Phone:
+44(20)7690 7075
Coherent Technology Limited
Fax:
+44(20)79230110
33 Belgrade Road, Stoke Newington,
Mobile:
+44(7980)639379
London, United Kingdom, N16 8DH
Email:
<mailto:howard at cohtech.com>howard at cohtech.com
This message contains confidential information and is intended only
for the individual named. If you are not the named addressee you
should not disseminate, distribute or copy this e-mail. Please
notify the sender immediately by e-mail if you have received this
e-mail by mistake and delete this e-mail from you system.
E-mail transmission cannot be guarenteed to be secure or error-free
as information could be intercepted, corrupted, lost, destroyed,
arrive late or incomplete, or contain viruses. The sender therefore
does not accept liability for any errors or omissions in the contents
of this message which arise as a result of e-mail transmission. If
verification is required please request a hard-copy version.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nagios-plugins.org/archive/devel/attachments/20040331/30c33b31/attachment.html>
More information about the Devel
mailing list