$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