1 | <?php |
||
2 | |||
3 | use Illuminate\Support\Str; |
||
4 | |||
5 | if ($device['os_group'] == 'cisco') { |
||
6 | echo ' CISCO-ENTITY-SENSOR: '; |
||
7 | |||
8 | $oids = []; |
||
9 | echo 'Caching OIDs:'; |
||
10 | |||
11 | if (empty($entity_array)) { |
||
12 | $tmp_oids = ['entPhysicalDescr', 'entPhysicalName', 'entPhysicalClass', 'entPhysicalContainedIn', 'entPhysicalParentRelPos']; |
||
13 | $entity_array = []; |
||
14 | foreach ($tmp_oids as $tmp_oid) { |
||
15 | echo " $tmp_oid"; |
||
16 | $entity_array = snmpwalk_cache_multi_oid($device, $tmp_oid, $entity_array, 'ENTITY-MIB:CISCO-ENTITY-SENSOR-MIB'); |
||
17 | } |
||
18 | echo ' entAliasMappingIdentifier'; |
||
19 | $entity_array = snmpwalk_cache_twopart_oid($device, 'entAliasMappingIdentifier', $entity_array, 'ENTITY-MIB:IF-MIB'); |
||
20 | } |
||
21 | |||
22 | echo ' entSensorType'; |
||
23 | $oids = snmpwalk_cache_multi_oid($device, 'entSensorType', $oids, 'CISCO-ENTITY-SENSOR-MIB'); |
||
24 | echo ' entSensorScale'; |
||
25 | $oids = snmpwalk_cache_multi_oid($device, 'entSensorScale', $oids, 'CISCO-ENTITY-SENSOR-MIB'); |
||
26 | echo ' entSensorValue'; |
||
27 | $oids = snmpwalk_cache_multi_oid($device, 'entSensorValue', $oids, 'CISCO-ENTITY-SENSOR-MIB'); |
||
28 | echo ' entSensorMeasuredEntity'; |
||
29 | $oids = snmpwalk_cache_multi_oid($device, 'entSensorMeasuredEntity', $oids, 'CISCO-ENTITY-SENSOR-MIB'); |
||
30 | echo ' entSensorPrecision'; |
||
31 | $oids = snmpwalk_cache_multi_oid($device, 'entSensorPrecision', $oids, 'CISCO-ENTITY-SENSOR-MIB'); |
||
32 | |||
33 | $t_oids = []; |
||
34 | echo ' entSensorThresholdSeverity'; |
||
35 | $t_oids = snmpwalk_cache_twopart_oid($device, 'entSensorThresholdSeverity', $t_oids, 'CISCO-ENTITY-SENSOR-MIB'); |
||
36 | echo ' entSensorThresholdRelation'; |
||
37 | $t_oids = snmpwalk_cache_twopart_oid($device, 'entSensorThresholdRelation', $t_oids, 'CISCO-ENTITY-SENSOR-MIB'); |
||
38 | echo ' entSensorThresholdValue'; |
||
39 | $t_oids = snmpwalk_cache_twopart_oid($device, 'entSensorThresholdValue', $t_oids, 'CISCO-ENTITY-SENSOR-MIB'); |
||
40 | |||
41 | d_echo($oids); |
||
42 | |||
43 | $entitysensor['voltsDC'] = 'voltage'; |
||
44 | $entitysensor['voltsAC'] = 'voltage'; |
||
45 | $entitysensor['amperes'] = 'current'; |
||
46 | $entitysensor['watt'] = 'power'; |
||
47 | $entitysensor['hertz'] = 'freq'; |
||
48 | $entitysensor['percentRH'] = 'humidity'; |
||
49 | $entitysensor['rpm'] = 'fanspeed'; |
||
50 | $entitysensor['celsius'] = 'temperature'; |
||
51 | $entitysensor['watts'] = 'power'; |
||
52 | $entitysensor['dBm'] = 'dbm'; |
||
53 | |||
54 | if (is_array($oids)) { |
||
55 | foreach ($oids as $index => $entry) { |
||
56 | // echo("[" . $entry['entSensorType'] . "|" . $entry['entSensorValue']. "|" . $index . "]"); |
||
57 | if ($entitysensor[$entry['entSensorType']] && is_numeric($entry['entSensorValue']) && is_numeric($index)) { |
||
58 | $entPhysicalIndex = $index; |
||
59 | if ($entity_array[$index]['entPhysicalName'] || $device['os'] == 'iosxr') { |
||
60 | $descr = rewrite_entity_descr($entity_array[$index]['entPhysicalName']); |
||
61 | } else { |
||
62 | $descr = rewrite_entity_descr($entity_array[$index]['entPhysicalDescr']); |
||
63 | } |
||
64 | |||
65 | // Set description based on measured entity if it exists |
||
66 | if (is_numeric($entry['entSensorMeasuredEntity']) && $entry['entSensorMeasuredEntity']) { |
||
67 | $measured_descr = $entity_array[$entry['entSensorMeasuredEntity']]['entPhysicalName']; |
||
68 | if (! $measured_descr) { |
||
69 | $measured_descr = $entity_array[$entry['entSensorMeasuredEntity']]['entPhysicalDescr']; |
||
70 | } |
||
71 | |||
72 | $descr = $measured_descr . ' - ' . $descr; |
||
73 | } |
||
74 | |||
75 | // Bit dirty also, clean later |
||
76 | $descr = str_replace('Temp: ', '', $descr); |
||
77 | $descr = str_ireplace('temperature ', '', $descr); |
||
78 | |||
79 | $oid = '.1.3.6.1.4.1.9.9.91.1.1.1.1.4.' . $index; |
||
80 | $current = $entry['entSensorValue']; |
||
81 | $type = $entitysensor[$entry['entSensorType']]; |
||
82 | |||
83 | // echo("$index : ".$entry['entSensorScale']."|"); |
||
84 | // FIXME this stuff is foul |
||
85 | if ($entry['entSensorScale'] == 'nano') { |
||
86 | $divisor = '1000000000'; |
||
87 | $multiplier = '1'; |
||
88 | } |
||
89 | |||
90 | if ($entry['entSensorScale'] == 'micro') { |
||
91 | $divisor = '1000000'; |
||
92 | $multiplier = '1'; |
||
93 | } |
||
94 | |||
95 | if ($entry['entSensorScale'] == 'milli') { |
||
96 | $divisor = '1000'; |
||
97 | $multiplier = '1'; |
||
98 | } |
||
99 | |||
100 | if ($entry['entSensorScale'] == 'units') { |
||
101 | $divisor = '1'; |
||
102 | $multiplier = '1'; |
||
103 | } |
||
104 | |||
105 | if ($entry['entSensorScale'] == 'kilo') { |
||
106 | $divisor = '1'; |
||
107 | $multiplier = '1000'; |
||
108 | } |
||
109 | |||
110 | if ($entry['entSensorScale'] == 'mega') { |
||
111 | $divisor = '1'; |
||
112 | $multiplier = '1000000'; |
||
113 | } |
||
114 | |||
115 | if ($entry['entSensorScale'] == 'giga') { |
||
116 | $divisor = '1'; |
||
117 | $multiplier = '1000000000'; |
||
118 | } |
||
119 | |||
120 | if (is_numeric($entry['entSensorPrecision']) |
||
121 | && $entry['entSensorPrecision'] > '0' |
||
122 | // Workaround for a Cisco SNMP bug |
||
123 | && $entry['entSensorPrecision'] != '1615384784' |
||
124 | ) { |
||
125 | // Use precision value to determine decimal point place on returned value, then apply divisor |
||
126 | $divisor = (10 ** $entry['entSensorPrecision']) * $divisor; |
||
127 | } |
||
128 | |||
129 | $current = ($current * $multiplier / $divisor); |
||
130 | |||
131 | // Set thresholds to null |
||
132 | $limit = null; |
||
133 | $limit_low = null; |
||
134 | $warn_limit = null; |
||
135 | $warn_limit_low = null; |
||
136 | |||
137 | // Check thresholds for this entry (bit dirty, but it works!) |
||
138 | if (is_array($t_oids[$index])) { |
||
139 | foreach ($t_oids[$index] as $t_index => $key) { |
||
140 | // Skip invalid treshold values |
||
141 | if ($key['entSensorThresholdValue'] == '-32768') { |
||
142 | continue; |
||
143 | } |
||
144 | // Critical Limit |
||
145 | if (($key['entSensorThresholdSeverity'] == 'major' || $key['entSensorThresholdSeverity'] == 'critical') && ($key['entSensorThresholdValue'] != 0) && ($key['entSensorThresholdRelation'] == 'greaterOrEqual' || $key['entSensorThresholdRelation'] == 'greaterThan')) { |
||
146 | $limit = ($key['entSensorThresholdValue'] * $multiplier / $divisor); |
||
147 | } |
||
148 | |||
149 | if (($key['entSensorThresholdSeverity'] == 'major' || $key['entSensorThresholdSeverity'] == 'critical') && ($key['entSensorThresholdValue'] != 0) && ($key['entSensorThresholdRelation'] == 'lessOrEqual' || $key['entSensorThresholdRelation'] == 'lessThan')) { |
||
150 | $limit_low = ($key['entSensorThresholdValue'] * $multiplier / $divisor); |
||
151 | } |
||
152 | |||
153 | // Warning Limit |
||
154 | if ($key['entSensorThresholdSeverity'] == 'minor' && ($key['entSensorThresholdRelation'] == 'greaterOrEqual' || $key['entSensorThresholdRelation'] == 'greaterThan')) { |
||
155 | $warn_limit = ($key['entSensorThresholdValue'] * $multiplier / $divisor); |
||
156 | } |
||
157 | |||
158 | if ($key['entSensorThresholdSeverity'] == 'minor' && ($key['entSensorThresholdRelation'] == 'lessOrEqual' || $key['entSensorThresholdRelation'] == 'lessThan')) { |
||
159 | $warn_limit_low = ($key['entSensorThresholdValue'] * $multiplier / $divisor); |
||
160 | } |
||
161 | }//end foreach |
||
162 | }//end if |
||
163 | |||
164 | // If temperature sensor, set low thresholds to -1 and -5. Many sensors don't return low thresholds, therefore LibreNMS takes the runtime low |
||
165 | // Also changing 0 values (not just null) as Libre loses these somewhere along the line and shows an empty value in the Web UI |
||
166 | if ($type == 'temperature') { |
||
167 | if ($warn_limit_low == 0) { |
||
0 ignored issues
–
show
Bug
Best Practice
introduced
by
Loading history...
|
|||
168 | $warn_limit_low = -1; |
||
169 | } |
||
170 | if ($limit_low == 0) { |
||
0 ignored issues
–
show
|
|||
171 | $limit_low = -5; |
||
172 | } |
||
173 | } |
||
174 | |||
175 | // End Threshold code |
||
176 | $ok = true; |
||
177 | |||
178 | if ($current == '-127' || $descr == '') { |
||
179 | $ok = false; |
||
180 | } |
||
181 | |||
182 | if ($ok) { |
||
183 | $phys_index = $entity_array[$index]['entPhysicalContainedIn']; |
||
184 | while ($phys_index != 0) { |
||
185 | if ($index === $phys_index) { |
||
186 | break; |
||
187 | } |
||
188 | if ($entity_array[$phys_index]['entPhysicalClass'] === 'port') { |
||
189 | if (Str::contains($entity_array[$phys_index][0]['entAliasMappingIdentifier'], 'ifIndex.')) { |
||
190 | [, $tmp_ifindex] = explode('.', $entity_array[$phys_index][0]['entAliasMappingIdentifier']); |
||
191 | $tmp_port = get_port_by_index_cache($device['device_id'], $tmp_ifindex); |
||
192 | if (is_array($tmp_port)) { |
||
193 | $entPhysicalIndex = $tmp_ifindex; |
||
194 | $entry['entSensorMeasuredEntity'] = 'ports'; |
||
195 | } |
||
196 | } |
||
197 | break; |
||
198 | } else { |
||
199 | $phys_index = $entity_array[$phys_index]['entPhysicalContainedIn']; |
||
200 | } |
||
201 | } |
||
202 | discover_sensor($valid['sensor'], $type, $device, $oid, $index, 'cisco-entity-sensor', ucwords($descr), $divisor, $multiplier, $limit_low, $warn_limit_low, $warn_limit, $limit, $current, 'snmp', $entPhysicalIndex, $entry['entSensorMeasuredEntity'], null); |
||
203 | //Cisco IOS-XR : add a fake sensor to graph as dbm |
||
204 | if ($type == 'power' and $device['os'] == 'iosxr' and (preg_match('/power (R|T)x/i', $descr) or preg_match('/(R|T)x Power/i', $descr) or preg_match('/(R|T)x Lane/i', $descr))) { |
||
205 | // convert Watts to dbm |
||
206 | $user_func = 'mw_to_dbm'; |
||
207 | $type = 'dbm'; |
||
208 | $limit_low = 10 * log10($limit_low * 1000); |
||
209 | $warn_limit_low = 10 * log10($warn_limit_low * 1000); |
||
210 | $warn_limit = 10 * log10($warn_limit * 1000); |
||
211 | $limit = 10 * log10($limit * 1000); |
||
212 | $current = round(10 * log10($current * 1000), 3); |
||
213 | $multiplier = 1000; |
||
214 | //echo("\n".$valid['sensor'].", $type, $device, $oid, $index, 'cisco-entity-sensor', $descr, $divisor, $multiplier, $limit_low, $warn_limit_low, $warn_limit, $limit, $current, $user_func"); |
||
215 | discover_sensor($valid['sensor'], $type, $device, $oid, $index, 'cisco-entity-sensor', $descr, $divisor, $multiplier, $limit_low, $warn_limit_low, $warn_limit, $limit, $current, 'snmp', $entPhysicalIndex, $entry['entSensorMeasuredEntity'], $user_func); |
||
216 | } |
||
217 | } |
||
218 | |||
219 | $cisco_entity_temperature = 1; |
||
220 | unset($limit, $limit_low, $warn_limit, $warn_limit_low); |
||
221 | }//end if |
||
222 | }//end foreach |
||
223 | }//end if |
||
224 | unset( |
||
225 | $entity_array |
||
226 | ); |
||
227 | }//end if |
||
228 |