mirror of
https://github.com/librenms/librenms.git
synced 2024-09-22 10:58:42 +00:00
85b19ce99e
* Add support for IPMIv2 Kg Key in device settings Some devices require that the Kg key be specified. An example would be a server of mine, a Cisco C220 M3. Otherwise, it would error out with `Error: Unable to establish IPMI v2 / RMCP+ session`. With verbose output enabled, the connection attempt would stop at `RAKP 4 message has invalid integrity check value`. * Add Kg key support in Poller * Sanitize Kg key from debug output * Added Kg key support for discovery process And it seems to work like a charm. New fields, such as fan tachometers, were added in automatically. * Applying StyleCI changes
94 lines
3.8 KiB
PHP
94 lines
3.8 KiB
PHP
<?php
|
|
|
|
use LibreNMS\Config;
|
|
use LibreNMS\RRD\RrdDefinition;
|
|
|
|
$ipmi_rows = dbFetchRows("SELECT * FROM sensors WHERE device_id = ? AND poller_type='ipmi'", [$device['device_id']]);
|
|
|
|
if (is_array($ipmi_rows)) {
|
|
d_echo($ipmi_rows);
|
|
|
|
if (isset($device['attribs']['ipmi_hostname'])) {
|
|
$ipmi['host'] = $device['attribs']['ipmi_hostname'];
|
|
$ipmi['port'] = filter_var($device['attribs']['ipmi_port'], FILTER_VALIDATE_INT) ? $device['attribs']['ipmi_port'] : '623';
|
|
$ipmi['user'] = $device['attribs']['ipmi_username'];
|
|
$ipmi['password'] = $device['attribs']['ipmi_password'];
|
|
$ipmi['kg_key'] = $device['attribs']['ipmi_kg_key'];
|
|
$ipmi['type'] = $device['attribs']['ipmi_type'];
|
|
|
|
echo 'Fetching IPMI sensor data...';
|
|
|
|
$cmd = [Config::get('ipmitool', 'ipmitool')];
|
|
if (Config::get('own_hostname') != $device['hostname'] || $ipmi['host'] != 'localhost') {
|
|
if (empty($ipmi['kg_key']) || is_null($ipmi['kg_key'])) {
|
|
array_push($cmd, '-H', $ipmi['host'], '-U', $ipmi['user'], '-P', $ipmi['password'], '-L', 'USER', '-p', $ipmi['port']);
|
|
} else {
|
|
array_push($cmd, '-H', $ipmi['host'], '-U', $ipmi['user'], '-P', $ipmi['password'], '-L', 'USER', '-p', $ipmi['port'], '-y', $ipmi['kg_key']);
|
|
}
|
|
}
|
|
|
|
// Check to see if we know which IPMI interface to use
|
|
// so we dont use wrong arguments for ipmitool
|
|
if ($ipmi['type'] != '') {
|
|
array_push($cmd, '-I', $ipmi['type'], '-c', 'sdr');
|
|
$results = external_exec($cmd);
|
|
d_echo($results);
|
|
echo " done.\n";
|
|
} else {
|
|
echo " type not yet discovered.\n";
|
|
}
|
|
|
|
foreach (explode("\n", $results) as $row) {
|
|
[$desc, $value, $type, $status] = explode(',', $row);
|
|
$desc = trim($desc, ' ');
|
|
$ipmi_unit_type = Config::get("ipmi_unit.$type");
|
|
|
|
// SDR records can include hexadecimal values, identified by an h
|
|
// suffix (like "93h" for 0x93). Convert them to decimal.
|
|
if (preg_match('/^([0-9A-Fa-f]+)h$/', $value, $matches)) {
|
|
$value = hexdec($matches[1]);
|
|
}
|
|
|
|
$ipmi_sensor[$desc][$ipmi_unit_type]['value'] = $value;
|
|
$ipmi_sensor[$desc][$ipmi_unit_type]['unit'] = $type;
|
|
}
|
|
|
|
foreach ($ipmi_rows as $ipmisensors) {
|
|
echo 'Updating IPMI sensor ' . $ipmisensors['sensor_descr'] . '... ';
|
|
|
|
$sensor_value = $ipmi_sensor[$ipmisensors['sensor_descr']][$ipmisensors['sensor_class']]['value'];
|
|
$unit = $ipmi_sensor[$ipmisensors['sensor_descr']][$ipmisensors['sensor_class']]['unit'];
|
|
|
|
echo "$sensor_value $unit\n";
|
|
|
|
$rrd_name = get_sensor_rrd_name($device, $ipmisensors);
|
|
$rrd_def = RrdDefinition::make()->addDataset('sensor', 'GAUGE', -20000, 20000);
|
|
|
|
$fields = [
|
|
'sensor' => $sensor_value,
|
|
];
|
|
|
|
$tags = [
|
|
'sensor_class' => $ipmisensors['sensor_class'],
|
|
'sensor_type' => $ipmisensors['sensor_type'],
|
|
'sensor_descr' => $ipmisensors['sensor_descr'],
|
|
'sensor_index' => $ipmisensors['sensor_index'],
|
|
'rrd_name' => $rrd_name,
|
|
'rrd_def' => $rrd_def,
|
|
];
|
|
data_update($device, 'ipmi', $tags, $fields);
|
|
|
|
// FIXME warnings in event & mail not done here yet!
|
|
dbUpdate(
|
|
['sensor_current' => $sensor_value,
|
|
'lastupdate' => ['NOW()'], ],
|
|
'sensors',
|
|
'poller_type = ? AND sensor_class = ? AND sensor_id = ?',
|
|
['ipmi', $ipmisensors['sensor_class'], $ipmisensors['sensor_id']]
|
|
);
|
|
}
|
|
|
|
unset($ipmi_sensor);
|
|
}
|
|
}
|