[c5c522c] | 1 | # -*-perl-*- |
---|
| 2 | |
---|
| 3 | # Cricket: a configuration, polling and data display wrapper for RRD files |
---|
| 4 | # |
---|
| 5 | # Copyright (C) 1998 Jeff R. Allen and WebTV Networks, Inc. |
---|
| 6 | # |
---|
| 7 | # This program is free software; you can redistribute it and/or modify |
---|
| 8 | # it under the terms of the GNU General Public License as published by |
---|
| 9 | # the Free Software Foundation; either version 2 of the License, or |
---|
| 10 | # (at your option) any later version. |
---|
| 11 | # |
---|
| 12 | # This program is distributed in the hope that it will be useful, |
---|
| 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
| 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
| 15 | # GNU General Public License for more details. |
---|
| 16 | # |
---|
| 17 | # You should have received a copy of the GNU General Public License |
---|
| 18 | # along with this program; if not, write to the Free Software |
---|
| 19 | # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
---|
| 20 | |
---|
| 21 | # This lets people replace our choice of snmp libraries by simply |
---|
| 22 | # replacing snmpUtils.pm (Ed, this means you! <wink>) |
---|
| 23 | |
---|
| 24 | use snmpUtils; |
---|
| 25 | |
---|
| 26 | use Common::Log; |
---|
| 27 | |
---|
| 28 | use strict; |
---|
| 29 | |
---|
| 30 | # This tells the collector that we are open for business and |
---|
| 31 | # happy to handle snmp:// datasources. |
---|
| 32 | $main::gDSFetch{'snmp'} = \&snmpFetch; |
---|
| 33 | |
---|
| 34 | sub snmpFetch { |
---|
| 35 | # This procedure is passed a REFERENCE to an array of SNMP datasources. |
---|
| 36 | # |
---|
| 37 | # Each element consists of a string like: |
---|
| 38 | # index://community@host:port/oid |
---|
| 39 | # community and port are optional. If they are left out, they |
---|
| 40 | # will default to public and 161, respectively. |
---|
| 41 | # |
---|
| 42 | # VERY IMPORTANT: The index MUST be returned with the corresponding value, |
---|
| 43 | # otherwise it'll get put back into the wrong spot in the RRD. |
---|
| 44 | |
---|
| 45 | my($dsList, $name, $target) = @_; |
---|
| 46 | my(%oidsPerSnmp) = (); |
---|
| 47 | |
---|
| 48 | my($dsspec); |
---|
| 49 | my($oidMap) = $main::gCT->configHash($name, 'oid'); |
---|
| 50 | foreach $dsspec (@{ $dsList }) { |
---|
| 51 | my($index); |
---|
| 52 | |
---|
| 53 | ($index, $dsspec) = split(/:/, $dsspec, 2); |
---|
| 54 | $dsspec =~ s#^//##; |
---|
| 55 | |
---|
| 56 | # This little hack is for people who like to use slashes in their |
---|
| 57 | # community strings. |
---|
| 58 | my($comm, $cinfo) = split(/@/, $dsspec, 2); |
---|
| 59 | my($snmp, $oid) = split(/\//, $cinfo, 2); |
---|
| 60 | $snmp = $comm . "@" . $snmp; |
---|
| 61 | |
---|
| 62 | $oid = mapOid($oidMap, $oid); |
---|
| 63 | if (! defined $oid) { |
---|
| 64 | Warn("Could not find an OID in $dsspec"); |
---|
| 65 | return (); |
---|
| 66 | } |
---|
| 67 | |
---|
| 68 | # Debug("SNMP parser: snmp://$snmp/$oid"); |
---|
| 69 | |
---|
| 70 | # we only try to process them if we didn't find a problem |
---|
| 71 | # above (hence the check for undef) |
---|
| 72 | push(@{ $oidsPerSnmp{$snmp} }, "$index:$oid") |
---|
| 73 | if (defined $oid); |
---|
| 74 | } |
---|
| 75 | |
---|
| 76 | my(@results) = (); |
---|
| 77 | |
---|
| 78 | while (my($snmp, $snmpDSRef) = each %oidsPerSnmp) { |
---|
| 79 | my(@oidsToQuery) = (); |
---|
| 80 | |
---|
| 81 | if ($#{ $snmpDSRef } >= 0) { |
---|
| 82 | my(@oidsToQuery) = (); |
---|
| 83 | my(@indices) = (); |
---|
| 84 | my($line); |
---|
| 85 | while ($line = shift @{ $snmpDSRef }) { |
---|
| 86 | my($index, $oid) = split(/:/, $line); |
---|
| 87 | push(@indices, $index); push(@oidsToQuery, $oid); |
---|
| 88 | } |
---|
| 89 | |
---|
| 90 | Debug("Getting from $snmp ", join(" ", @oidsToQuery)); |
---|
| 91 | my(@hostResults) = snmpUtils::get($snmp, @oidsToQuery); |
---|
| 92 | if (isDebug()) { Debug("Got: ", join(" ", @hostResults)); } |
---|
| 93 | |
---|
| 94 | # it tells us everything went to hell by returning |
---|
| 95 | # scalar -1. Unfortunately, we interpret that as the first |
---|
| 96 | # result. So, make it undef so that we fix it later. |
---|
| 97 | # hopefully, we don't need to fetch a -1 all the time... |
---|
| 98 | |
---|
| 99 | if (defined($hostResults[0]) && $hostResults[0] == -1) { |
---|
| 100 | $hostResults[0] = undef; |
---|
| 101 | } |
---|
| 102 | |
---|
| 103 | # turn undefs into "U"'s to make RRD happy |
---|
| 104 | my($ctr); |
---|
| 105 | for $ctr ( 0..$#indices ) { |
---|
| 106 | my($res) = $hostResults[$ctr]; |
---|
| 107 | $res = "U" if (! defined($res)); |
---|
| 108 | # previously called fixNum() here, but that breaks mapped |
---|
| 109 | # instances which rely on the fact that the snmp result |
---|
| 110 | # may be non-numeric |
---|
| 111 | push(@results, "$indices[$ctr]:" . $res); |
---|
| 112 | } |
---|
| 113 | } |
---|
| 114 | } |
---|
| 115 | |
---|
| 116 | return @results; |
---|
| 117 | } |
---|
| 118 | |
---|
| 119 | 1; |
---|
| 120 | |
---|
| 121 | # Local Variables: |
---|
| 122 | # mode: perl |
---|
| 123 | # indent-tabs-mode: nil |
---|
| 124 | # tab-width: 4 |
---|
| 125 | # perl-indent-level: 4 |
---|
| 126 | # End: |
---|