diff options
Diffstat (limited to 'web/attachments/146722-check_ifoperstatus_cache.diff')
-rw-r--r-- | web/attachments/146722-check_ifoperstatus_cache.diff | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/web/attachments/146722-check_ifoperstatus_cache.diff b/web/attachments/146722-check_ifoperstatus_cache.diff new file mode 100644 index 0000000..b0e2ae9 --- /dev/null +++ b/web/attachments/146722-check_ifoperstatus_cache.diff | |||
@@ -0,0 +1,245 @@ | |||
1 | *** check_ifoperstatus.orig 2005-08-19 17:45:13.000000000 -0400 | ||
2 | --- check_ifoperstatus 2005-08-23 16:32:12.000000000 -0400 | ||
3 | *************** my $community = "public"; | ||
4 | *** 64,78 **** | ||
5 | my $maxmsgsize = 1472 ; # Net::SNMP default is 1472 | ||
6 | my ($seclevel, $authproto, $secname, $authpass, $privpass, $auth, $priv, $context); | ||
7 | my $port = 161; | ||
8 | - my @snmpoids; | ||
9 | my $sysUptime = '1.3.6.1.2.1.1.3.0'; | ||
10 | my $snmpIfDescr = '1.3.6.1.2.1.2.2.1.2'; | ||
11 | my $snmpIfAdminStatus = '1.3.6.1.2.1.2.2.1.7'; | ||
12 | my $snmpIfOperStatus = '1.3.6.1.2.1.2.2.1.8'; | ||
13 | my $snmpIfName = '1.3.6.1.2.1.31.1.1.1.1'; | ||
14 | my $snmpIfLastChange = '1.3.6.1.2.1.2.2.1.9'; | ||
15 | my $snmpIfAlias = '1.3.6.1.2.1.31.1.1.1.18'; | ||
16 | my $snmpLocIfDescr = '1.3.6.1.4.1.9.2.2.1.1.28'; | ||
17 | my $hostname; | ||
18 | my $ifName; | ||
19 | my $session; | ||
20 | --- 64,84 ---- | ||
21 | my $maxmsgsize = 1472 ; # Net::SNMP default is 1472 | ||
22 | my ($seclevel, $authproto, $secname, $authpass, $privpass, $auth, $priv, $context); | ||
23 | my $port = 161; | ||
24 | my $sysUptime = '1.3.6.1.2.1.1.3.0'; | ||
25 | my $snmpIfDescr = '1.3.6.1.2.1.2.2.1.2'; | ||
26 | + my $snmpIfDescrOid = $snmpIfDescr; | ||
27 | my $snmpIfAdminStatus = '1.3.6.1.2.1.2.2.1.7'; | ||
28 | + my $snmpIfAdminStatusOid = $snmpIfAdminStatus; | ||
29 | my $snmpIfOperStatus = '1.3.6.1.2.1.2.2.1.8'; | ||
30 | + my $snmpIfOperStatusOid = $snmpIfOperStatus; | ||
31 | my $snmpIfName = '1.3.6.1.2.1.31.1.1.1.1'; | ||
32 | + my $snmpIfNameOid = $snmpIfName; | ||
33 | my $snmpIfLastChange = '1.3.6.1.2.1.2.2.1.9'; | ||
34 | + my $snmpIfLastChangeOid = $snmpIfLastChange; | ||
35 | my $snmpIfAlias = '1.3.6.1.2.1.31.1.1.1.18'; | ||
36 | + my $snmpIfAliasOid = $snmpIfAlias; | ||
37 | my $snmpLocIfDescr = '1.3.6.1.4.1.9.2.2.1.1.28'; | ||
38 | + my $snmpLocIfDescrOid = $snmpLocIfDescr; | ||
39 | my $hostname; | ||
40 | my $ifName; | ||
41 | my $session; | ||
42 | *************** my $lastc; | ||
43 | *** 88,93 **** | ||
44 | --- 94,101 ---- | ||
45 | my $dormantWarn; | ||
46 | my $adminWarn; | ||
47 | my $name; | ||
48 | + my $cacheFileChecked = 0; | ||
49 | + my $cacheFileName = '/tmp/interface_cache.db'; | ||
50 | |||
51 | ### Validate Arguments | ||
52 | |||
53 | *************** alarm($timeout); | ||
54 | *** 106,114 **** | ||
55 | ## map ifdescr to ifindex - should look at being able to cache this value | ||
56 | |||
57 | if (defined $ifdescr) { | ||
58 | - # escape "/" in ifdescr - very common in the Cisco world | ||
59 | - $ifdescr =~ s/\//\\\//g; | ||
60 | - | ||
61 | $status=fetch_ifdescr(); # if using on device with large number of interfaces | ||
62 | # recommend use of SNMP v2 (get-bulk) | ||
63 | if ($status==0) { | ||
64 | --- 114,119 ---- | ||
65 | *************** if (defined $ifdescr) { | ||
66 | *** 122,155 **** | ||
67 | |||
68 | ## Main function | ||
69 | |||
70 | ! $snmpIfAdminStatus = $snmpIfAdminStatus . "." . $snmpkey; | ||
71 | ! $snmpIfOperStatus = $snmpIfOperStatus . "." . $snmpkey; | ||
72 | ! $snmpIfDescr = $snmpIfDescr . "." . $snmpkey; | ||
73 | ! $snmpIfName = $snmpIfName . "." . $snmpkey ; | ||
74 | ! $snmpIfAlias = $snmpIfAlias . "." . $snmpkey ; | ||
75 | ! | ||
76 | ! push(@snmpoids,$snmpIfAdminStatus); | ||
77 | ! push(@snmpoids,$snmpIfOperStatus); | ||
78 | ! push(@snmpoids,$snmpIfDescr); | ||
79 | ! push(@snmpoids,$snmpIfName) if (defined $ifXTable) ; | ||
80 | ! push(@snmpoids,$snmpIfAlias) if (defined $ifXTable) ; | ||
81 | |||
82 | ! if (!defined($response = $session->get_request(@snmpoids))) { | ||
83 | ! $answer=$session->error; | ||
84 | ! $session->close; | ||
85 | ! $state = 'WARNING'; | ||
86 | ! print ("$state: SNMP error: $answer\n"); | ||
87 | ! exit $ERRORS{$state}; | ||
88 | } | ||
89 | |||
90 | - $answer = sprintf("host '%s', %s(%s) is %s\n", | ||
91 | - $hostname, | ||
92 | - $response->{$snmpIfDescr}, | ||
93 | - $snmpkey, | ||
94 | - $ifOperStatus{$response->{$snmpIfOperStatus}} | ||
95 | - ); | ||
96 | - | ||
97 | - | ||
98 | ## Check to see if ifName match is requested and it matches - exit if no match | ||
99 | ## not the interface we want to monitor | ||
100 | if ( defined $name && not ($response->{$snmpIfName} eq $name) ) { | ||
101 | --- 127,145 ---- | ||
102 | |||
103 | ## Main function | ||
104 | |||
105 | ! # moved fetching of information to function to allow it to be recalled if | ||
106 | ! # bad snmpkey in cache file | ||
107 | |||
108 | ! fetch_data(); | ||
109 | ! # If using ifDescr check to make sure database didn't return | ||
110 | ! # stale snmpkey | ||
111 | ! if (defined $ifdescr) { | ||
112 | ! if ($response->{$snmpIfDescr} ne $ifdescr) { | ||
113 | ! fetch_ifdescr(); | ||
114 | ! fetch_data(); | ||
115 | ! } | ||
116 | } | ||
117 | |||
118 | ## Check to see if ifName match is requested and it matches - exit if no match | ||
119 | ## not the interface we want to monitor | ||
120 | if ( defined $name && not ($response->{$snmpIfName} eq $name) ) { | ||
121 | *************** exit $ERRORS{$state}; | ||
122 | *** 225,232 **** | ||
123 | |||
124 | ### subroutines | ||
125 | |||
126 | sub fetch_ifdescr { | ||
127 | ! if (!defined ($response = $session->get_table($snmpIfDescr))) { | ||
128 | $answer=$session->error; | ||
129 | $session->close; | ||
130 | $state = 'CRITICAL'; | ||
131 | --- 215,270 ---- | ||
132 | |||
133 | ### subroutines | ||
134 | |||
135 | + sub fetch_data { | ||
136 | + my @snmpoids; | ||
137 | + | ||
138 | + $snmpIfAdminStatus = $snmpIfAdminStatusOid . "." . $snmpkey; | ||
139 | + $snmpIfOperStatus = $snmpIfOperStatusOid . "." . $snmpkey; | ||
140 | + $snmpIfDescr = $snmpIfDescrOid . "." . $snmpkey; | ||
141 | + $snmpIfName = $snmpIfNameOid . "." . $snmpkey ; | ||
142 | + $snmpIfAlias = $snmpIfAliasOid . "." . $snmpkey ; | ||
143 | + | ||
144 | + push(@snmpoids,$snmpIfAdminStatus); | ||
145 | + push(@snmpoids,$snmpIfOperStatus); | ||
146 | + push(@snmpoids,$snmpIfDescr); | ||
147 | + push(@snmpoids,$snmpIfName) if (defined $ifXTable) ; | ||
148 | + push(@snmpoids,$snmpIfAlias) if (defined $ifXTable) ; | ||
149 | + | ||
150 | + if (!defined($response = $session->get_request(@snmpoids))) { | ||
151 | + $answer=$session->error; | ||
152 | + $session->close; | ||
153 | + $state = 'WARNING'; | ||
154 | + print ("$state: SNMP error: $answer\n"); | ||
155 | + exit $ERRORS{$state}; | ||
156 | + } | ||
157 | + | ||
158 | + $answer = sprintf("host '%s', %s(%s) is %s\n", | ||
159 | + $hostname, | ||
160 | + $response->{$snmpIfDescr}, | ||
161 | + $snmpkey, | ||
162 | + $ifOperStatus{$response->{$snmpIfOperStatus}} | ||
163 | + ); | ||
164 | + } | ||
165 | + | ||
166 | sub fetch_ifdescr { | ||
167 | ! my %intcache; | ||
168 | ! dbmopen %intcache, $cacheFileName, 0600 or exit $ERRORS{'CRITICAL'}; | ||
169 | ! | ||
170 | ! # check if we already checked cache file | ||
171 | ! if (!$cacheFileChecked) { | ||
172 | ! # check cache file for interface information, if exists use | ||
173 | ! # if not then update cache file for the entire host looking | ||
174 | ! # for this interface | ||
175 | ! | ||
176 | ! $cacheFileChecked = 1; | ||
177 | ! if (exists $intcache{$hostname.$ifdescr}) { | ||
178 | ! $snmpkey = $intcache{$hostname.$ifdescr}; | ||
179 | ! dbmclose %intcache; | ||
180 | ! return $snmpkey; | ||
181 | ! } | ||
182 | ! } | ||
183 | ! | ||
184 | ! if (!defined ($response = $session->get_table($snmpIfDescrOid))) { | ||
185 | $answer=$session->error; | ||
186 | $session->close; | ||
187 | $state = 'CRITICAL'; | ||
188 | *************** sub fetch_ifdescr { | ||
189 | *** 235,246 **** | ||
190 | exit $ERRORS{$state}; | ||
191 | } | ||
192 | |||
193 | foreach $key ( keys %{$response}) { | ||
194 | if ($response->{$key} =~ /^$ifdescr$/) { | ||
195 | ! $key =~ /.*\.(\d+)$/; | ||
196 | ! $snmpkey = $1; | ||
197 | #print "$ifdescr = $key / $snmpkey \n"; #debug | ||
198 | } | ||
199 | } | ||
200 | unless (defined $snmpkey) { | ||
201 | $session->close; | ||
202 | --- 273,297 ---- | ||
203 | exit $ERRORS{$state}; | ||
204 | } | ||
205 | |||
206 | + # snmpwalk succesful, empty cache file for this host | ||
207 | + # TODO: empty cache file for host | ||
208 | + | ||
209 | + # escape "/" in ifdescr - very common in the Cisco world | ||
210 | + $ifdescr =~ s/\//\\\//g; | ||
211 | + | ||
212 | foreach $key ( keys %{$response}) { | ||
213 | + $key =~ /.*\.(\d+)$/; | ||
214 | + my $cursnmpkey = $1; | ||
215 | + | ||
216 | if ($response->{$key} =~ /^$ifdescr$/) { | ||
217 | ! #$key =~ /.*\.(\d+)$/; | ||
218 | ! #$snmpkey = $1; | ||
219 | ! $snmpkey = $cursnmpkey; | ||
220 | #print "$ifdescr = $key / $snmpkey \n"; #debug | ||
221 | } | ||
222 | + | ||
223 | + # for each interface update cache file | ||
224 | + $intcache{$hostname.$response->{$key}} = $cursnmpkey; | ||
225 | } | ||
226 | unless (defined $snmpkey) { | ||
227 | $session->close; | ||
228 | *************** sub fetch_ifdescr { | ||
229 | *** 248,254 **** | ||
230 | printf "$state: Could not match $ifdescr on $hostname\n"; | ||
231 | exit $ERRORS{$state}; | ||
232 | } | ||
233 | ! | ||
234 | return $snmpkey; | ||
235 | } | ||
236 | |||
237 | --- 299,306 ---- | ||
238 | printf "$state: Could not match $ifdescr on $hostname\n"; | ||
239 | exit $ERRORS{$state}; | ||
240 | } | ||
241 | ! | ||
242 | ! dbmclose %intcache; | ||
243 | return $snmpkey; | ||
244 | } | ||
245 | |||