1<?php
2
3use LibreNMS\Config;
4use LibreNMS\Util\Rewrite;
5
6function rewrite_entity_descr($descr)
7{
8    $descr = str_replace('Distributed Forwarding Card', 'DFC', $descr);
9    $descr = preg_replace('/7600 Series SPA Interface Processor-/', '7600 SIP-', $descr);
10    $descr = preg_replace('/Rev\.\ [0-9\.]+\ /', '', $descr);
11    $descr = preg_replace('/12000 Series Performance Route Processor/', '12000 PRP', $descr);
12    $descr = preg_replace('/^12000/', '', $descr);
13    $descr = preg_replace('/Gigabit Ethernet/', 'GigE', $descr);
14    $descr = preg_replace('/^ASR1000\ /', '', $descr);
15    $descr = str_replace('Routing Processor', 'RP', $descr);
16    $descr = str_replace('Route Processor', 'RP', $descr);
17    $descr = str_replace('Switching Processor', 'SP', $descr);
18    $descr = str_replace('Sub-Module', 'Module ', $descr);
19    $descr = str_replace('DFC Card', 'DFC', $descr);
20    $descr = str_replace('Centralized Forwarding Card', 'CFC', $descr);
21    $descr = str_replace('Power Supply Module', 'PSU ', $descr);
22    $descr = str_replace('/Voltage Sensor/', 'Voltage', $descr);
23    $descr = str_replace('Sensor', '', $descr);
24    $descr = str_replace('PMOD', 'PSU', $descr);
25    $descr = preg_replace('/^temperatures /', '', $descr);
26    $descr = preg_replace('/^voltages /', '', $descr);
27    $descr = str_replace('PowerSupply', 'PSU ', $descr);
28
29    return $descr;
30}
31
32/**
33 * Clean port values for html display
34 * Add label to the port array (usually one of ifAlias, ifName, ifDescr)
35 *
36 * @param array $interface
37 * @param null|array $device
38 * @return mixed
39 */
40function cleanPort($interface, $device = null)
41{
42    if (! $interface) {
43        return $interface;
44    }
45    $interface['ifAlias'] = \LibreNMS\Util\Clean::html($interface['ifAlias'], []);
46    $interface['ifName'] = \LibreNMS\Util\Clean::html($interface['ifName'], []);
47    $interface['ifDescr'] = \LibreNMS\Util\Clean::html($interface['ifDescr'], []);
48
49    if (! $device) {
50        $device = device_by_id_cache($interface['device_id']);
51    }
52
53    $os = strtolower($device['os']);
54
55    if (Config::get("os.$os.ifname")) {
56        $interface['label'] = $interface['ifName'];
57
58        if ($interface['ifName'] == '') {
59            $interface['label'] = $interface['ifDescr'];
60        }
61    } elseif (Config::get("os.$os.ifalias")) {
62        $interface['label'] = $interface['ifAlias'];
63    } else {
64        $interface['label'] = $interface['ifDescr'];
65        if (Config::get("os.$os.ifindex")) {
66            $interface['label'] = $interface['label'] . ' ' . $interface['ifIndex'];
67        }
68    }
69
70    if ($device['os'] == 'speedtouch') {
71        [$interface['label']] = explode('thomson', $interface['label']);
72    }
73
74    if (is_array(Config::get('rewrite_if'))) {
75        foreach (Config::get('rewrite_if') as $src => $val) {
76            if (stristr($interface['label'], $src)) {
77                $interface['label'] = $val;
78            }
79        }
80    }
81
82    if (is_array(Config::get('rewrite_if_regexp'))) {
83        foreach (Config::get('rewrite_if_regexp') as $reg => $val) {
84            if (preg_match($reg . 'i', $interface['label'])) {
85                $interface['label'] = preg_replace($reg . 'i', $val, $interface['label']);
86            }
87        }
88    }
89
90    return $interface;
91}
92
93// Specific rewrite functions
94
95function makeshortif($if)
96{
97    $rewrite_shortif = [
98        'tengigabitethernet'  => 'Te',
99        'ten-gigabitethernet' => 'Te',
100        'tengige'             => 'Te',
101        'gigabitethernet'     => 'Gi',
102        'fastethernet'        => 'Fa',
103        'ethernet'            => 'Et',
104        'serial'              => 'Se',
105        'pos'                 => 'Pos',
106        'port-channel'        => 'Po',
107        'atm'                 => 'Atm',
108        'null'                => 'Null',
109        'loopback'            => 'Lo',
110        'dialer'              => 'Di',
111        'vlan'                => 'Vlan',
112        'tunnel'              => 'Tunnel',
113        'serviceinstance'     => 'SI',
114        'dwdm'                => 'DWDM',
115        'bundle-ether'        => 'BE',
116    ];
117
118    $if = \LibreNMS\Util\Rewrite::normalizeIfName($if);
119    $if = strtolower($if);
120    $if = str_replace(array_keys($rewrite_shortif), array_values($rewrite_shortif), $if);
121
122    return $if;
123}
124
125function rewrite_junose_hardware($hardware)
126{
127    $rewrite_junose_hardware = [
128        'juniErx1400' => 'ERX-1400',
129        'juniErx700'  => 'ERX-700',
130        'juniErx1440' => 'ERX-1440',
131        'juniErx705'  => 'ERX-705',
132        'juniErx310'  => 'ERX-310',
133        'juniE320'    => 'E320',
134        'juniE120'    => 'E120',
135        'juniSsx1400' => 'SSX-1400',
136        'juniSsx700'  => 'SSX-700',
137        'juniSsx1440' => 'SSX-1440',
138    ];
139
140    $hardware = str_replace(array_keys($rewrite_junose_hardware), array_values($rewrite_junose_hardware), $hardware);
141
142    return $hardware;
143}
144
145function rewrite_generic_hardware($hardware)
146{
147    $rewrite_GenericHW = [
148        ' Computer Corporation' => '',
149        ' Corporation'          => '',
150        ' Inc.'                 => '',
151    ];
152
153    return str_replace(array_keys($rewrite_GenericHW), array_values($rewrite_GenericHW), $hardware);
154}
155
156function short_hrDeviceDescr($dev)
157{
158    $rewrite_hrDevice = [
159        'GenuineIntel:' => '',
160        'AuthenticAMD:' => '',
161        'Intel(R)'      => '',
162        'CPU'           => '',
163        '(R)'           => '',
164        '  '            => ' ',
165    ];
166
167    $dev = str_replace(array_keys($rewrite_hrDevice), array_values($rewrite_hrDevice), $dev);
168    $dev = preg_replace('/\ +/', ' ', $dev);
169    $dev = trim($dev);
170
171    return $dev;
172}
173
174function short_port_descr($desc)
175{
176    [$desc] = explode('(', $desc);
177    [$desc] = explode('[', $desc);
178    [$desc] = explode('{', $desc);
179    [$desc] = explode('|', $desc);
180    [$desc] = explode('<', $desc);
181    $desc = trim($desc);
182
183    return $desc;
184}
185
186function rewrite_adslLineType($adslLineType)
187{
188    $adslLineTypes = [
189        'noChannel'          => 'No Channel',
190        'fastOnly'           => 'Fastpath',
191        'interleavedOnly'    => 'Interleaved',
192        'fastOrInterleaved'  => 'Fast/Interleaved',
193        'fastAndInterleaved' => 'Fast+Interleaved',
194    ];
195
196    foreach ($adslLineTypes as $type => $text) {
197        if ($adslLineType == $type) {
198            $adslLineType = $text;
199        }
200    }
201
202    return $adslLineType;
203}
204
205function ipmiSensorName($hardwareId, $sensorIpmi)
206{
207    $ipmiSensorsNames = [
208        'HP ProLiant BL460c G6' => [
209            'Temp 1' => 'Ambient zone',
210            'Temp 2' => 'CPU 1',
211            'Temp 3' => 'CPU 2',
212            'Temp 4' => 'Memory zone',
213            'Temp 5' => 'Memory zone',
214            'Temp 6' => 'Memory zone',
215            'Temp 7' => 'System zone',
216            'Temp 8' => 'System zone',
217            'Temp 9' => 'System zone',
218            'Temp 10' => 'Storage zone',
219            'Power Meter' => 'Power usage',
220        ],
221        'HP ProLiant BL460c G1' => [
222            'Temp 1' => 'System zone',
223            'Temp 2' => 'CPU 1 zone',
224            'Temp 3' => 'CPU 1',
225            'Temp 4' => 'CPU 1',
226            'Temp 5' => 'CPU 2 zone',
227            'Temp 6' => 'CPU 2',
228            'Temp 7' => 'CPU 2',
229            'Temp 8' => 'Memory zone',
230            'Temp 9' => 'Ambient zone',
231            'Power Meter' => 'Power usage',
232        ],
233    ];
234
235    if (isset($ipmiSensorsNames[$hardwareId], $ipmiSensorsNames[$hardwareId][$sensorIpmi])) {
236        return $ipmiSensorsNames[$hardwareId][$sensorIpmi];
237    }
238
239    return $sensorIpmi;
240}
241
242/**
243 * @param $descr
244 * @return int
245 */
246function get_nagios_state($descr)
247{
248    switch ($descr) {
249        case 'On':
250        case 'Okay':
251        case 'Ok':
252            return 0;
253            break;
254        case 'Standby':
255        case 'Idle':
256        case 'Maintenance':
257            return 1;
258            break;
259        case 'Under':
260        case 'Over':
261            return 2;
262            break;
263        default:
264            return 3;
265            break;
266    }
267}
268
269/**
270 * @param $state
271 * @return int
272 */
273function apc_relay_state($state)
274{
275    switch ($state) {
276        case 'immediateCloseEMS':
277        case 'immediateOnEMS':
278            return 1;
279            break;
280        case 'immediateOpenEMS':
281        case 'immediateOffEMS':
282            return 2;
283            break;
284    }
285}
286
287/**
288 * @param $value
289 * @return mixed
290 */
291function return_number($value)
292{
293    preg_match('/[\d\.\-]+/', $value, $temp_response);
294    if (! empty($temp_response[0])) {
295        $value = $temp_response[0];
296    }
297
298    return $value;
299}
300
301function parse_entity_state($state, $value)
302{
303    $data = [
304        'entStateOper' => [
305            1 => ['text' => 'unavailable', 'color' => 'default'],
306            2 => ['text' => 'disabled', 'color' => 'danger'],
307            3 => ['text' => 'enabled', 'color' => 'success'],
308            4 => ['text' => 'testing', 'color' => 'warning'],
309        ],
310        'entStateUsage' => [
311            1 => ['text' => 'unavailable', 'color' => 'default'],
312            2 => ['text' => 'idle', 'color' => 'info'],
313            3 => ['text' => 'active', 'color' => 'success'],
314            4 => ['text' => 'busy', 'color' => 'success'],
315        ],
316        'entStateStandby' => [
317            1 => ['text' => 'unavailable', 'color' => 'default'],
318            2 => ['text' => 'hotStandby', 'color' => 'info'],
319            3 => ['text' => 'coldStandby', 'color' => 'info'],
320            4 => ['text' => 'providingService', 'color' => 'success'],
321        ],
322        'entStateAdmin' => [
323            1 => ['text' => 'unknown', 'color' => 'default'],
324            2 => ['text' => 'locked', 'color' => 'info'],
325            3 => ['text' => 'shuttingDown', 'color' => 'warning'],
326            4 => ['text' => 'unlocked', 'color' => 'success'],
327        ],
328    ];
329
330    if (isset($data[$state][$value])) {
331        return $data[$state][$value];
332    }
333
334    return ['text'=>'na', 'color'=>'default'];
335}
336
337function parse_entity_state_alarm($bits)
338{
339    // not sure if this is correct
340    $data = [
341        0 => ['text' => 'unavailable', 'color' => 'default'],
342        1 => ['text' => 'underRepair', 'color' => 'warning'],
343        2 => ['text' => 'critical', 'color' => 'danger'],
344        3 => ['text' => 'major', 'color' => 'danger'],
345        4 => ['text' => 'minor', 'color' => 'info'],
346        5 => ['text' => 'warning', 'color' => 'warning'],
347        6 => ['text' => 'indeterminate', 'color' => 'default'],
348    ];
349
350    $alarms = str_split(base_convert($bits, 16, 2));
351    $active_alarms = array_filter($alarms);
352
353    return array_intersect_key($data, $active_alarms);
354}
355