171 lines
6.8 KiB
PHP
171 lines
6.8 KiB
PHP
<?php
|
|
/**
|
|
* Observium
|
|
*
|
|
* This file is part of Observium.
|
|
*
|
|
* @package observium
|
|
* @subpackage poller
|
|
* @copyright (C) Adam Armstrong
|
|
*
|
|
*/
|
|
|
|
if (!$config['enable_pseudowires']) {
|
|
return;
|
|
} // Pseudowires disabled
|
|
|
|
$pseudowires_db = [];
|
|
$pseudowires_db_count = 0;
|
|
$pseudowires_snmp_count = 0;
|
|
|
|
// WARNING. Discovered all Pseudowires, but polled only 'active'
|
|
$sql = "SELECT * FROM `pseudowires` WHERE `device_id` = ?;"; // AND `pwRowStatus` = 'active';";
|
|
//$sql = "SELECT * FROM `pseudowires` WHERE `device_id` = ? AND `pwRowStatus` = 'active';";
|
|
|
|
foreach (dbFetchRows($sql, [$device['device_id']]) as $entry) {
|
|
$pseudowires_db_count++; // Fetch all entries for correct counting, but skip inactive/deleted
|
|
if ($entry['pwRowStatus'] !== 'active') {
|
|
continue;
|
|
}
|
|
|
|
$index = $entry['pwIndex'];
|
|
|
|
$pseudowires_db[$entry['mib']][$index] = $entry;
|
|
}
|
|
|
|
if (safe_empty($pseudowires_db)) {
|
|
return;
|
|
} // Pseudowires not exist, exit
|
|
|
|
$table_rows = [];
|
|
|
|
print_cli_data_field("MIBs", 2);
|
|
|
|
foreach (array_keys($pseudowires_db) as $mib) {
|
|
// NOTE. Multiple pseudoware MIBs on single device theoretically impossible, but keep this common logic
|
|
echo(" $mib ");
|
|
$mib_lower = strtolower($mib);
|
|
$oids = $config['mibs'][$mib]['pseudowire']['oids'];
|
|
|
|
// Cache SNMP data
|
|
$cache_pseudowires[$mib_lower] = [];
|
|
foreach ($oids as $oid_type => $oid_entry) {
|
|
$cache_pseudowires[$mib_lower] = snmpwalk_cache_oid($device, $oid_entry['oid'], $cache_pseudowires[$mib_lower], $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
|
if ($oid_type === 'OperStatus' && !snmp_status()) {
|
|
break;
|
|
}
|
|
}
|
|
$pseudowire_polled_time = time(); // Store polled time for current MIB
|
|
|
|
print_debug_vars($cache_pseudowires[$mib_lower]);
|
|
|
|
//pseudowires_db_count += count(pseudowires_db[$mib_lower]);
|
|
$pseudowires_snmp_count += count($cache_pseudowires[$mib_lower]);
|
|
|
|
foreach ($pseudowires_db[$mib] as $index => $pw) {
|
|
$rrd_filename = "pseudowire-" . $mib_lower . '-' . $index . ".rrd";
|
|
$rrd_uptime = "pseudowire-" . $mib_lower . '-uptime-' . $index . ".rrd";
|
|
$rrd_ds = '';
|
|
|
|
if (isset($cache_pseudowires[$mib_lower][$index])) {
|
|
$pw_poll = &$cache_pseudowires[$mib_lower][$index];
|
|
|
|
// Uptime graph
|
|
$pw_uptime = timeticks_to_sec($pw_poll[$oids['Uptime']['oid']]); // Convert uptime to sec
|
|
rrdtool_create($device, $rrd_uptime, "DS:Uptime:GAUGE:600:0:U ");
|
|
rrdtool_update($device, $rrd_uptime, "N:" . $pw_uptime);
|
|
//$graphs['pseudowire_uptime'] = TRUE; // not a device graph
|
|
|
|
// Bits & Packets graphs
|
|
$pw_values = [];
|
|
foreach (['InOctets', 'OutOctets', 'InPkts', 'OutPkts'] as $oid_type) {
|
|
if (!isset($oids[$oid_type])) {
|
|
break;
|
|
}
|
|
|
|
$rrd_ds .= 'DS:' . $oid_type . ':DERIVE:600:0:' . $config['max_port_speed'] . ' ';
|
|
$pw_values[] = $pw_poll[$oids[$oid_type]['oid']];
|
|
}
|
|
if (count($pw_values)) {
|
|
rrdtool_create($device, $rrd_filename, $rrd_ds);
|
|
rrdtool_update($device, $rrd_filename, $pw_values);
|
|
//$graphs['pseudowire_bits'] = TRUE; // not a device graph
|
|
//$graphs['pseudowire_pkts'] = TRUE; // not a device graph
|
|
}
|
|
|
|
// Event
|
|
$pw_operstatus = $pw_poll[$oids['OperStatus']['oid']];
|
|
$pw_poll['event'] = $config['mibs'][$mib]['pseudowire']['states'][$pw_operstatus]['event'];
|
|
|
|
// Last changed
|
|
if (empty($pw['last_change'])) {
|
|
// If last change never set, use current time
|
|
$pw_poll['last_change'] = $pseudowire_polled_time - $pw_uptime;
|
|
} elseif ($pw['pwOperStatus'] != $pw_operstatus) {
|
|
// Pseudowire changed, log and set last_change
|
|
$pw_poll['last_change'] = $pseudowire_polled_time; // - $pw_uptime;
|
|
if ($pw['pwOperStatus']) // Log only if old status not empty
|
|
{
|
|
log_event('Pseudowire changed: [#' . $pw['pwID'] . '] ' . $pw['pwOperStatus'] . ' -> ' . $pw_operstatus, $device, 'pseudowire', $pw['pseudowire_id'], 'warning');
|
|
}
|
|
} elseif ($pw['pwUptime'] > $pw_uptime) {
|
|
// Pseudowire flapped, log and set last_change
|
|
$pw_poll['last_change'] = $pseudowire_polled_time; // - $pw_uptime;
|
|
if ($pw['pwOperStatus']) // Log only if old status not empty
|
|
{
|
|
log_event('Pseudowire flapped: [#' . $pw['pwID'] . '] time ' . format_uptime($pw_uptime) . ' ago', $device, 'pseudowire', $pw['pseudowire_id']);
|
|
}
|
|
} else {
|
|
// If status not changed, leave old last_change
|
|
$pw_poll['last_change'] = $pw['last_change'];
|
|
}
|
|
|
|
// Metrics
|
|
$metrics = [];
|
|
$metrics['pwOperStatus'] = $pw_poll[$oids['OperStatus']['oid']];
|
|
$metrics['pwRemoteStatus'] = $pw_poll[$oids['RemoteStatus']['oid']];
|
|
$metrics['pwLocalStatus'] = $pw_poll[$oids['LocalStatus']['oid']];
|
|
$metrics['event'] = $pw_poll['event'];
|
|
$metrics['pwUptime'] = $pw_uptime;
|
|
$metrics['last_change'] = $pw_poll['last_change'];
|
|
|
|
// Check entity
|
|
check_entity('pseudowire', $pw, $metrics);
|
|
|
|
// Update SQL State
|
|
//dbUpdate($metrics, 'pseudowires', '`pseudowire_id` = ?', [$pw['pseudowire_id']]);
|
|
dbUpdateRowMulti(array_merge([ 'pseudowire_id' => $pw['pseudowire_id'] ], $metrics), 'pseudowires', 'pseudowire_id');
|
|
|
|
// Add table row
|
|
$table_row = [];
|
|
$table_row[] = $pw['pwID'];
|
|
$table_row[] = $pw['mib'];
|
|
$table_row[] = $pw['pwType'];
|
|
$table_row[] = $pw['pwPsnType'];
|
|
$table_row[] = $pw['peer_addr'];
|
|
$table_row[] = $metrics['pwOperStatus'];
|
|
$table_row[] = format_uptime($pw_uptime);
|
|
$table_rows[] = $table_row;
|
|
unset($table_row);
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
dbProcessMulti('pseudowires');
|
|
|
|
echo(PHP_EOL);
|
|
|
|
$headers = ['%WpwID%n', '%WMIB%n', '%WType%n', '%WPsnType%n', '%WPeer%n', '%WOperStatus%n', '%WUptime%n'];
|
|
print_cli_table($table_rows, $headers);
|
|
|
|
if ($pseudowires_db_count != $pseudowires_snmp_count) {
|
|
// Force rediscover Pseudowires
|
|
print_debug("Pseudowires total count for this device changed (DB: $pseudowires_db_count, SNMP: $pseudowires_snmp_count), force rediscover Pseudowires.");
|
|
force_discovery($device, 'pseudowires');
|
|
}
|
|
|
|
unset($pseudowires_db, $cache_pseudowires, $pseudowire_polled_time, $pw, $pw_poll, $pw_values, $pw_uptime, $oids, $metrics, $table_rows);
|
|
|
|
// EOF
|