1<?php
2/*
3 * LibreNMS
4 *
5 * Copyright (c) 2016 Søren Friis Rosiak <sorenrosiak@gmail.com>
6 * This program is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or (at your
9 * option) any later version.  Please see LICENSE.txt at the top level of
10 * the source code distribution for details.
11 */
12
13$tables = [
14    // One could add more entrys from deviceGroup, but this will do as a start
15    ['processorDeviceStatusTable', '.1.3.6.1.4.1.674.10892.1.1100.32.1.5.', 'processorDeviceStatusStatus', 'processorDeviceStatusLocationName', 'MIB-Dell-10892'],
16    ['memoryDeviceTable', '.1.3.6.1.4.1.674.10892.1.1100.50.1.5.', 'memoryDeviceStatus', 'memoryDeviceLocationName', 'MIB-Dell-10892'],
17    ['powerSupplyTable', '.1.3.6.1.4.1.674.10892.1.600.12.1.5.', 'powerSupplyStatus', 'powerSupplyLocationName', 'MIB-Dell-10892'],
18    ['intrusionTable', '.1.3.6.1.4.1.674.10892.1.300.70.1.5.', 'intrusionStatus', 'Intrusion', 'MIB-Dell-10892'],
19    ['controllerTable', '.1.3.6.1.4.1.674.10893.1.20.130.1.1.5.', 'controllerState', 'controllerName', 'StorageManagement-MIB', 'dell'],
20    ['arrayDiskTable', '.1.3.6.1.4.1.674.10893.1.20.130.4.1.4.', 'arrayDiskState', 'arrayDiskName', 'StorageManagement-MIB', 'dell'],
21    ['virtualDiskTable', '.1.3.6.1.4.1.674.10893.1.20.140.1.1.4.', 'virtualDiskState', 'virtualDiskDeviceName', 'StorageManagement-MIB', 'dell'],
22    ['batteryTable', '.1.3.6.1.4.1.674.10893.1.20.130.15.1.4.', 'batteryState', 'batteryName', 'StorageManagement-MIB', 'dell'],
23];
24
25foreach ($tables as $tablevalue) {
26    $temp = snmpwalk_cache_multi_oid($device, $tablevalue[0], [], $tablevalue[4]);
27    $cur_oid = $tablevalue[1];
28
29    if (is_array($temp)) {
30        //Create State Index
31        $state_name = 'dell.' . $tablevalue[2];
32        if ($state_name == 'dell.processorDeviceStatusStatus' || $state_name == 'dell.memoryDeviceStatus' || $state_name == 'dell.powerSupplyStatus' || $state_name == 'dell.intrusionStatus') {
33            $states = [
34                ['value' => 1, 'generic' => 3, 'graph' => 0, 'descr' => 'other'],
35                ['value' => 2, 'generic' => 3, 'graph' => 0, 'descr' => 'unknown'],
36                ['value' => 3, 'generic' => 0, 'graph' => 0, 'descr' => 'ok'],
37                ['value' => 4, 'generic' => 1, 'graph' => 0, 'descr' => 'nonCritical'],
38                ['value' => 5, 'generic' => 2, 'graph' => 0, 'descr' => 'critical'],
39                ['value' => 6, 'generic' => 2, 'graph' => 0, 'descr' => 'nonRecoverable'],
40            ];
41        } elseif ($state_name == 'dell.controllerState') {
42            $states = [
43                ['value' => 1, 'generic' => 0, 'graph' => 0, 'descr' => 'ready'],
44                ['value' => 2, 'generic' => 2, 'graph' => 0, 'descr' => 'failed'],
45                ['value' => 3, 'generic' => 0, 'graph' => 0, 'descr' => 'online'],
46                ['value' => 4, 'generic' => 1, 'graph' => 0, 'descr' => 'offline'],
47                ['value' => 6, 'generic' => 2, 'graph' => 0, 'descr' => 'degraded'],
48            ];
49        } elseif ($state_name == 'dell.arrayDiskState') {
50            $states = [
51                ['value' => 1, 'generic' => 0, 'graph' => 0, 'descr' => 'ready'],
52                ['value' => 2, 'generic' => 2, 'graph' => 0, 'descr' => 'failed'],
53                ['value' => 3, 'generic' => 0, 'graph' => 0, 'descr' => 'online'],
54                ['value' => 4, 'generic' => 2, 'graph' => 0, 'descr' => 'offline'],
55                ['value' => 5, 'generic' => 2, 'graph' => 0, 'descr' => 'degraded'],
56                ['value' => 6, 'generic' => 1, 'graph' => 0, 'descr' => 'recovering'],
57                ['value' => 7, 'generic' => 1, 'graph' => 0, 'descr' => 'removed'],
58                ['value' => 8, 'generic' => 3, 'graph' => 0, 'descr' => 'non-raid'],
59                ['value' => 9, 'generic' => 1, 'graph' => 0, 'descr' => 'notReady'],
60                ['value' => 10, 'generic' => 1, 'graph' => 0, 'descr' => 'resynching'],
61                ['value' => 11, 'generic' => 1, 'graph' => 0, 'descr' => 'replacing'],
62                ['value' => 12, 'generic' => 1, 'graph' => 0, 'descr' => 'spinningDown'],
63                ['value' => 13, 'generic' => 1, 'graph' => 0, 'descr' => 'rebuild'],
64                ['value' => 14, 'generic' => 1, 'graph' => 0, 'descr' => 'noMedia'],
65                ['value' => 15, 'generic' => 1, 'graph' => 0, 'descr' => 'formatting'],
66                ['value' => 16, 'generic' => 1, 'graph' => 0, 'descr' => 'diagnostics'],
67                ['value' => 17, 'generic' => 2, 'graph' => 0, 'descr' => 'predictiveFailure'],
68                ['value' => 18, 'generic' => 1, 'graph' => 0, 'descr' => 'initializing'],
69                ['value' => 19, 'generic' => 1, 'graph' => 0, 'descr' => 'foreign'],
70                ['value' => 20, 'generic' => 1, 'graph' => 0, 'descr' => 'clear'],
71                ['value' => 21, 'generic' => 2, 'graph' => 0, 'descr' => 'unsupported'],
72                ['value' => 22, 'generic' => 2, 'graph' => 0, 'descr' => 'incompatible'],
73                ['value' => 23, 'generic' => 2, 'graph' => 0, 'descr' => 'readOnly'],
74            ];
75        } elseif ($state_name == 'dell.virtualDiskState') {
76            $states = [
77                ['value' => 0, 'generic' => 3, 'graph' => 0, 'descr' => 'unknown'],
78                ['value' => 1, 'generic' => 0, 'graph' => 1, 'descr' => 'ready'],
79                ['value' => 2, 'generic' => 2, 'graph' => 1, 'descr' => 'failed'],
80                ['value' => 3, 'generic' => 1, 'graph' => 1, 'descr' => 'online'],
81                ['value' => 4, 'generic' => 2, 'graph' => 1, 'descr' => 'offline'],
82                ['value' => 6, 'generic' => 2, 'graph' => 1, 'descr' => 'degraded'],
83                ['value' => 7, 'generic' => 1, 'graph' => 1, 'descr' => 'verifying'],
84                ['value' => 15, 'generic' => 1, 'graph' => 1, 'descr' => 'resynching'],
85                ['value' => 16, 'generic' => 1, 'graph' => 1, 'descr' => 'regenerating'],
86                ['value' => 18, 'generic' => 2, 'graph' => 1, 'descr' => 'failedRedundancy'],
87                ['value' => 24, 'generic' => 1, 'graph' => 1, 'descr' => 'rebuilding'],
88                ['value' => 26, 'generic' => 1, 'graph' => 1, 'descr' => 'formatting'],
89                ['value' => 32, 'generic' => 1, 'graph' => 1, 'descr' => 'reconstructing'],
90                ['value' => 35, 'generic' => 1, 'graph' => 1, 'descr' => 'initializing'],
91                ['value' => 36, 'generic' => 1, 'graph' => 1, 'descr' => 'backgroundInit'],
92                ['value' => 52, 'generic' => 2, 'graph' => 1, 'descr' => 'permanentlyDegraded'],
93            ];
94        } elseif ($state_name == 'dell.batteryState') {
95            $states = [
96                ['value' => 1, 'generic' => 0, 'graph' => 0, 'descr' => 'ready'],
97                ['value' => 2, 'generic' => 2, 'graph' => 1, 'descr' => 'failed'],
98                ['value' => 6, 'generic' => 2, 'graph' => 1, 'descr' => 'degraded'],
99                ['value' => 7, 'generic' => 1, 'graph' => 1, 'descr' => 'reconditioning'],
100                ['value' => 9, 'generic' => 1, 'graph' => 1, 'descr' => 'high'],
101                ['value' => 10, 'generic' => 1, 'graph' => 1, 'descr' => 'low'],
102                ['value' => 12, 'generic' => 1, 'graph' => 1, 'descr' => 'charging'],
103                ['value' => 21, 'generic' => 2, 'graph' => 1, 'descr' => 'missing'],
104                ['value' => 36, 'generic' => 1, 'graph' => 1, 'descr' => 'learning'],
105            ];
106        }
107        create_state_index($state_name, $states);
108
109        foreach ($temp as $index => $entry) {
110            if (strpos($index, '54.') === false) { //Because Dell is buggy
111                if ($state_name == 'dell.intrusionStatus') {
112                    $descr = $tablevalue[3];
113                } elseif ($state_name == 'dell.batteryState') {
114                    $descr = str_replace('"', '', snmp_get($device, 'batteryConnectionControllerName.' . $index . '', '-Ovqn', $tablevalue[4])) . ' - ' . $temp[$index][$tablevalue[3]];
115                } elseif ($state_name == 'dell.arrayDiskState') {
116                    $descr = str_replace('"', '', snmp_get($device, 'arrayDiskEnclosureConnectionEnclosureName.' . $index . '', '-Ovqn', $tablevalue[4])) . ' - ' . $temp[$index][$tablevalue[3]];
117                } else {
118                    $descr = strip_tags($temp[$index][$tablevalue[3]]); // Use clean as virtualDiskDeviceName is user defined
119                }
120                //Discover Sensors
121                discover_sensor($valid['sensor'], 'state', $device, $cur_oid . $index, $index, $state_name, $descr, 1, 1, null, null, null, null, $temp[$index][$tablevalue[2]], 'snmp', $index);
122
123                //Create Sensor To State Index
124                create_sensor_to_state_index($device, $state_name, $index);
125            }
126        }
127    }
128}
129