mirror of
https://github.com/librenms/librenms.git
synced 2024-09-21 10:28:13 +00:00
newdevice: Support Avtech RoomAlert 32E/W and RoomAlert 11E (#7614)
* newdevice: support Avtech RoomAlert 32E/W Move avtech discovery to yaml, took a bit of trickery * More flexibility when checking pre-cached data A little cleanup * Add support for RoomAlert 32E/W external and wish temp sensors Add RoomAlert 11E support (just temp sensors) Updated ROOMALERT32E-MIB
This commit is contained in:
parent
5b42044d04
commit
3dba5cd39d
188
includes/definitions/discovery/avtech.yaml
Normal file
188
includes/definitions/discovery/avtech.yaml
Normal file
@ -0,0 +1,188 @@
|
||||
modules:
|
||||
sensors:
|
||||
temperature:
|
||||
options:
|
||||
divisor: 100
|
||||
skip_values: 0
|
||||
data:
|
||||
- # RoomAlert 3E internal
|
||||
oid: .1.3.6.1.4.1.20916.1.9.1.1.1.1.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.9.1.1.1.1.
|
||||
index: 0
|
||||
descr: .1.3.6.1.4.1.20916.1.9.1.1.1.3.0
|
||||
- # RoomAlert 3E sen1
|
||||
oid: .1.3.6.1.4.1.20916.1.9.1.1.2.1.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.9.1.1.2.1.
|
||||
index: 1
|
||||
descr: .1.3.6.1.4.1.20916.1.9.1.1.2.6.0
|
||||
|
||||
- # RoomAlert 4E internal
|
||||
oid: .1.3.6.1.4.1.20916.1.6.1.1.1.2.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.6.1.1.1.2.
|
||||
divisor: 1
|
||||
index: 0
|
||||
descr: .1.3.6.1.4.1.20916.1.6.1.1.2.1.0
|
||||
- # RoomAlert 4E sen1
|
||||
oid: .1.3.6.1.4.1.20916.1.6.1.2.2.1.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.6.1.2.2.1.
|
||||
divisor: 1
|
||||
index: 1
|
||||
descr: .1.3.6.1.4.1.20916.1.6.1.2.1.6.0
|
||||
- # RoomAlert 4E sen2
|
||||
oid: .1.3.6.1.4.1.20916.1.6.1.2.2.1.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.6.1.2.2.1.
|
||||
divisor: 1
|
||||
index: 2
|
||||
descr: .1.3.6.1.4.1.20916.1.6.1.2.2.6.0
|
||||
|
||||
- # RoomAlert 11E sensor 2
|
||||
oid: .1.3.6.1.4.1.20916.1.3.1.2.1.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.3.1.2.1.
|
||||
divisor: 1
|
||||
index: 2
|
||||
descr: .1.3.6.1.4.1.20916.1.3.1.2.6.0
|
||||
- # RoomAlert 11E sensor 3
|
||||
oid: .1.3.6.1.4.1.20916.1.3.1.3.1.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.3.1.3.1.
|
||||
divisor: 1
|
||||
index: 3
|
||||
descr: .1.3.6.1.4.1.20916.1.3.1.3.6.0
|
||||
- # RoomAlert 11E sensor 4
|
||||
oid: .1.3.6.1.4.1.20916.1.3.1.4.1.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.3.1.4.1.
|
||||
divisor: 1
|
||||
index: 4
|
||||
descr: .1.3.6.1.4.1.20916.1.3.1.4.6.0
|
||||
|
||||
- # RoomAlert 32E/W internal temp
|
||||
oid: .1.3.6.1.4.1.20916.1.8.1.1.1.2.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.8.1.1.1.2.
|
||||
index: 0
|
||||
descr: Internal Temperature
|
||||
- # RoomAlert 32E/W internal heat
|
||||
oid: .1.3.6.1.4.1.20916.1.8.1.1.4.2.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.8.1.1.4.2.
|
||||
index: 1
|
||||
descr: Internal Heat Index
|
||||
- # RoomAlert 32E/W ext temp
|
||||
oid: ra32-ext-temp
|
||||
num_oid: .1.3.6.1.4.1.20916.1.8.1.2.
|
||||
value: value
|
||||
descr: Sensor {{ $id }}
|
||||
- # RoomAlert 32W wish temp
|
||||
oid: ra32-wish-temp
|
||||
num_oid: .1.3.6.1.4.1.20916.1.8.1.4.
|
||||
value: value
|
||||
descr: WiSH {{ $id }} Internal
|
||||
|
||||
- # TemPageR 3E internal
|
||||
oid: .1.3.6.1.4.1.20916.1.7.1.1.1.1.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.7.1.1.1.1.
|
||||
index: 0
|
||||
descr: .1.3.6.1.4.1.20916.1.7.1.1.2.0
|
||||
- # TemPageR 3E sen1
|
||||
oid: .1.3.6.1.4.1.20916.1.7.1.2.1.1.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.7.1.2.1.1.
|
||||
index: 1
|
||||
descr: .1.3.6.1.4.1.20916.1.7.1.2.1.3.0
|
||||
- # TemPageR 3E sen2
|
||||
oid: .1.3.6.1.4.1.20916.1.7.1.2.2.1.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.7.1.2.2.1.
|
||||
index: 2
|
||||
descr: .1.3.6.1.4.1.20916.1.7.1.2.2.3.0
|
||||
|
||||
- # TemPageR 4E internal
|
||||
oid: .1.3.6.1.4.1.20916.1.1.1.1.1.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.1.1.1.1.
|
||||
index: 0
|
||||
descr: Internal
|
||||
high_limit: .1.3.6.1.4.1.20916.1.1.3.1.0
|
||||
low_limit: .1.3.6.1.4.1.20916.1.1.3.2.0
|
||||
- # TemPageR 4E sen1
|
||||
oid: .1.3.6.1.4.1.20916.1.1.1.1.2.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.1.1.1.2.
|
||||
index: 1
|
||||
descr: Sensor 1
|
||||
high_limit: .1.3.6.1.4.1.20916.1.1.3.3.0
|
||||
low_limit: .1.3.6.1.4.1.20916.1.1.3.4.0
|
||||
- # TemPageR 4E sen2
|
||||
oid: .1.3.6.1.4.1.20916.1.1.1.1.3.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.1.1.1.3.
|
||||
index: 2
|
||||
descr: Sensor 2
|
||||
high_limit: .1.3.6.1.4.1.20916.1.1.3.5.0
|
||||
low_limit: .1.3.6.1.4.1.20916.1.1.3.6.0
|
||||
- # TemPageR 4E sen3
|
||||
oid: .1.3.6.1.4.1.20916.1.1.1.1.4.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.1.1.1.4.
|
||||
index: 3
|
||||
descr: Sensor 3
|
||||
high_limit: .1.3.6.1.4.1.20916.1.1.3.7.0
|
||||
low_limit: .1.3.6.1.4.1.20916.1.1.3.8.0
|
||||
humidity:
|
||||
options:
|
||||
divisor: 100
|
||||
data:
|
||||
- # RoomAlert 32E/W
|
||||
oid: .1.3.6.1.4.1.20916.1.8.1.1.2.1.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.8.1.1.2.1.
|
||||
index: 0
|
||||
descr: Internal Humidity
|
||||
voltage:
|
||||
data:
|
||||
- # RoomAlert 32E/W analog
|
||||
oid: ra32-analog
|
||||
num_oid: .1.3.6.1.4.1.20916.1.8.1.1.5.
|
||||
value: value
|
||||
low_limit: 0
|
||||
high_limit: 5
|
||||
descr: Analog {{ $id }}
|
||||
state:
|
||||
data:
|
||||
- # RoomAlert 3E switch
|
||||
oid: .1.3.6.1.4.1.20916.1.9.1.2.1.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.9.1.2.1.
|
||||
index: 0
|
||||
descr: .1.3.6.1.4.1.20916.1.9.1.2.2.0
|
||||
states:
|
||||
- { value: 0, generic: -1, graph: 1, descr: Off }
|
||||
- { value: 1, generic: 0, graph: 1, descr: On }
|
||||
|
||||
- # RoomAlert 4E switch
|
||||
oid: .1.3.6.1.4.1.20916.1.6.1.3.1.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.6.1.3.1.
|
||||
index: 0
|
||||
descr: .1.3.6.1.4.1.20916.1.6.1.3.2.0
|
||||
state_name: switch
|
||||
states:
|
||||
- { value: 0, generic: -1, graph: 1, descr: Off }
|
||||
- { value: 1, generic: 0, graph: 1, descr: On }
|
||||
|
||||
- # RoomAlert 32E/W power
|
||||
oid: .1.3.6.1.4.1.20916.1.8.1.1.3.1.0
|
||||
num_oid: .1.3.6.1.4.1.20916.1.8.1.1.3.1.
|
||||
index: 0
|
||||
descr: Power Source
|
||||
state_name: power
|
||||
states:
|
||||
- { value: 0, generic: 1, graph: 1, descr: Battery }
|
||||
- { value: 1, generic: 0, graph: 1, descr: AC }
|
||||
- # RoomAlert 32E/W relays
|
||||
oid: ra32-relay
|
||||
value: value
|
||||
num_oid: .1.3.6.1.4.1.20916.1.8.1.1.6.
|
||||
descr: Relay {{ $id }}
|
||||
state_name: relay
|
||||
states:
|
||||
- { value: 0, generic: 0, graph: 1, descr: Open }
|
||||
- { value: 1, generic: 0, graph: 1, descr: Closed }
|
||||
- # RoomAlert 32E/W switches
|
||||
oid: ra32-switch
|
||||
value: value
|
||||
num_oid: .1.3.6.1.4.1.20916.1.8.1.3.
|
||||
descr: Switch {{ $id }}
|
||||
state_name: switch
|
||||
states:
|
||||
- { value: 0, generic: -1, graph: 1, descr: Off }
|
||||
- { value: 1, generic: 0, graph: 1, descr: On }
|
||||
|
@ -805,126 +805,6 @@ function check_entity_sensor($string, $device)
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Helper function to improve readability
|
||||
* Can't use mib based polling, because the snmp implentation and mibs are terrible
|
||||
*
|
||||
* @param array $device device array
|
||||
* @param array $sensor array(id, oid, type, descr, descr_oid, min, max, divisor)
|
||||
* @param array $valid valid sensors array
|
||||
* @return bool
|
||||
*/
|
||||
function avtech_add_sensor($device, $sensor, &$valid)
|
||||
{
|
||||
// set the id, must be unique
|
||||
if (isset($sensor['id'])) {
|
||||
$id = $sensor['id'];
|
||||
} else {
|
||||
d_echo('Error: No id set for this sensor' . "\n");
|
||||
return false;
|
||||
}
|
||||
d_echo('Sensor id: ' . $id . "\n");
|
||||
|
||||
|
||||
// set the sensor oid
|
||||
if ($sensor['oid']) {
|
||||
$oid = $sensor['oid'];
|
||||
} else {
|
||||
d_echo('Error: No oid set for this sensor' . "\n");
|
||||
return false;
|
||||
}
|
||||
d_echo('Sensor oid: ' . $oid . "\n");
|
||||
|
||||
// get the type
|
||||
$type = $sensor['type'] ? $sensor['type'] : 'temperature';
|
||||
d_echo('Sensor type: ' . $type . "\n");
|
||||
|
||||
// get the sensor value
|
||||
$value = snmp_get($device, $oid, '-OvQ');
|
||||
// if the sensor doesn't exist abort
|
||||
if ($value === false || ($type == 'temperature' && $value == 0)) {
|
||||
//issue unfortunately some non-existant sensors return 0
|
||||
d_echo('Error: sensor returned no data, skipping' . "\n");
|
||||
return false;
|
||||
}
|
||||
d_echo('Sensor value: ' . $value . "\n");
|
||||
|
||||
$type_name = $device['os'];
|
||||
if ($type == 'switch') {
|
||||
// set up state sensor
|
||||
$type_name .= ucfirst($type);
|
||||
$type = 'state';
|
||||
$state_index_id = create_state_index($type_name);
|
||||
|
||||
//Create State Translation
|
||||
if (isset($state_index_id)) {
|
||||
$states = array(
|
||||
array($state_index_id,'Off',1,0,-1),
|
||||
array($state_index_id,'On',1,1,0),
|
||||
);
|
||||
foreach ($states as $value) {
|
||||
$insert = array(
|
||||
'state_index_id' => $value[0],
|
||||
'state_descr' => $value[1],
|
||||
'state_draw_graph' => $value[2],
|
||||
'state_value' => $value[3],
|
||||
'state_generic_value' => $value[4]
|
||||
);
|
||||
dbInsert($insert, 'state_translations');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// set the description
|
||||
if ($sensor['descr_oid']) {
|
||||
$descr = trim(snmp_get($device, $sensor['descr_oid'], '-OvQ'), '"');
|
||||
} elseif ($sensor['descr']) {
|
||||
$descr = $sensor['descr'];
|
||||
} else {
|
||||
d_echo('Error: No description set for this sensor' . "\n");
|
||||
return false;
|
||||
}
|
||||
d_echo('Sensor description: ' . $descr . "\n");
|
||||
|
||||
// set divisor
|
||||
if ($sensor['divisor']) {
|
||||
$divisor = $sensor['divisor'];
|
||||
} elseif ($type == 'temperature') {
|
||||
$divisor = 100;
|
||||
} else {
|
||||
$divisor = 1;
|
||||
}
|
||||
d_echo('Sensor divisor: ' . $divisor . "\n");
|
||||
|
||||
|
||||
// set min for alarm
|
||||
if ($sensor['min_oid']) {
|
||||
$min = snmp_get($device, $sensor['min_oid'], '-OvQ') / $divisor;
|
||||
} else {
|
||||
$min = null;
|
||||
}
|
||||
d_echo('Sensor alarm min: ' . $min . "\n");
|
||||
|
||||
// set max for alarm
|
||||
if ($sensor['max_oid']) {
|
||||
$max = snmp_get($device, $sensor['max_oid'], '-OvQ') / $divisor;
|
||||
} else {
|
||||
$max = null;
|
||||
}
|
||||
d_echo('Sensor alarm max: ' . $max . "\n");
|
||||
|
||||
// add the sensor
|
||||
discover_sensor($valid['sensor'], $type, $device, $oid, $id, $type_name, $descr, $divisor, '1', $min, null, null, $max, $value/$divisor);
|
||||
|
||||
if ($type == 'state') {
|
||||
create_sensor_to_state_index($device, $type_name, $id);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the device divisor, account for device specific quirks
|
||||
* The default divisor is 10
|
||||
@ -1084,7 +964,6 @@ function discovery_process(&$valid, $device, $sensor_type, $pre_cache)
|
||||
foreach ($device['dynamic_discovery']['modules']['sensors'][$sensor_type]['data'] as $data) {
|
||||
$tmp_name = $data['oid'];
|
||||
$raw_data = (array)$pre_cache[$tmp_name];
|
||||
$cached_data = $pre_cache['__cached'] ?: array();
|
||||
|
||||
d_echo("Data $tmp_name: ");
|
||||
d_echo($raw_data);
|
||||
@ -1106,7 +985,7 @@ function discovery_process(&$valid, $device, $sensor_type, $pre_cache)
|
||||
} elseif ($sensor_type === 'state') {
|
||||
// translate string states to values (poller does this as well)
|
||||
$states = array_column($data['states'], 'value', 'descr');
|
||||
$value = isset($states[$snmp_data[$data_name]]) ? $states[$snmp_data[$data_name]] : false;
|
||||
$value = isset($states[$tmp_value]) ? $states[$tmp_value] : false;
|
||||
} else {
|
||||
$value = false;
|
||||
}
|
||||
@ -1115,28 +994,26 @@ function discovery_process(&$valid, $device, $sensor_type, $pre_cache)
|
||||
|
||||
if (can_skip_sensor($value, $data, $sensor_options) === false && is_numeric($value)) {
|
||||
$oid = $data['num_oid'] . $index;
|
||||
if (isset($snmp_data[$data['descr']])) {
|
||||
$descr = $snmp_data[$data['descr']];
|
||||
} else {
|
||||
|
||||
// process the description
|
||||
$descr = dynamic_discovery_get_value('descr', $index, $data, $pre_cache);
|
||||
if (is_null($descr)) {
|
||||
$descr = str_replace('{{ $index }}', $index, $data['descr']);
|
||||
preg_match_all('/({{ [\$a-zA-Z0-9]+ }})/', $descr, $tmp_var, PREG_PATTERN_ORDER);
|
||||
$tmp_vars = $tmp_var[0];
|
||||
foreach ($tmp_vars as $k => $tmp_var) {
|
||||
$tmp_var = preg_replace('/({{ | }}|\$)/', '', $tmp_var);
|
||||
if (isset($snmp_data[$tmp_var])) {
|
||||
$descr = str_replace("{{ \$$tmp_var }}", $snmp_data[$tmp_var], $descr);
|
||||
}
|
||||
if (isset($cached_data[$index][$tmp_var])) {
|
||||
$descr = str_replace("{{ \$$tmp_var }}", $cached_data[$index][$tmp_var], $descr);
|
||||
preg_match_all('/{{ \$([a-zA-Z0-9.]+) }}/', $descr, $matches);
|
||||
foreach ($matches[1] as $tmp_var) {
|
||||
$replace = dynamic_discovery_get_value($tmp_var, $index, $data, $pre_cache, null);
|
||||
if (!is_null($replace)) {
|
||||
$descr = str_replace("{{ \$$tmp_var }}", $replace, $descr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$divisor = $data['divisor'] ?: ($sensor_options['divisor'] ?: 1);
|
||||
$multiplier = $data['multiplier'] ?: ($sensor_options['multiplier'] ?: 1);
|
||||
$low_limit = is_numeric($data['low_limit']) ? $data['low_limit'] : ($snmp_data[$data['low_limit']] ?: 'null');
|
||||
$low_warn_limit = is_numeric($data['low_warn_limit']) ? $data['low_warn_limit'] : ($snmp_data[$data['low_warn_limit']] ?: 'null');
|
||||
$warn_limit = is_numeric($data['warn_limit']) ? $data['warn_limit'] : ($snmp_data[$data['warn_limit']] ?: 'null');
|
||||
$high_limit = is_numeric($data['high_limit']) ? $data['high_limit'] : ($snmp_data[$data['high_limit']] ?: 'null');
|
||||
$low_limit = is_numeric($data['low_limit']) ? $data['low_limit'] : dynamic_discovery_get_value('low_limit', $index, $data, $pre_cache, 'null');
|
||||
$low_warn_limit = is_numeric($data['low_warn_limit']) ? $data['low_warn_limit'] : dynamic_discovery_get_value('low_warn_limit', $index, $data, $pre_cache, 'null');
|
||||
$warn_limit = is_numeric($data['warn_limit']) ? $data['warn_limit'] : dynamic_discovery_get_value('warn_limit', $index, $data, $pre_cache, 'null');
|
||||
$high_limit = is_numeric($data['high_limit']) ? $data['high_limit'] : dynamic_discovery_get_value('high_limit', $index, $data, $pre_cache, 'null');
|
||||
|
||||
$sensor_name = $device['os'];
|
||||
if ($sensor_type === 'state') {
|
||||
@ -1163,6 +1040,41 @@ function discovery_process(&$valid, $device, $sensor_type, $pre_cache)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function for dynamic discovery to search for data from pre_cached snmp data
|
||||
*
|
||||
* @param string $name The name of the field from the discovery data or just an oid
|
||||
* @param int $index The index of the current sensor
|
||||
* @param array $discovery_data The discovery data for the current sensor
|
||||
* @param array $pre_cache all pre-cached snmp data
|
||||
* @param mixed $default The default value to return if data is not found
|
||||
* @return mixed
|
||||
*/
|
||||
function dynamic_discovery_get_value($name, $index, $discovery_data, $pre_cache, $default = null)
|
||||
{
|
||||
if (isset($discovery_data[$name])) {
|
||||
$name = $discovery_data[$name];
|
||||
}
|
||||
|
||||
if (isset($pre_cache[$discovery_data['oid']][$index][$name])) {
|
||||
return $pre_cache[$discovery_data['oid']][$index][$name];
|
||||
}
|
||||
|
||||
if (isset($pre_cache[$name])) {
|
||||
if (is_array($pre_cache[$name])) {
|
||||
if (count($pre_cache[$name]) === 1) {
|
||||
return current($pre_cache[$name]);
|
||||
} elseif (isset($pre_cache[$index][$name])) {
|
||||
return $pre_cache[$index][$name];
|
||||
}
|
||||
} else {
|
||||
return $pre_cache[$name];
|
||||
}
|
||||
}
|
||||
|
||||
return $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $types
|
||||
* @param $device
|
||||
|
@ -12,24 +12,19 @@ if (is_file($pre_cache_file)) {
|
||||
d_echo($pre_cache);
|
||||
}
|
||||
|
||||
if (isset($device['dynamic_discovery']['modules']['sensors'])) {
|
||||
// TODO change to exclude os with pre-cache php file, but just exclude them by hand for now (like avtech)
|
||||
if (isset($device['dynamic_discovery']['modules']['sensors']) && $device['os'] != 'avtech') {
|
||||
foreach ($device['dynamic_discovery']['modules']['sensors'] as $key => $data_array) {
|
||||
foreach ($data_array['data'] as $data) {
|
||||
foreach ((array)$data['oid'] as $oid) {
|
||||
$tmp_name = $oid;
|
||||
if (!isset($pre_cache[$tmp_name])) {
|
||||
if (!isset($pre_cache[$oid])) {
|
||||
if (isset($data['snmp_flags'])) {
|
||||
$snmp_flag = $data['snmp_flags'];
|
||||
} else {
|
||||
$snmp_flag = '-OeQUs';
|
||||
}
|
||||
$snmp_flag .= ' -Ih';
|
||||
if ($key === 'pre-cache') {
|
||||
$array_data = '__cached';
|
||||
} else {
|
||||
$array_data = $tmp_name;
|
||||
}
|
||||
$pre_cache[$array_data] = snmpwalk_cache_oid($device, $oid, $pre_cache[$array_data], $device['dynamic_discovery']['mib'], null, $snmp_flag);
|
||||
$pre_cache[$oid] = snmpwalk_cache_oid($device, $oid, $pre_cache[$array_data], $device['dynamic_discovery']['mib'], null, $snmp_flag);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
61
includes/discovery/sensors/pre-cache/avtech.inc.php
Normal file
61
includes/discovery/sensors/pre-cache/avtech.inc.php
Normal file
@ -0,0 +1,61 @@
|
||||
<?php
|
||||
/**
|
||||
* avtech.inc.php
|
||||
*
|
||||
* Grab all data under avtech enterprise oid and process it for yaml consumption
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* @package LibreNMS
|
||||
* @link http://librenms.org
|
||||
* @copyright 2017 Tony Murray
|
||||
* @author Tony Murray <murraytony@gmail.com>
|
||||
*/
|
||||
|
||||
|
||||
// table name => regex (first group is index, second group is id)
|
||||
$virtual_tables = array(
|
||||
'ra32-analog' => '/\.1\.3\.6\.1\.4\.1\.20916\.1\.8\.1\.1\.5\.((\d+)\.0)/',
|
||||
'ra32-relay' => '/\.1\.3\.6\.1\.4\.1\.20916\.1\.8\.1\.1\.6\.((\d+)\.0)/',
|
||||
'ra32-ext-temp' => '/\.1\.3\.6\.1\.4\.1\.20916\.1\.8\.1\.2\.((\d+)\.1\.0)/',
|
||||
'ra32-switch' => '/\.1\.3\.6\.1\.4\.1\.20916\.1\.8\.1\.3\.((\d+)\.0)/',
|
||||
'ra32-wish-temp' => '/\.1\.3\.6\.1\.4\.1\.20916\.1\.8\.1\.4\.((\d+)\.4\.1\.2\.0)/',
|
||||
);
|
||||
|
||||
$data = snmp_walk($device, '.1.3.6.1.4.1.20916.1', '-OQn');
|
||||
foreach (explode(PHP_EOL, $data) as $line) {
|
||||
list($oid, $value) = explode(' = ', $line);
|
||||
|
||||
$processed = false;
|
||||
foreach ($virtual_tables as $vt_name => $vt_regex) {
|
||||
if (preg_match($vt_regex, $oid, $matches)) {
|
||||
$index = $matches[1];
|
||||
$id = $matches[2];
|
||||
|
||||
$pre_cache[$vt_name][$index] = array(
|
||||
'value' => $value,
|
||||
'id' => $id,
|
||||
);
|
||||
|
||||
$processed = true;
|
||||
break; // skip rest
|
||||
}
|
||||
}
|
||||
|
||||
if (!$processed) {
|
||||
$pre_cache[$oid] = array($value);
|
||||
}
|
||||
}
|
||||
|
||||
unset($data);
|
@ -1,26 +0,0 @@
|
||||
<?php
|
||||
|
||||
echo 'AVTECH: ';
|
||||
if (ends_with($device['sysObjectID'], '.20916.1.9')) {
|
||||
// RoomAlert 3E
|
||||
$device_oid = '.1.3.6.1.4.1.20916.1.9.';
|
||||
|
||||
$switch = array(
|
||||
'id' => 0,
|
||||
'type' => 'switch',
|
||||
'oid' => $device_oid.'1.2.1.0',
|
||||
'descr_oid' => $device_oid.'1.2.2.0',
|
||||
);
|
||||
avtech_add_sensor($device, $switch, $valid);
|
||||
} elseif (ends_with($device['sysObjectID'], '.20916.1.6')) {
|
||||
// RoomAlert 4E
|
||||
$device_oid = '.1.3.6.1.4.1.20916.1.6.';
|
||||
|
||||
$switch = array(
|
||||
'id' => 0,
|
||||
'type' => 'switch',
|
||||
'oid' => $device_oid.'1.3.1.0',
|
||||
'descr_oid' => $device_oid.'1.3.2.0',
|
||||
);
|
||||
avtech_add_sensor($device, $switch, $valid);
|
||||
}
|
@ -1,112 +0,0 @@
|
||||
<?php
|
||||
|
||||
echo 'AVTECH: ';
|
||||
if (ends_with($device['sysObjectID'], '.20916.1.7')) {
|
||||
// TemPageR 3E
|
||||
$device_oid = '.1.3.6.1.4.1.20916.1.7.';
|
||||
|
||||
$internal = array(
|
||||
'id' => 0,
|
||||
'oid' => $device_oid.'1.1.1.1.0',
|
||||
'descr_oid' => $device_oid.'1.1.2.0',
|
||||
);
|
||||
avtech_add_sensor($device, $internal, $valid);
|
||||
|
||||
$sen1 = array(
|
||||
'id' => 1,
|
||||
'oid' => $device_oid.'1.2.1.1.0',
|
||||
'descr_oid' => $device_oid.'1.2.1.3.0',
|
||||
);
|
||||
avtech_add_sensor($device, $sen1, $valid);
|
||||
|
||||
$sen2 = array(
|
||||
'id' => 2,
|
||||
'oid' => $device_oid.'1.2.2.1.0',
|
||||
'descr_oid' => $device_oid.'1.2.2.3.0',
|
||||
);
|
||||
avtech_add_sensor($device, $sen2, $valid);
|
||||
} elseif (ends_with($device['sysObjectID'], '.20916.1.9')) {
|
||||
// RoomAlert 3E
|
||||
$device_oid = '.1.3.6.1.4.1.20916.1.9.';
|
||||
|
||||
$internal = array(
|
||||
'id' => 0,
|
||||
'oid' => $device_oid.'1.1.1.1.0',
|
||||
'descr_oid' => $device_oid.'1.1.1.3.0',
|
||||
);
|
||||
avtech_add_sensor($device, $internal, $valid);
|
||||
|
||||
$sen1 = array(
|
||||
'id' => 1,
|
||||
'oid' => $device_oid.'1.1.2.1.0',
|
||||
'descr_oid' => $device_oid.'1.1.2.6.0',
|
||||
);
|
||||
avtech_add_sensor($device, $sen1, $valid);
|
||||
} elseif (ends_with($device['sysObjectID'], '.20916.1.1')) {
|
||||
// TemPageR 4E
|
||||
$device_oid = '.1.3.6.1.4.1.20916.1.1.';
|
||||
|
||||
$internal = array(
|
||||
'id' => 0,
|
||||
'oid' => $device_oid.'1.1.1.0',
|
||||
'descr' => 'Internal',
|
||||
'max_oid' => $device_oid.'3.1.0',
|
||||
'min_oid' => $device_oid.'3.2.0',
|
||||
);
|
||||
avtech_add_sensor($device, $internal, $valid);
|
||||
|
||||
$sen1 = array(
|
||||
'id' => 1,
|
||||
'oid' => $device_oid.'1.1.2.0',
|
||||
'descr' => 'Sensor 1',
|
||||
'max_oid' => $device_oid.'3.3.0',
|
||||
'min_oid' => $device_oid.'3.4.0',
|
||||
);
|
||||
avtech_add_sensor($device, $sen1, $valid);
|
||||
|
||||
$sen2 = array(
|
||||
'id' => 2,
|
||||
'oid' => $device_oid.'1.1.3.0',
|
||||
'descr' => 'Sensor 2',
|
||||
'max_oid' => $device_oid.'3.5.0',
|
||||
'min_oid' => $device_oid.'3.6.0',
|
||||
);
|
||||
avtech_add_sensor($device, $sen2, $valid);
|
||||
|
||||
$sen3 = array(
|
||||
'id' => 3,
|
||||
'oid' => $device_oid.'1.1.4.0',
|
||||
'descr' => 'Sensor 3',
|
||||
'max_oid' => $device_oid.'3.7.0',
|
||||
'min_oid' => $device_oid.'3.8.0',
|
||||
);
|
||||
avtech_add_sensor($device, $sen3, $valid);
|
||||
} elseif (ends_with($device['sysObjectID'], '.20916.1.6')) {
|
||||
// RoomAlert 4E
|
||||
$device_oid = '.1.3.6.1.4.1.20916.1.6.';
|
||||
$divisor = 1;
|
||||
|
||||
$internal = array(
|
||||
'id' => 0,
|
||||
'oid' => $device_oid.'1.1.1.2.0',
|
||||
'descr_oid' => $device_oid.'1.1.2.1.0',
|
||||
'divisor' => $divisor,
|
||||
);
|
||||
avtech_add_sensor($device, $internal, $valid);
|
||||
|
||||
$sen1 = array(
|
||||
'id' => 1,
|
||||
'oid' => $device_oid.'1.2.2.1.0',
|
||||
'descr_oid' => $device_oid.'1.2.1.6.0',
|
||||
'divisor' => $divisor,
|
||||
);
|
||||
avtech_add_sensor($device, $sen1, $valid);
|
||||
|
||||
$sen2 = array(
|
||||
'id' => 2,
|
||||
'oid' => $device_oid.'1.2.2.1.0',
|
||||
'descr_oid' => $device_oid.'1.2.2.6.0',
|
||||
'divisor' => $divisor,
|
||||
);
|
||||
avtech_add_sensor($device, $sen2, $valid);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -67,4 +67,41 @@ sdfsd
|
||||
|
||||
$this->assertSame($expected, linkify($input));
|
||||
}
|
||||
|
||||
public function testDynamicDiscoveryGetValue()
|
||||
{
|
||||
$pre_cache = array(
|
||||
'firstdata' => array(
|
||||
0 => array('temp' => 1),
|
||||
1 => array('temp'=> 2),
|
||||
),
|
||||
'high' => array(
|
||||
0 => array('high' => 3),
|
||||
1 => array('high' => 4),
|
||||
),
|
||||
'table' => array(
|
||||
0 => array('first' => 5, 'second' => 6),
|
||||
1 => array('first' => 7, 'second' => 8),
|
||||
),
|
||||
'single' => array('something' => 9),
|
||||
'oneoff' => 10,
|
||||
);
|
||||
|
||||
$data = array('value' => 'temp', 'oid' => 'firstdata');
|
||||
$this->assertNull(dynamic_discovery_get_value('missing', 0, $data, $pre_cache));
|
||||
$this->assertSame('yar', dynamic_discovery_get_value('default', 0, $data, $pre_cache, 'yar'));
|
||||
$this->assertSame(2, dynamic_discovery_get_value('value', 1, $data, $pre_cache));
|
||||
|
||||
$data = array('oid' => 'high');
|
||||
$this->assertSame(3, dynamic_discovery_get_value('high', 0, $data, $pre_cache));
|
||||
|
||||
$data = array('oid' => 'table');
|
||||
$this->assertSame(5, dynamic_discovery_get_value('first', 0, $data, $pre_cache));
|
||||
$this->assertSame(7, dynamic_discovery_get_value('first', 1, $data, $pre_cache));
|
||||
$this->assertSame(6, dynamic_discovery_get_value('second', 0, $data, $pre_cache));
|
||||
$this->assertSame(8, dynamic_discovery_get_value('second', 1, $data, $pre_cache));
|
||||
|
||||
$this->assertSame(9, dynamic_discovery_get_value('single', 0, $data, $pre_cache));
|
||||
$this->assertSame(10, dynamic_discovery_get_value('oneoff', 3, $data, $pre_cache));
|
||||
}
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ global $config;
|
||||
|
||||
$install_dir = realpath(__DIR__ . '/..');
|
||||
|
||||
$init_modules = array('web');
|
||||
$init_modules = array('web', 'discovery');
|
||||
|
||||
if (!getenv('SNMPSIM')) {
|
||||
$init_modules[] = 'mocksnmp';
|
||||
|
Loading…
Reference in New Issue
Block a user