Last updated 25 February 2002 | |||||||||||||||||||||||||||||||||||||
To Do
|
|||||||||||||||||||||||||||||||||||||
Health
Make health include metrics for interface utilisation, could be done by doing utilisation summarystats for each interface where each interface utilisation was weighted out of 100 where 50 utilised would equal 50, etc, which then contributed to a total number divided by the number of interfaces and then weighted into the total health metric. |
|||||||||||||||||||||||||||||||||||||
Locations
Add timezone for each location, in the form of UTC or Local name. Complete Locations lat and lon from Encarta |
|||||||||||||||||||||||||||||||||||||
Health
Every 5 minutes calculate the health metric for each group & whole network and stick in an RRD allowing graph and drilling of overall health and then graph health on the dash board. |
|||||||||||||||||||||||||||||||||||||
Collection Policy
Create a CSV with interface types and node types and some flags for defining the collection policy for devices.
|
|||||||||||||||||||||||||||||||||||||
summarystats
I would actually like to rewrite the summary stats routine to return a "summarystats hash". |
|||||||||||||||||||||||||||||||||||||
Interface Stats
For each interface which supports it collect in/out frames, broadcast, unicast. This would allow determination of average packet size on link and on network. It would also allow thresholds to be set for percentage of broadcast traffic on network. More Notes: An excellent idea, this would be very good information, this is already |
|||||||||||||||||||||||||||||||||||||
Create RRD
I had been thinking about making this config options and putting the formulas in the code. |
|||||||||||||||||||||||||||||||||||||
NMIS Command Line
simple script to provide status of nodes and basic info like summary.pl but commandline oriented. |
|||||||||||||||||||||||||||||||||||||
Thresholds
Put the threshold code seperate for just using in nmis.pl |
|||||||||||||||||||||||||||||||||||||
HOST MIB
Add support for HOST-MIB, then get CPU and MEM working dynamically, get DISK mapping working for disk free and usage stuff. Add a control file like the interface.dat which maps CPU and MEM and DISK, also tracks inventory changes. |
|||||||||||||||||||||||||||||||||||||
Eric, Yep, this was used pre Event Policy table, which is when I figured the event policy should be used. I think this is only used by nmiscgi.pl and looks redundant. If an event exist for a node, then just get the level from the event state table. Should be a small patch. Regards Keith -----Original Message----- From: imlnetnz [mailto:imlnetnz@yahoo.co.nz] Sent: 18 December 2001 18:15 To: nmis_users@yahoogroups.com Subject: [nmis_users] eventlevel Keith - I am not sure why the subroutine eventlevel in NMIS.pm appears to overule the event levels as defined in the policy table - is there a good reason for this, have I misread the code, or was this something to get the project up and running out of the box ? regards Eric |
|||||||||||||||||||||||||||||||||||||
Interface Speeds and SNMP Spikes
Yes
and No, best handled in RRD but not so easy, sort of need to handle in
NMIS and RRD, ie if NMIS detects a reset (which it does by monitoring
sysuptime), checks last RRD value and sets current interface poll to 0
which should reset the RRD and remove the spike.
Nasty little SNMP! I think the problem is when the SNMP counter gets reset and RRD doesn't know how to deal with it, ie last collect was 10000, now 100 and it has a small spike as it thinks the counter has wrapped.
Limiting
the CDEF to the speed of the link is a good idea, but for some interface
types it is not accurate, ie for ATM or Frame Relay PVC which have a burst
capability. I will add this to the TODO list and ponder it a little
more, will have to put some code in to handle interface types and speed of
primary interface.
Greetings, |
|||||||||||||||||||||||||||||||||||||
Guilherme's Patch
I had the same behavior, your fix seemed to make it work right. |
|||||||||||||||||||||||||||||||||||||
View Sorting
--- view.pl 2001/06/23 01:35:28 1.1 +++ view.pl 2001/10/11 15:21:22 1.2 @@ -75,6 +75,31 @@ exit; +sub alphanumerically { + local($&, $`, $', $1, $2, $3, $4); + # Sort numbers numerically + return $a cmp $b if $a !~ /\D/ && $b !~ /\D/; + # Sort IP addresses numerically within each dotted quad + if ($a =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) { + my($a1, $a2, $a3, $a4) = ($1, $2, $3, $4); + if ($b =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) { + my($b1, $b2, $b3, $b4) = ($1, $2, $3, $4); + return ($a1 <=> $b1) && ($a2 <=> $b2) + && ($a3 <=> $b3) && ($a4 <=> $b4); + } + } + # Handle things like Level1, ..., Level10 + if ($a =~ /^(.*\D)(\d+)$/) { + my($a1, $a2) = ($1, $2); + if ($b =~ /^(.*\D)(\d+)$/) { + my($b1, $b2) = ($1, $2); + return $a2 <=> $b2 if $a1 eq $b1; + } + } + # Default is to sort alphabetically + return $a cmp $b; +} + sub editRow { my %args = @_; my $table = $args{table}; @@ -95,7 +120,7 @@ if ( $edit ne "delete" ) { if ( $row eq "add" and $edit eq "true" ) { - foreach $key (sort(keys %table_data)) { + foreach $key (sort alphanumerically (keys %table_data)) { if ( not defined $tmp ) { $tmp = $table_data{$key}; } } } @@ -103,7 +128,7 @@ $tmp = $table_data{$row}; } # need to get a row to build the menu. - foreach $field (sort(keys %$tmp)) { + foreach $field (sort alphanumerically (keys %$tmp)) { $table_data{$row}{$field} = $FORM{$field}; #print STDERR returnTime." editRow, field=$field row=$row table=$table_data{$row}{$field}\n"; } @@ -168,7 +193,7 @@ } } $i = 0; - foreach $head (sort (keys %$tmp_key)) { + foreach $head (sort alphanumerically (keys %$tmp_key)) { $headers[$i] = $head; ++$i; } @@ -250,7 +275,7 @@ cssTableStart("white"); #Display each data Row - foreach $key ( sort (keys %table_data) ) { + foreach $key ( sort alphanumerically (keys %table_data) ) { print "\n"; ++$counter; ++$pass; @@ -267,7 +292,7 @@ } $i = $c; - foreach $head (sort(keys %{$table_data{$key}})) { + foreach $head (sort alphanumerically (keys %{$table_data{$key}})) { if ( $NMIS::config{$table_key} !~ /$head/ ) { $headers[$i] = $head; ++$i; |
|||||||||||||||||||||||||||||||||||||
DONE
SENDMAIL Perl based sendmail for better mail control. |
|||||||||||||||||||||||||||||||||||||
DONE
Enhanced SNMPv2c Add support for the HC MIBS, in fact test and see if HC mibs are supported in all SNMPv2c devices. mibdump.pl and generating the new OID files, see the FAQ, change SNMP_MIB::loadmib($argue{mibdir}, "IF-MIB-V1SMI.my"); for SNMP_MIB::loadmib($argue{mibdir}, "IF-MIB.txt"); subroutine runInterface line 548 if ( $NMIS::systemTable{snmpVer} eq "SNMPv2" ) { # do the SNMP stuffy to get the standard stats ( $ifStats{ifDescr}, $ifStats{ifOperStatus}, $ifStats{ifAdminStatus}, $ifStats{ifInOctets}, $ifStats{ifOutOctets} ) = $session->snmpget( 'ifDescr'.".$interfaceTable{$interface}{ifIndex}", 'ifOperStatus'.".$interfaceTable{$interface}{ifIndex}", 'ifAdminStatus'.".$interfaceTable{$interface}{ifIndex}", 'ifHCInOctets'.".$interfaceTable{$interface}{ifIndex}", 'ifHCOutOctets'.".$interfaceTable{$interface}{ifIndex}" ); } else { # do the SNMP stuffy to get the standard stats ( $ifStats{ifDescr}, $ifStats{ifOperStatus}, $ifStats{ifAdminStatus}, $ifStats{ifInOctets}, $ifStats{ifOutOctets} ) = $session->snmpget( 'ifDescr'.".$interfaceTable{$interface}{ifIndex}", 'ifOperStatus'.".$interfaceTable{$interface}{ifIndex}", 'ifAdminStatus'.".$interfaceTable{$interface}{ifIndex}", 'ifInOctets'.".$interfaceTable{$interface}{ifIndex}", 'ifOutOctets'.".$interfaceTable{$interface}{ifIndex}" ); } |
|||||||||||||||||||||||||||||||||||||
DONE
CSS Changes CSS is now case sensitive, ie normal is not Normal! Have to change CSS to suit. Problem with IE6.0 |
|||||||||||||||||||||||||||||||||||||
DONE
Hardcoded script name Yep, that should be $ENV{SCRIPT_NAME} instead of /cgi-nmis/etc...
Keith
|
|||||||||||||||||||||||||||||||||||||
DONE With Model support and a new model called Catalyst5000Sup3
Catalyst Support If you are using 6000 series switches and you click on health
statistics |
|||||||||||||||||||||||||||||||||||||
DONE
runPing sub runPing{ my $node = shift; my $retries = 3; my $sleep = 15; my $i; if ($debug) { print returnTime." Starting Pinging with $retries retries.\n"; } $pingresult = 0; # do a ping $retries times. for ($i=1;$i<=$retries;++$i) { $pingresult = ping(node => $node, timeout => 5, debug => $debug ); if ( $pingresult != 100 ) { # Sleep a bit and try a second time. if ($debug>1) { print "Sleeping $sleep seconds\n"; } sleep $sleep; } else { $i = $retries; } } if ( $pingresult != 100 ) { # Device is down $pingresult=0; if ($debug) { print returnTime." Pinging Failed $node $NMIS::systemTable{roleType} $NMIS::systemTable{nodeType}\n"; } notify(node => $node, role => $NMIS::systemTable{roleType}, type => $NMIS::systemTable{nodeType}, event => "Node Down"); # Device is down only update the runReachability if its an interface. if ( $type eq "interface" ) { &runReachability; } } else { # Device is UP! checkEvent(node => $node, role => $NMIS::systemTable{roleType}, type => $NMIS::systemTable{nodeType}, event => "Node Down"); } }
|
|||||||||||||||||||||||||||||||||||||
DONE
ping.pm my $r; my $num_tries = 5; $ping = Net::Ping->new("icmp", $timeout, $packetsize); while ($r<=$num_tries and $result != 100;) { if ( $debug eq "verbose" ) { print returnTime." Pinging $node timeout $timeout\n"; } if ( $ping->ping($node, $timeout) ) { $result = 100; } else { $result = 0; } ++$r } $ping->close;
|
|||||||||||||||||||||||||||||||||||||
DONE
Keith - I am thinking that in sub thresholdResponse, NMIS should keep |
|||||||||||||||||||||||||||||||||||||
DONE
Keith, IMHO a minor improvement would be to strip newlines from the |
|||||||||||||||||||||||||||||||||||||
DONE
I believe I've found a couple of instances of hard-coded url paths in |
|||||||||||||||||||||||||||||||||||||
DONE with model.csv
getNodeInfo elsif ( $NMIS::systemTable{sysDescr} =~ /sun/i and $NMIS::systemTable{nodeVendor} ne "Cisco Systems" ) { $NMIS::systemTable{nodeModel} = "SunSolaris"; $NMIS::systemTable{nodeType} = "server"; $NMIS::systemTable{netType} = "lan"; $NMIS::systemTable{supported} = "true"; } line 1534 (make older IOS generic) if ( ( $NMIS::systemTable{nodeVendor} eq "Cisco Systems" ) && ( $NMIS::systemTable{nodeType} eq "router" ) && $NMIS::systemTable{sysDescr} !~ /Version 10.3/ ) { $NMIS::systemTable{nodeModel} = "CiscoRouter"; $NMIS::systemTable{nodeType} = "router"; $NMIS::systemTable{netType} = "wan"; $NMIS::systemTable{supported} = "true"; } |