diff --git a/includes/polling/bgp-peers.inc.php b/includes/polling/bgp-peers.inc.php index d3ca4aab64..3b51d9625a 100644 --- a/includes/polling/bgp-peers.inc.php +++ b/includes/polling/bgp-peers.inc.php @@ -163,6 +163,11 @@ if ($config['enable_bgp']) { ->addDataset('bgpPeerInTotal', 'COUNTER', null, 100000000000) ->addDataset('bgpPeerEstablished', 'GAUGE', 0); + // Validate data + $bgpPeerFsmEstablishedTime = set_numeric($bgpPeerFsmEstablishedTime); + $bgpPeerInUpdates = set_numeric($bgpPeerInUpdates); + $bgpPeerOutUpdates = set_numeric($bgpPeerOutUpdates); + $fields = array( 'bgpPeerOutUpdates' => $bgpPeerOutUpdates, 'bgpPeerInUpdates' => $bgpPeerInUpdates, @@ -178,14 +183,20 @@ if ($config['enable_bgp']) { ); data_update($device, 'bgp', $tags, $fields); - $peer['update']['bgpPeerState'] = $bgpPeerState; - $peer['update']['bgpPeerAdminStatus'] = $bgpPeerAdminStatus; - $peer['update']['bgpPeerFsmEstablishedTime'] = set_numeric($bgpPeerFsmEstablishedTime); - $peer['update']['bgpPeerInUpdates'] = set_numeric($bgpPeerInUpdates); - $peer['update']['bgpLocalAddr'] = $bgpLocalAddr; - $peer['update']['bgpPeerOutUpdates'] = set_numeric($bgpPeerOutUpdates); + $bgpPeers_fields = array( + 'bgpPeerState' => $bgpPeerState, + 'bgpPeerAdminStatus' => $bgpPeerAdminStatus, + 'bgpPeerFsmEstablishedTime' => $bgpPeerFsmEstablishedTime, + 'bgpPeerInUpdates' => $bgpPeerInUpdates, + 'bgpLocalAddr' => $bgpLocalAddr, + 'bgpPeerOutUpdates' => $bgpPeerOutUpdates, + ); - dbUpdate($peer['update'], 'bgpPeers', '`device_id` = ? AND `bgpPeerIdentifier` = ?', array($device['device_id'], $peer['bgpPeerIdentifier'])); + $peer['update'] = array_diff($bgpPeers_fields, $peer); + + if ($peer['update']) { + dbUpdate($peer['update'], 'bgpPeers', '`device_id` = ? AND `bgpPeerIdentifier` = ?', array($device['device_id'], $peer['bgpPeerIdentifier'])); + } if ($device['os_group'] == 'cisco' || $device['os'] == 'junos' || $device['os_group'] === 'arista') { // Poll each AFI/SAFI for this peer (using CISCO-BGP4-MIB or BGP4-V2-JUNIPER MIB) @@ -309,16 +320,32 @@ if ($config['enable_bgp']) { $cbgpPeerAcceptedPrefixes = $a_prefixes["1.$afi.$tmp_peer.$afi.$safi"]['aristaBgp4V2PrefixInPrefixesAccepted']; } - // FIXME THESE FIELDS DO NOT EXIST IN THE DATABASE! - $update = 'UPDATE bgpPeers_cbgp SET'; - $peer['c_update']['AcceptedPrefixes'] = set_numeric($cbgpPeerAcceptedPrefixes); - $peer['c_update']['DeniedPrefixes'] = set_numeric($cbgpPeerDeniedPrefixes); - $peer['c_update']['PrefixAdminLimit'] = set_numeric($cbgpPeerAdminLimit); - $peer['c_update']['PrefixThreshold'] = set_numeric($cbgpPeerPrefixThreshold); - $peer['c_update']['PrefixClearThreshold'] = set_numeric($cbgpPeerPrefixClearThreshold); - $peer['c_update']['AdvertisedPrefixes'] = set_numeric($cbgpPeerAdvertisedPrefixes); - $peer['c_update']['SuppressedPrefixes'] = set_numeric($cbgpPeerSuppressedPrefixes); - $peer['c_update']['WithdrawnPrefixes'] = set_numeric($cbgpPeerWithdrawnPrefixes); + // Validate data + $cbgpPeerAcceptedPrefixes = set_numeric($cbgpPeerAcceptedPrefixes); + $cbgpPeerDeniedPrefixes = set_numeric($cbgpPeerDeniedPrefixes); + $cbgpPeerPrefixAdminLimit = set_numeric($cbgpPeerAdminLimit); + $cbgpPeerPrefixThreshold = set_numeric($cbgpPeerPrefixThreshold); + $cbgpPeerPrefixClearThreshold = set_numeric($cbgpPeerPrefixClearThreshold); + $cbgpPeerAdvertisedPrefixes = set_numeric($cbgpPeerAdvertisedPrefixes); + $cbgpPeerSuppressedPrefixes = set_numeric($cbgpPeerSuppressedPrefixes); + $cbgpPeerWithdrawnPrefixes = set_numeric($cbgpPeerWithdrawnPrefixes); + + $cbgpPeers_cbgp_fields = array( + 'AcceptedPrefixes' => $cbgpPeerAcceptedPrefixes, + 'DeniedPrefixes' => $cbgpPeerDeniedPrefixes, + 'PrefixAdminLimit' => $cbgpPeerAdminLimit, + 'PrefixThreshold' => $cbgpPeerPrefixThreshold, + 'PrefixClearThreshold' => $cbgpPeerPrefixClearThreshold, + 'AdvertisedPrefixes' => $cbgpPeerAdvertisedPrefixes, + 'SuppressedPrefixes' => $cbgpPeerSuppressedPrefixes, + 'WithdrawnPrefixes' => $cbgpPeerWithdrawnPrefixes, + ); + + foreach ($cbgpPeers_cbgp_fields as $field => $value) { + if ($peer_afi[$field] != $value) { + $peer['c_update'][$field] = $value; + } + } $oids = array( 'AcceptedPrefixes', @@ -329,11 +356,19 @@ if ($config['enable_bgp']) { ); foreach ($oids as $oid) { - $peer['c_update'][$oid.'_delta'] = set_numeric($peer['c_update'][$oid] - $peer_afi[$oid]); - $peer['c_update'][$oid.'_prev'] = set_numeric($peer_afi[$oid]); + $tmp_delta = set_numeric($peer['c_update'][$oid] - $peer_afi[$oid]); + $tmp_prev = set_numeric($peer_afi[$oid]); + if ($peer_afi[$oid . '_delta'] != $tmp_delta) { + $peer['c_update'][$oid . '_delta'] = $tmp_delta; + } + if ($peer_afi[$oid . '_prev'] != $tmp_prev) { + $peer['c_update'][$oid . '_prev'] = $tmp_prev; + } } - dbUpdate($peer['c_update'], 'bgpPeers_cbgp', '`device_id` = ? AND bgpPeerIdentifier = ? AND afi = ? AND safi = ?', array($device['device_id'], $peer['bgpPeerIdentifier'], $afi, $safi)); + if ($peer['c_update']) { + dbUpdate($peer['c_update'], 'bgpPeers_cbgp', '`device_id` = ? AND bgpPeerIdentifier = ? AND afi = ? AND safi = ?', array($device['device_id'], $peer['bgpPeerIdentifier'], $afi, $safi)); + } $cbgp_rrd_name = safename('cbgp-'.$peer['bgpPeerIdentifier'].".$afi.$safi"); $cbgp_rrd_def = RrdDefinition::make() diff --git a/includes/polling/functions.inc.php b/includes/polling/functions.inc.php index 055a07fac8..c995d10d7d 100644 --- a/includes/polling/functions.inc.php +++ b/includes/polling/functions.inc.php @@ -204,7 +204,9 @@ function record_sensor_data($device, $all_sensors) log_event("$class sensor {$sensor['sensor_descr']} has changed from {$trans[$prev_sensor_value]} ($prev_sensor_value) to {$trans[$sensor_value]} ($sensor_value)", $device, $class, 3, $sensor['sensor_id']); } - dbUpdate(array('sensor_current' => $sensor_value, 'sensor_prev' => $prev_sensor_value, 'lastupdate' => array('NOW()')), 'sensors', "`sensor_class` = ? AND `sensor_id` = ?", array($class,$sensor['sensor_id'])); + if ($sensor_value != $prev_sensor_value) { + dbUpdate(array('sensor_current' => $sensor_value, 'sensor_prev' => $prev_sensor_value, 'lastupdate' => array('NOW()')), 'sensors', "`sensor_class` = ? AND `sensor_id` = ?", array($class, $sensor['sensor_id'])); + } } }