From d86b39395acf5240976383f49794d3ab72f36b2d Mon Sep 17 00:00:00 2001 From: Neil Lathwood Date: Sat, 15 Oct 2016 02:03:26 +0100 Subject: [PATCH] refactor: Small poller improvements, removes unecessary queries / execs (#4741) --- includes/common.php | 5 +- includes/polling/applications.inc.php | 5 +- .../polling/cisco-ace-loadbalancer.inc.php | 100 ++++++++-------- .../polling/cisco-ace-serverfarms.inc.php | 111 ++++++++++-------- includes/polling/cisco-sla.inc.php | 2 +- includes/polling/ipmi.inc.php | 107 +++++++++-------- includes/polling/stp.inc.php | 1 - poller.php | 6 +- 8 files changed, 180 insertions(+), 157 deletions(-) diff --git a/includes/common.php b/includes/common.php index b7229f43cb..17ef4cbc38 100644 --- a/includes/common.php +++ b/includes/common.php @@ -1267,11 +1267,12 @@ function get_ports_mapped($device_id, $with_statistics = false) 'ifDescr' => array(), ); - /* Query all information available for ports for this device ... */ - $query = 'SELECT * FROM `ports` WHERE `device_id` = ? ORDER BY port_id'; if ($with_statistics) { /* ... including any related ports_statistics if requested */ $query = 'SELECT *, `ports_statistics`.`port_id` AS `ports_statistics_port_id`, `ports`.`port_id` AS `port_id` FROM `ports` LEFT OUTER JOIN `ports_statistics` ON `ports`.`port_id` = `ports_statistics`.`port_id` WHERE `ports`.`device_id` = ? ORDER BY ports.port_id'; + } else { + /* Query all information available for ports for this device ... */ + $query = 'SELECT * FROM `ports` WHERE `device_id` = ? ORDER BY port_id'; } // Query known ports in order of discovery to make sure the latest diff --git a/includes/polling/applications.inc.php b/includes/polling/applications.inc.php index 8a7410b9bc..da101d7a53 100644 --- a/includes/polling/applications.inc.php +++ b/includes/polling/applications.inc.php @@ -1,11 +1,8 @@ 0) { foreach ($app_rows as $app) { $app_include = $config['install_dir'].'/includes/polling/applications/'.$app['app_type'].'.inc.php'; if (is_file($app_include)) { diff --git a/includes/polling/cisco-ace-loadbalancer.inc.php b/includes/polling/cisco-ace-loadbalancer.inc.php index 460a331017..035cc3d999 100644 --- a/includes/polling/cisco-ace-loadbalancer.inc.php +++ b/includes/polling/cisco-ace-loadbalancer.inc.php @@ -1,59 +1,65 @@ $serverfarm) { - $farm_id = preg_replace('@\d+\."(.*?)"\.\d+@', '\\1', $index); - - $oids = array( - 'cesServerFarmRserverTotalConns', - 'cesServerFarmRserverCurrentConns', - 'cesServerFarmRserverFailedConns', - ); - - $db_oids = array( - $farm_id => 'farm_id', - 'cesServerFarmRserverStateDescr' => 'StateDescr', - ); - - if (!is_array($serverfarms[$farm_id])) { - $rserver_id = dbInsert(array('device_id' => $device['device_id'], 'farm_id' => $farm_id, 'StateDescr' => $serverfarm['cesServerFarmRserverStateDescr']), 'loadbalancer_rservers'); - } else { - foreach ($db_oids as $db_oid => $db_value) { - $db_update[$db_value] = $serverfarm[$db_oid]; - } - - $updated = dbUpdate($db_update, 'loadbalancer_rservers', '`rserver_id` = ?', $serverfarm['cesServerFarmRserverFailedConns']['farm_id']); + foreach ($rserver_db as $serverfarm) { + $serverfarms[$serverfarm['farm_id']] = $serverfarm; } - $rrd_name = array('rserver', $serverfarms[$farm_id]['rserver_id']); + foreach ($rserver_array as $index => $serverfarm) { + $farm_id = preg_replace('@\d+\."(.*?)"\.\d+@', '\\1', $index); - $rrd_def = array(); - foreach ($oids as $oid) { - $oid_ds = truncate(str_replace('cesServerFarm', '', $oid), 19, ''); - $rrd_def[] = "DS:$oid_ds:GAUGE:600:-1:100000000"; - } + $oids = array( + 'cesServerFarmRserverTotalConns', + 'cesServerFarmRserverCurrentConns', + 'cesServerFarmRserverFailedConns', + ); - $fields = array(); + $db_oids = array( + $farm_id => 'farm_id', + 'cesServerFarmRserverStateDescr' => 'StateDescr', + ); - foreach ($oids as $oid) { - if (is_numeric($serverfarm[$oid])) { - $value = $serverfarm[$oid]; + if (!is_array($serverfarms[$farm_id])) { + $rserver_id = dbInsert(array( + 'device_id' => $device['device_id'], + 'farm_id' => $farm_id, + 'StateDescr' => $serverfarm['cesServerFarmRserverStateDescr'] + ), 'loadbalancer_rservers'); } else { - $value = '0'; + foreach ($db_oids as $db_oid => $db_value) { + $db_update[$db_value] = $serverfarm[$db_oid]; + } + + $updated = dbUpdate($db_update, 'loadbalancer_rservers', '`rserver_id` = ?', $serverfarm['cesServerFarmRserverFailedConns']['farm_id']); } - $fields[$oid] = $value; - } - if (isset($serverfarms[$farm_id])) { - $tags = compact('farm_id', 'rrd_name', 'rrd_def'); - data_update($device, 'rservers', $tags, $fields); - } -}//end foreach + $rrd_name = array('rserver', $serverfarms[$farm_id]['rserver_id']); -unset($rrd_name, $rrd_def, $oids, $oid, $serverfarm); + $rrd_def = array(); + foreach ($oids as $oid) { + $oid_ds = truncate(str_replace('cesServerFarm', '', $oid), 19, ''); + $rrd_def[] = "DS:$oid_ds:GAUGE:600:-1:100000000"; + } + + $fields = array(); + + foreach ($oids as $oid) { + if (is_numeric($serverfarm[$oid])) { + $value = $serverfarm[$oid]; + } else { + $value = '0'; + } + $fields[$oid] = $value; + } + + if (isset($serverfarms[$farm_id])) { + $tags = compact('farm_id', 'rrd_name', 'rrd_def'); + data_update($device, 'rservers', $tags, $fields); + } + }//end foreach + + unset($rrd_name, $rrd_def, $oids, $oid, $serverfarm); +} diff --git a/includes/polling/cisco-ace-serverfarms.inc.php b/includes/polling/cisco-ace-serverfarms.inc.php index 83979d65cd..d199e6a1a7 100644 --- a/includes/polling/cisco-ace-serverfarms.inc.php +++ b/includes/polling/cisco-ace-serverfarms.inc.php @@ -1,62 +1,69 @@ $vserver) { - $classmap = str_replace('class-map-', '', $vserver['slbVServerClassMap']); - $classmap_id = str_replace('9.', '', $index); - - $oids = array( - 'slbVServerNumberOfConnections', - 'slbVServerDroppedConnections', - 'slbVServerClientPacketCounts', - 'slbVServerClientByteCounts', - 'slbVServerPacketCounts', - 'slbVServerByteCounts', - ); - - $db_oids = array( - $classmap_id => 'classmap_id', - $classmap => 'classmap', - 'slbVServerState' => 'serverstate', - ); - - if (!is_array($classmaps[$classmap])) { - $classmap_in = dbInsert(array('device_id' => $device['device_id'], 'classmap_id' => $classmap_id, 'classmap' => $classmap, 'serverstate' => $vserver['slbVServerState']), 'loadbalancer_vservers'); - } else { - foreach ($db_oids as $db_oid => $db_value) { - $db_update[$db_value] = $vserver[$db_oid]; - } - - $updated = dbUpdate($db_update, 'loadbalancer_vservers', '`classmap_id` = ?', $vserver['slbVServerState']['classmap']); + foreach ($serverfarm_db as $vserver) { + $classmaps[$vserver['classmap']] = $vserver; } - $rrd_name = array('vserver', $classmap_id); - $rrd_def = array(); - foreach ($oids as $oid) { - $oid_ds = truncate(str_replace('slbVServer', '', $oid), 19, ''); - $rrd_def[] = "DS:$oid_ds:COUNTER:600:U:1000000000"; - } + foreach ($serverfarm_array as $index => $vserver) { + $classmap = str_replace('class-map-', '', $vserver['slbVServerClassMap']); + $classmap_id = str_replace('9.', '', $index); - $fields = array(); - foreach ($oids as $oid) { - if (is_numeric($vserver[$oid])) { - $value = $vserver[$oid]; + $oids = array( + 'slbVServerNumberOfConnections', + 'slbVServerDroppedConnections', + 'slbVServerClientPacketCounts', + 'slbVServerClientByteCounts', + 'slbVServerPacketCounts', + 'slbVServerByteCounts', + ); + + $db_oids = array( + $classmap_id => 'classmap_id', + $classmap => 'classmap', + 'slbVServerState' => 'serverstate', + ); + + if (!is_array($classmaps[$classmap])) { + $classmap_in = dbInsert(array( + 'device_id' => $device['device_id'], + 'classmap_id' => $classmap_id, + 'classmap' => $classmap, + 'serverstate' => $vserver['slbVServerState'] + ), 'loadbalancer_vservers'); } else { - $value = '0'; + foreach ($db_oids as $db_oid => $db_value) { + $db_update[$db_value] = $vserver[$db_oid]; + } + + $updated = dbUpdate($db_update, 'loadbalancer_vservers', '`classmap_id` = ?', $vserver['slbVServerState']['classmap']); } - $fields[$oid] = $value; - } - if (isset($classmaps[$classmap])) { - $tags = compact('classmap_id', 'rrd_name', 'rrd_def'); - data_update($device, 'vservers', $tags, $fields); - } -}//end foreach + $rrd_name = array('vserver', $classmap_id); + $rrd_def = array(); + foreach ($oids as $oid) { + $oid_ds = truncate(str_replace('slbVServer', '', $oid), 19, ''); + $rrd_def[] = "DS:$oid_ds:COUNTER:600:U:1000000000"; + } -unset($rrd_name, $rrd_def, $oids, $oid, $vserver); + $fields = array(); + foreach ($oids as $oid) { + if (is_numeric($vserver[$oid])) { + $value = $vserver[$oid]; + } else { + $value = '0'; + } + $fields[$oid] = $value; + } + + if (isset($classmaps[$classmap])) { + $tags = compact('classmap_id', 'rrd_name', 'rrd_def'); + data_update($device, 'vservers', $tags, $fields); + } + }//end foreach + + unset($rrd_name, $rrd_def, $oids, $oid, $vserver); +} diff --git a/includes/polling/cisco-sla.inc.php b/includes/polling/cisco-sla.inc.php index 4b2f750346..b9d2d1d1f6 100644 --- a/includes/polling/cisco-sla.inc.php +++ b/includes/polling/cisco-sla.inc.php @@ -3,7 +3,7 @@ // Gather our SLA's from the DB. $slas = dbFetchRows('SELECT * FROM `slas` WHERE `device_id` = ? AND `deleted` = 0', array($device['device_id'])); -if (count($slas > 0)) { +if (count($slas) > 0) { // We have SLA's, lets go!!! // Go get some data from the device. diff --git a/includes/polling/ipmi.inc.php b/includes/polling/ipmi.inc.php index d02a4d674f..92c2309826 100644 --- a/includes/polling/ipmi.inc.php +++ b/includes/polling/ipmi.inc.php @@ -2,56 +2,65 @@ $ipmi_rows = dbFetchRows("SELECT * FROM sensors WHERE device_id = ? AND poller_type='ipmi'", array($device['device_id'])); -d_echo($ipmi_rows); +if (is_array($ipmi_rows)) { + d_echo($ipmi_rows); -if ($ipmi['host'] = get_dev_attrib($device, 'ipmi_hostname')) { - $ipmi['user'] = get_dev_attrib($device, 'ipmi_username'); - $ipmi['password'] = get_dev_attrib($device, 'ipmi_password'); - $ipmi['type'] = get_dev_attrib($device, 'ipmi_type'); - echo 'Fetching IPMI sensor data...'; + if ($ipmi['host'] = $attribs['ipmi_hostname']) { + $ipmi['user'] = $attribs['ipmi_username']; + $ipmi['password'] = $attribs['ipmi_password']; + $ipmi['type'] = $attribs['ipmi_type']; - if ($config['own_hostname'] != $device['hostname'] || $ipmi['host'] != 'localhost') { - $remote = " -H ".$ipmi['host']." -U '".$ipmi['user']."' -P '".$ipmi['password']."' -L USER"; + echo 'Fetching IPMI sensor data...'; + + if ($config['own_hostname'] != $device['hostname'] || $ipmi['host'] != 'localhost') { + $remote = " -H " . $ipmi['host'] . " -U '" . $ipmi['user'] . "' -P '" . $ipmi['password'] . "' -L USER"; + } + + $results = external_exec($config['ipmitool'] . ' -I ' . $ipmi['type'] . ' -c ' . $remote . ' sdr 2>/dev/null'); + d_echo($results); + echo " done.\n"; + + foreach (explode("\n", $results) as $row) { + list($desc, $value, $type, $status) = explode(',', $row); + $ipmi_sensor[$desc][$config['ipmi_unit'][$type]]['value'] = $value; + $ipmi_sensor[$desc][$config['ipmi_unit'][$type]]['unit'] = $type; + } + + foreach ($ipmi_rows as $ipmisensors) { + echo 'Updating IPMI sensor ' . $ipmisensors['sensor_descr'] . '... '; + + $sensor = $ipmi_sensor[$ipmisensors['sensor_descr']][$ipmisensors['sensor_class']]['value']; + $unit = $ipmi_sensor[$ipmisensors['sensor_descr']][$ipmisensors['sensor_class']]['unit']; + + echo $sensor . " $unit\n"; + + $rrd_name = get_sensor_rrd_name($device, $ipmisensors); + $rrd_def = 'DS:sensor:GAUGE:600:-20000:20000'; + + $fields = array( + 'sensor' => $sensor, + ); + + $tags = array( + 'sensor_class' => $sensor['sensor_class'], + 'sensor_type' => $sensor['sensor_type'], + 'sensor_descr' => $sensor['sensor_descr'], + 'sensor_index' => $sensor['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( + array('sensor_current' => $sensor, + 'lastupdate' => array('NOW()')), + 'sensors', + 'poller_type = ? AND sensor_class = ? AND sensor_id = ?', + array('ipmi', $ipmisensors['sensor_class'], $ipmisensors['sensor_id']) + ); + } + + unset($ipmi_sensor); } - - $results = external_exec($config['ipmitool'].' -I '.$ipmi['type'].' -c '.$remote.' sdr 2>/dev/null'); - d_echo($results); - echo " done.\n"; - - foreach (explode("\n", $results) as $row) { - list($desc,$value,$type,$status) = explode(',', $row); - $ipmi_sensor[$desc][$config['ipmi_unit'][$type]]['value'] = $value; - $ipmi_sensor[$desc][$config['ipmi_unit'][$type]]['unit'] = $type; - } - - foreach ($ipmi_rows as $ipmisensors) { - echo 'Updating IPMI sensor '.$ipmisensors['sensor_descr'].'... '; - - $sensor = $ipmi_sensor[$ipmisensors['sensor_descr']][$ipmisensors['sensor_class']]['value']; - $unit = $ipmi_sensor[$ipmisensors['sensor_descr']][$ipmisensors['sensor_class']]['unit']; - - echo $sensor." $unit\n"; - - $rrd_name = get_sensor_rrd_name($device, $ipmisensors); - $rrd_def = 'DS:sensor:GAUGE:600:-20000:20000'; - - $fields = array( - 'sensor' => $sensor, - ); - - $tags = array( - 'sensor_class' => $sensor['sensor_class'], - 'sensor_type' => $sensor['sensor_type'], - 'sensor_descr' => $sensor['sensor_descr'], - 'sensor_index' => $sensor['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(array('sensor_current' => $sensor, 'lastupdate' => array('NOW()')), 'sensors', 'poller_type = ? AND sensor_class = ? AND sensor_id = ?', array('ipmi', $ipmisensors['sensor_class'], $ipmisensors['sensor_id'])); - } - - unset($ipmi_sensor); } diff --git a/includes/polling/stp.inc.php b/includes/polling/stp.inc.php index 234e00dcfc..b6589e0d7f 100644 --- a/includes/polling/stp.inc.php +++ b/includes/polling/stp.inc.php @@ -16,7 +16,6 @@ // Pre-cache existing state of STP for this device from database $stp_db = dbFetchRow('SELECT * FROM `stp` WHERE `device_id` = ?', array($device['device_id'])); -//d_echo($stp_db); $stpprotocol = snmp_get($device, 'dot1dStpProtocolSpecification.0', '-Oqv', 'RSTP-MIB'); diff --git a/poller.php b/poller.php index 49944e0aa8..f3ac0bf35a 100755 --- a/poller.php +++ b/poller.php @@ -132,7 +132,11 @@ if (!isset($query)) { foreach (dbFetch($query) as $device) { $device = dbFetchRow("SELECT * FROM `devices` WHERE `device_id` = " .$device['device_id']); - $device['vrf_lite_cisco'] = dbFetchRows("SELECT * FROM `vrf_lite_cisco` WHERE `device_id` = ".$device['device_id']); + if ($device['os_group'] == 'cisco') { + $device['vrf_lite_cisco'] = dbFetchRows("SELECT * FROM `vrf_lite_cisco` WHERE `device_id` = " . $device['device_id']); + } else { + $device['vrf_lite_cisco'] = ''; + } poll_device($device, $options); echo "#### Start Alerts ####\n"; RunRules($device['device_id']);