#!/usr/bin/perl # # autogen_check_snmp_if_services # # reads hostgroup file and runs gen_check_snmp_if_services every # device for a group if the # if interfaces changes # use strict; use Net::SNMP; my $hostgroupfile = "hostgroups.cfg"; my $genscript = "./gen_check_snmp_if_services"; my $snmp_community = ""; my $outputdir = "."; my @devices; my $hostgroupname; my $devicetype; my $something_changed = 0; my $nagiosReloadCmd = "/etc/rc.d/init.d/nagios reload"; if (scalar(@ARGV) < 2) { print "Usage: $0 \n\n"; exit(1); } # end if ARGC $hostgroupname = $ARGV[0]; $snmp_community = $ARGV[1]; open(F, $hostgroupfile); my $show = 0; while (my $line = ) { $show = 1 if ($line =~ /$hostgroupname/); if ($show && $line =~ /\s+members\s+(.*)/i) { @devices = split(/,\s*/, $1); last; } # end if line is like $hostgroupname } # end for the file close(F); foreach my $device (@devices) { my $outfile = "$outputdir/check_snmp_if_services-$device.cfg"; my $ifNumber = GetIfNumber($device, $snmp_community); next if ($ifNumber == 0); my $numServices = GetNumServices($outfile); my $saveduptime = GetSavedUptime($outfile); my $sysuptime = GetSysUptime($device, $snmp_community); if ($numServices != $ifNumber || $sysuptime < $saveduptime) { $something_changed = 1; `$genscript -H $device -C $snmp_community > $outputdir/check_snmp_if_services-$device.cfg`; } # end if ifNumber doesn't match # services, recache } # end foreach tnt, run the route check # reload nagios `$nagiosReloadCmd > /dev/null` if ($something_changed); ### Subroutines sub GetIfNumber($$) { my $hostname = shift(@_); my $community = shift(@_); my $snmp_session; my $snmp_error; my $snmp_response; ## get the list of active users via snmp ($snmp_session, $snmp_error) = Net::SNMP->session( -hostname => $hostname, -community => $community, ); if (!defined($snmp_session)) { return; } if (!defined($snmp_response = $snmp_session->get_request(".1.3.6.1.2.1.2.1.0"))) { $snmp_session->close; return; } $snmp_session->close; return $snmp_response->{".1.3.6.1.2.1.2.1.0"}; } # end GetIfNumber(); # get sysUpTime from host sub GetSysUptime($$) { my $hostname = shift(@_); my $community = shift(@_); my $snmp_session; my $snmp_error; my $snmp_response; ## get the list of active users via snmp ($snmp_session, $snmp_error) = Net::SNMP->session( -hostname => $hostname, -community => $community, ); $snmp_session->translate( [-timeticks => 0x0] ); if (!defined($snmp_session)) { return; } if (!defined($snmp_response = $snmp_session->get_request(".1.3.6.1.2.1.1.3.0"))) { $snmp_session->close; return; } $snmp_session->close; return $snmp_response->{".1.3.6.1.2.1.1.3.0"}; } # end GetSysUptime(); sub GetNumServices($) { my $servicefile = shift(@_); my $numservices = 0; my $linecount = 0; open(SF, $servicefile); while (my $line = ) { $linecount++; $numservices = $1 if ($line =~ /^## ifNumber:\s+(\d+)/); last if ($linecount > 5); } # end while file left close(SF); return $numservices; } # end GetNumServices(); sub GetSavedUptime($) { my $servicefile = shift(@_); my $uptime = 0; my $linecount = 0; open(SF, $servicefile); while (my $line = ) { $linecount++; $uptime = $1 if ($line =~ /^## Uptime:\s+(\d+)/); last if ($linecount > 5); } # end while file left close(SF); return $uptime; } # end GetSavedUptime();