diff --git a/html/includes/graphs/port/cbqos_bufferdrops.inc.php b/html/includes/graphs/port/cbqos_bufferdrops.inc.php
new file mode 100644
index 0000000000..93626bc150
--- /dev/null
+++ b/html/includes/graphs/port/cbqos_bufferdrops.inc.php
@@ -0,0 +1,75 @@
+
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+ */
+
+require_once "../includes/component.php";
+$COMPONENT = new component();
+$options['filter']['type'] = array('=','Cisco-CBQOS');
+$COMPONENTS = $COMPONENT->getComponents($device['device_id'],$options);
+
+// We only care about our device id.
+$COMPONENTS = $COMPONENTS[$device['device_id']];
+
+// Determine a policy to show.
+if (!isset($vars['policy'])) {
+ foreach ($COMPONENTS as $ID => $ARRAY) {
+ if ( ($ARRAY['qos-type'] == 1) && ($ARRAY['ifindex'] == $port['ifIndex']) && ($ARRAY['parent'] == 0) ) {
+ // Found the first policy
+ $vars['policy'] = $ID;
+ continue;
+ }
+ }
+}
+
+include "includes/graphs/common.inc.php";
+$rrd_options .= " -l 0 -E ";
+$rrd_options .= " COMMENT:'Class-Map Now Avg Max\\n'";
+$rrd_additions = "";
+
+$COUNT = 0;
+foreach ($COMPONENTS as $ID => $ARRAY) {
+ if ( ($ARRAY['qos-type'] == 2) && ($ARRAY['parent'] == $COMPONENTS[$vars['policy']]['sp-obj']) && ($ARRAY['sp-id'] == $COMPONENTS[$vars['policy']]['sp-id'])) {
+ $rrd_filename = $config['rrd_dir'].'/'.$device['hostname'].'/'.safename("port-".$ARRAY['ifindex']."-cbqos-".$ARRAY['sp-id']."-".$ARRAY['sp-obj'].".rrd");
+
+ if (file_exists($rrd_filename)) {
+ // Stack the area on the second and subsequent DS's
+ $STACK = "";
+ if ($COUNT != 0) {
+ $STACK = ":STACK ";
+ }
+
+ // Grab a color from the array.
+ if ( isset($config['graph_colours']['mixed'][$COUNT]) ) {
+ $COLOR = $config['graph_colours']['mixed'][$COUNT];
+ }
+ else {
+ $COLOR = $config['graph_colours']['oranges'][$COUNT-7];
+ }
+
+ $rrd_additions .= " DEF:DS" . $COUNT . "=" . $rrd_filename . ":bufferdrops:AVERAGE ";
+ $rrd_additions .= " CDEF:MOD" . $COUNT . "=DS" . $COUNT . ",8,* ";
+ $rrd_additions .= " AREA:MOD" . $COUNT . "#" . $COLOR . ":'" . str_pad(substr($COMPONENTS[$ID]['label'],0,15),15) . "'" . $STACK;
+ $rrd_additions .= " GPRINT:MOD" . $COUNT . ":LAST:%6.2lf%s ";
+ $rrd_additions .= " GPRINT:MOD" . $COUNT . ":AVERAGE:%6.2lf%s ";
+ $rrd_additions .= " GPRINT:MOD" . $COUNT . ":MAX:%6.2lf%s\\\l ";
+
+ $COUNT++;
+ }
+ }
+}
+
+if ($rrd_additions == "") {
+ // We didn't add any data points.
+}
+else {
+ $rrd_options .= $rrd_additions;
+}
diff --git a/html/includes/graphs/port/cbqos_qosdrops.inc.php b/html/includes/graphs/port/cbqos_qosdrops.inc.php
new file mode 100644
index 0000000000..ea107b3809
--- /dev/null
+++ b/html/includes/graphs/port/cbqos_qosdrops.inc.php
@@ -0,0 +1,75 @@
+
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+ */
+
+require_once "../includes/component.php";
+$COMPONENT = new component();
+$options['filter']['type'] = array('=','Cisco-CBQOS');
+$COMPONENTS = $COMPONENT->getComponents($device['device_id'],$options);
+
+// We only care about our device id.
+$COMPONENTS = $COMPONENTS[$device['device_id']];
+
+// Determine a policy to show.
+if (!isset($vars['policy'])) {
+ foreach ($COMPONENTS as $ID => $ARRAY) {
+ if ( ($ARRAY['qos-type'] == 1) && ($ARRAY['ifindex'] == $port['ifIndex']) && ($ARRAY['parent'] == 0) ) {
+ // Found the first policy
+ $vars['policy'] = $ID;
+ continue;
+ }
+ }
+}
+
+include "includes/graphs/common.inc.php";
+$rrd_options .= " -l 0 -E ";
+$rrd_options .= " COMMENT:'Class-Map Now Avg Max\\n'";
+$rrd_additions = "";
+
+$COUNT = 0;
+foreach ($COMPONENTS as $ID => $ARRAY) {
+ if ( ($ARRAY['qos-type'] == 2) && ($ARRAY['parent'] == $COMPONENTS[$vars['policy']]['sp-obj']) && ($ARRAY['sp-id'] == $COMPONENTS[$vars['policy']]['sp-id'])) {
+ $rrd_filename = $config['rrd_dir'].'/'.$device['hostname'].'/'.safename("port-".$ARRAY['ifindex']."-cbqos-".$ARRAY['sp-id']."-".$ARRAY['sp-obj'].".rrd");
+
+ if (file_exists($rrd_filename)) {
+ // Stack the area on the second and subsequent DS's
+ $STACK = "";
+ if ($COUNT != 0) {
+ $STACK = ":STACK ";
+ }
+
+ // Grab a color from the array.
+ if ( isset($config['graph_colours']['mixed'][$COUNT]) ) {
+ $COLOR = $config['graph_colours']['mixed'][$COUNT];
+ }
+ else {
+ $COLOR = $config['graph_colours']['oranges'][$COUNT-7];
+ }
+
+ $rrd_additions .= " DEF:DS" . $COUNT . "=" . $rrd_filename . ":qosdrops:AVERAGE ";
+ $rrd_additions .= " CDEF:MOD" . $COUNT . "=DS" . $COUNT . ",8,* ";
+ $rrd_additions .= " AREA:MOD" . $COUNT . "#" . $COLOR . ":'" . str_pad(substr($COMPONENTS[$ID]['label'],0,15),15) . "'" . $STACK;
+ $rrd_additions .= " GPRINT:MOD" . $COUNT . ":LAST:%6.2lf%s ";
+ $rrd_additions .= " GPRINT:MOD" . $COUNT . ":AVERAGE:%6.2lf%s ";
+ $rrd_additions .= " GPRINT:MOD" . $COUNT . ":MAX:%6.2lf%s\\\l ";
+
+ $COUNT++;
+ }
+ }
+}
+
+if ($rrd_additions == "") {
+ // We didn't add any data points.
+}
+else {
+ $rrd_options .= $rrd_additions;
+}
diff --git a/html/includes/graphs/port/cbqos_traffic.inc.php b/html/includes/graphs/port/cbqos_traffic.inc.php
new file mode 100644
index 0000000000..3cf7291fdf
--- /dev/null
+++ b/html/includes/graphs/port/cbqos_traffic.inc.php
@@ -0,0 +1,75 @@
+
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+ */
+
+require_once "../includes/component.php";
+$COMPONENT = new component();
+$options['filter']['type'] = array('=','Cisco-CBQOS');
+$COMPONENTS = $COMPONENT->getComponents($device['device_id'],$options);
+
+// We only care about our device id.
+$COMPONENTS = $COMPONENTS[$device['device_id']];
+
+// Determine a policy to show.
+if (!isset($vars['policy'])) {
+ foreach ($COMPONENTS as $ID => $ARRAY) {
+ if ( ($ARRAY['qos-type'] == 1) && ($ARRAY['ifindex'] == $port['ifIndex']) && ($ARRAY['parent'] == 0) ) {
+ // Found the first policy
+ $vars['policy'] = $ID;
+ continue;
+ }
+ }
+}
+
+include "includes/graphs/common.inc.php";
+$rrd_options .= " -l 0 -E ";
+$rrd_options .= " COMMENT:'Class-Map Now Avg Max\\n'";
+$rrd_additions = "";
+
+$COUNT = 0;
+foreach ($COMPONENTS as $ID => $ARRAY) {
+ if ( ($ARRAY['qos-type'] == 2) && ($ARRAY['parent'] == $COMPONENTS[$vars['policy']]['sp-obj']) && ($ARRAY['sp-id'] == $COMPONENTS[$vars['policy']]['sp-id'])) {
+ $rrd_filename = $config['rrd_dir'].'/'.$device['hostname'].'/'.safename("port-".$ARRAY['ifindex']."-cbqos-".$ARRAY['sp-id']."-".$ARRAY['sp-obj'].".rrd");
+
+ if (file_exists($rrd_filename)) {
+ // Stack the area on the second and subsequent DS's
+ $STACK = "";
+ if ($COUNT != 0) {
+ $STACK = ":STACK ";
+ }
+
+ // Grab a color from the array.
+ if ( isset($config['graph_colours']['mixed'][$COUNT]) ) {
+ $COLOR = $config['graph_colours']['mixed'][$COUNT];
+ }
+ else {
+ $COLOR = $config['graph_colours']['oranges'][$COUNT-7];
+ }
+
+ $rrd_additions .= " DEF:DS" . $COUNT . "=" . $rrd_filename . ":postbits:AVERAGE ";
+ $rrd_additions .= " CDEF:MOD" . $COUNT . "=DS" . $COUNT . ",8,* ";
+ $rrd_additions .= " AREA:MOD" . $COUNT . "#" . $COLOR . ":'" . str_pad(substr($COMPONENTS[$ID]['label'],0,15),15) . "'" . $STACK;
+ $rrd_additions .= " GPRINT:MOD" . $COUNT . ":LAST:%6.2lf%s ";
+ $rrd_additions .= " GPRINT:MOD" . $COUNT . ":AVERAGE:%6.2lf%s ";
+ $rrd_additions .= " GPRINT:MOD" . $COUNT . ":MAX:%6.2lf%s\\\l ";
+
+ $COUNT++;
+ }
+ }
+}
+
+if ($rrd_additions == "") {
+ // We didn't add any data points.
+}
+else {
+ $rrd_options .= $rrd_additions;
+}
diff --git a/html/pages/device/port.inc.php b/html/pages/device/port.inc.php
index b00b36855e..d1682ee56d 100644
--- a/html/pages/device/port.inc.php
+++ b/html/pages/device/port.inc.php
@@ -87,6 +87,12 @@ if (dbFetchCell("SELECT COUNT(*) FROM `ports_vlans` WHERE `port_id` = '".$port['
$menu_options['vlans'] = 'VLANs';
}
+// Are there any CBQoS rrd's for this ifIndex?
+$cbqos = glob($config['rrd_dir'].'/'.$device['hostname'].'/port-'.$port['ifIndex'].'-cbqos-*.rrd');
+if (!empty($cbqos)) {
+ $menu_options['cbqos'] = 'CBQoS';
+}
+
$sep = '';
foreach ($menu_options as $option => $text) {
echo $sep;
diff --git a/html/pages/device/port/cbqos.inc.php b/html/pages/device/port/cbqos.inc.php
new file mode 100644
index 0000000000..fbcfafdd0d
--- /dev/null
+++ b/html/pages/device/port/cbqos.inc.php
@@ -0,0 +1,131 @@
+
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+ */
+
+function find_child($COMPONENTS,$parent,$level) {
+ global $vars;
+
+ foreach($COMPONENTS as $ID => $ARRAY) {
+ if ($ARRAY['qos-type'] == 3) {
+ continue;
+ }
+ if (($ARRAY['parent'] == $COMPONENTS[$parent]['sp-obj']) && ($ARRAY['sp-id'] == $COMPONENTS[$parent]['sp-id'])) {
+ echo "
";
+ echo "- ";
+ if ($ARRAY['qos-type'] == 1) {
+ // Its a policy, we need to make it a link.
+ echo('' . $ARRAY['label'] . '');
+ }
+ else {
+ // No policy, no link
+ echo $ARRAY['label'];
+ }
+ if (isset($ARRAY['match'])) {
+ echo ' ('.$ARRAY['match'].')';
+ }
+
+ find_child($COMPONENTS,$ID,$level+1);
+
+ echo "
";
+ echo "
";
+ }
+ }
+}
+
+$rrdarr = glob($config['rrd_dir'].'/'.$device['hostname'].'/port-'.$port['ifIndex'].'-cbqos-*.rrd');
+if (!empty($rrdarr)) {
+ require_once "../includes/component.php";
+ $COMPONENT = new component();
+ $options['filter']['type'] = array('=','Cisco-CBQOS');
+ $COMPONENTS = $COMPONENT->getComponents($device['device_id'],$options);
+
+ // We only care about our device id.
+ $COMPONENTS = $COMPONENTS[$device['device_id']];
+
+ if (isset($vars['policy'])) {
+ // if a policy is set try to use it.
+ $graph_array['policy'] = $vars['policy'];
+ }
+ else {
+ // if not, find the first parent and use it.
+ foreach ($COMPONENTS as $ID => $ARRAY) {
+ if ( ($ARRAY['qos-type'] == 1) && ($ARRAY['ifindex'] == $port['ifIndex']) && ($ARRAY['parent'] == 0) ) {
+ // Found the first policy
+ $graph_array['policy'] = $ID;
+ continue;
+ }
+ }
+ }
+ echo "\n\n";
+
+ // Display the ingress policy at the top of the page.
+ echo "";
+ echo ' Ingress Policy:
';
+ $FOUND = false;
+ foreach ($COMPONENTS as $ID => $ARRAY) {
+ if ( ($ARRAY['qos-type'] == 1) && ($ARRAY['ifindex'] == $port['ifIndex']) && ($ARRAY['direction'] == 1) && ($ARRAY['parent'] == 0) ) {
+ echo "- ";
+ echo('' . $ARRAY['label'] . '');
+ find_child($COMPONENTS,$ID,1);
+ echo "
";
+ $FOUND = true;
+ }
+ }
+ if (!$FOUND) {
+ // No Ingress policies
+ echo 'No Policies
';
+ }
+ echo '
';
+
+ // Display the egress policy at the top of the page.
+ echo "";
+ echo ' Egress Policy:
';
+ $FOUND = false;
+ foreach ($COMPONENTS as $ID => $ARRAY) {
+ if ( ($ARRAY['qos-type'] == 1) && ($ARRAY['ifindex'] == $port['ifIndex']) && ($ARRAY['direction'] == 2) && ($ARRAY['parent'] == 0) ) {
+ echo "- ";
+ echo('' . $ARRAY['label'] . '');
+ find_child($COMPONENTS,$ID,1);
+ echo "
";
+ $FOUND = true;
+ }
+ }
+ if (!$FOUND) {
+ // No Egress policies
+ echo 'No Policies
';
+ }
+ echo "
\n\n";
+
+ // Let's make sure the policy we are trying to access actually exists.
+ foreach ($COMPONENTS as $ID => $ARRAY) {
+ if ( ($ARRAY['qos-type'] == 1) && ($ARRAY['ifindex'] == $port['ifIndex']) && ($ID == $graph_array['policy']) ) {
+ // The policy exists.
+
+ echo "
\n\n";
+
+ // Display each graph row.
+ echo "";
+ echo "
Traffic by CBQoS Class - ".$COMPONENTS[$graph_array['policy']]['label']."
";
+ $graph_type = 'port_cbqos_traffic';
+ include 'includes/print-interface-graphs.inc.php';
+
+ echo "
QoS Drops by CBQoS Class - ".$COMPONENTS[$graph_array['policy']]['label']."
";
+ $graph_type = 'port_cbqos_bufferdrops';
+ include 'includes/print-interface-graphs.inc.php';
+
+ echo "
Buffer Drops by CBQoS Class - ".$COMPONENTS[$graph_array['policy']]['label']."
";
+ $graph_type = 'port_cbqos_qosdrops';
+ include 'includes/print-interface-graphs.inc.php';
+ echo "
\n\n";
+ }
+ }
+}
diff --git a/includes/defaults.inc.php b/includes/defaults.inc.php
index 328ae2ce04..dff8f976d5 100644
--- a/includes/defaults.inc.php
+++ b/includes/defaults.inc.php
@@ -710,6 +710,7 @@ $config['poller_modules']['applications'] = 1;
$config['poller_modules']['cisco-asa-firewall'] = 1;
$config['poller_modules']['mib'] = 0;
$config['poller_modules']['cisco-voice'] = 1;
+$config['poller_modules']['cisco-cbqos'] = 1;
$config['poller_modules']['stp'] = 1;
// List of discovery modules. Need to be in this array to be
@@ -742,6 +743,7 @@ $config['discovery_modules']['toner'] = 1;
$config['discovery_modules']['ucd-diskio'] = 1;
$config['discovery_modules']['services'] = 1;
$config['discovery_modules']['charge'] = 1;
+$config['discovery_modules']['cisco-cbqos'] = 0;
$config['discovery_modules']['stp'] = 1;
$config['modules_compat']['rfc1628']['liebert'] = 1;
diff --git a/includes/discovery/cisco-cbqos.inc.php b/includes/discovery/cisco-cbqos.inc.php
new file mode 100644
index 0000000000..86eec8d9cf
--- /dev/null
+++ b/includes/discovery/cisco-cbqos.inc.php
@@ -0,0 +1,184 @@
+
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+ */
+
+if ($device['os_group'] == 'cisco') {
+
+ $MODULE = 'Cisco-CBQOS';
+ echo $MODULE.': ';
+
+ require_once 'includes/component.php';
+ $COMPONENT = new component();
+ $COMPONENTS = $COMPONENT->getComponents($device['device_id'],array('type'=>$MODULE));
+
+ // We only care about our device id.
+ $COMPONENTS = $COMPONENTS[$device['device_id']];
+
+
+ // Begin our master array, all other values will be processed into this array.
+ $tblCBQOS = array();
+
+ // Let's gather some data..
+ $tblcbQosServicePolicy = snmpwalk_array_num($device, '.1.3.6.1.4.1.9.9.166.1.1');
+ $tblcbQosObjects = snmpwalk_array_num($device, '.1.3.6.1.4.1.9.9.166.1.5', 2);
+ $tblcbQosPolicyMapCfg = snmpwalk_array_num($device, '.1.3.6.1.4.1.9.9.166.1.6');
+ $tblcbQosClassMapCfg = snmpwalk_array_num($device, '.1.3.6.1.4.1.9.9.166.1.7');
+ $tblcbQosMatchStmtCfg = snmpwalk_array_num($device, '.1.3.6.1.4.1.9.9.166.1.8');
+
+ /*
+ * False == no object found - this is not an error, there is no QOS configured
+ * null == timeout or something else that caused an error, there may be QOS configured but we couldn't get it.
+ */
+ if ( is_null($tblcbQosServicePolicy) || is_null($tblcbQosObjects) || is_null($tblcbQosPolicyMapCfg) || is_null($tblcbQosClassMapCfg) || is_null($tblcbQosMatchStmtCfg) ) {
+ // We have to error here or we will end up deleting all our QoS components.
+ echo "Error\n";
+ }
+ else {
+ // No Error, lets process things.
+ d_echo("QoS Objects Found:\n");
+
+ foreach ($tblcbQosObjects['1.3.6.1.4.1.9.9.166.1.5.1.1.2'] as $spid => $array) {
+
+ foreach ($array as $spobj => $index) {
+ $RESULT = array();
+
+ // Produce a unique reproducible index for this entry.
+ $RESULT['UID'] = hash('crc32', $spid."-".$spobj);
+
+ // Now that we have a valid identifiers, lets add some more data
+ $RESULT['sp-id'] = $spid;
+ $RESULT['sp-obj'] = $spobj;
+
+ // Add the Type, Policy-map, Class-map, etc.
+ $type = $tblcbQosObjects['1.3.6.1.4.1.9.9.166.1.5.1.1.3'][$spid][$spobj];
+ $RESULT['qos-type'] = $type;
+
+ // Add the Parent, this lets us work out our hierarchy for display later.
+ $RESULT['parent'] = $tblcbQosObjects['1.3.6.1.4.1.9.9.166.1.5.1.1.4'][$spid][$spobj];
+ $RESULT['direction'] = $tblcbQosServicePolicy['1.3.6.1.4.1.9.9.166.1.1.1.1.3'][$spid];
+ $RESULT['ifindex'] = $tblcbQosServicePolicy['1.3.6.1.4.1.9.9.166.1.1.1.1.4'][$spid];
+
+ // Gather different data depending on the type.
+ switch ($type) {
+ case 1:
+ // Policy-map, get data from that table.
+ d_echo("\nIndex: ".$index."\n");
+ d_echo(" UID: ".$RESULT['UID']."\n");
+ d_echo(" SPID.SPOBJ: ".$RESULT['sp-id'].".".$RESULT['sp-obj']."\n");
+ d_echo(" If-Index: ".$RESULT['ifindex']."\n");
+ d_echo(" Type: 1 - Policy-Map\n");
+ $RESULT['label'] = $tblcbQosPolicyMapCfg['1.3.6.1.4.1.9.9.166.1.6.1.1.1'][$index];
+ if ($tblcbQosPolicyMapCfg['1.3.6.1.4.1.9.9.166.1.6.1.1.2'][$index] != "") {
+ $RESULT['label'] .= " - ".$tblcbQosPolicyMapCfg['1.3.6.1.4.1.9.9.166.1.6.1.1.2'][$index];
+ }
+ d_echo(" Label: ".$RESULT['label']."\n");
+ break;
+ case 2:
+ // Class-map, get data from that table.
+ d_echo("\nIndex: ".$index."\n");
+ d_echo(" UID: ".$RESULT['UID']."\n");
+ d_echo(" SPID.SPOBJ: ".$RESULT['sp-id'].".".$RESULT['sp-obj']."\n");
+ d_echo(" If-Index: ".$RESULT['ifindex']."\n");
+ d_echo(" Type: 2 - Class-Map\n");
+ $RESULT['label'] = $tblcbQosClassMapCfg['1.3.6.1.4.1.9.9.166.1.7.1.1.1'][$index];
+ if($tblcbQosClassMapCfg['1.3.6.1.4.1.9.9.166.1.7.1.1.2'][$index] != "") {
+ $RESULT['label'] .= " - ".$tblcbQosClassMapCfg['1.3.6.1.4.1.9.9.166.1.7.1.1.2'][$index];
+ }
+ d_echo(" Label: ".$RESULT['label']."\n");
+ if ($tblcbQosClassMapCfg['1.3.6.1.4.1.9.9.166.1.7.1.1.3'][$index] == 2) {
+ $RESULT['map-type'] = 'Match-All';
+ }
+ elseif ($tblcbQosClassMapCfg['1.3.6.1.4.1.9.9.166.1.7.1.1.3'][$index] == 3) {
+ $RESULT['map-type'] = 'Match-Any';
+ }
+ else {
+ $RESULT['map-type'] = 'None';
+ }
+
+ // Find a child, this will be a type 3
+ foreach ($tblcbQosObjects['1.3.6.1.4.1.9.9.166.1.5.1.1.4'][$spid] as $ID => $VALUE) {
+ if ($VALUE == $RESULT['sp-obj']) {
+ // We have our child, import the match
+ if ($tblcbQosObjects['1.3.6.1.4.1.9.9.166.1.5.1.1.3'][$spid][$ID] == 3) {
+ $RESULT['match'] = $RESULT['map-type'].": ".$tblcbQosMatchStmtCfg['1.3.6.1.4.1.9.9.166.1.8.1.1.1'][$tblcbQosObjects['1.3.6.1.4.1.9.9.166.1.5.1.1.2'][$spid][$ID]];
+ d_echo(" Match: ".$RESULT['match']."\n");
+ }
+ }
+ }
+ break;
+ default:
+ continue 2;
+ }
+
+ $tblCBQOS[] = $RESULT;
+ }
+ }
+
+ /*
+ * Ok, we have our 2 array's (Components and SNMP) now we need
+ * to compare and see what needs to be added/updated.
+ *
+ * Let's loop over the SNMP data to see if we need to ADD or UPDATE any components.
+ */
+ foreach ($tblCBQOS as $key => $array) {
+ $COMPONENT_KEY = false;
+
+ // Loop over our components to determine if the component exists, or we need to add it.
+ foreach ($COMPONENTS as $COMPID => $CHILD) {
+ if ($CHILD['UID'] === $array['UID']) {
+ $COMPONENT_KEY = $COMPID;
+ }
+ }
+
+ if (!$COMPONENT_KEY) {
+ // The component doesn't exist, we need to ADD it - ADD.
+ $NEW_COMPONENT = $COMPONENT->createComponent($device['device_id'],$MODULE);
+ $COMPONENT_KEY = key($NEW_COMPONENT);
+ $COMPONENTS[$COMPONENT_KEY] = array_merge($NEW_COMPONENT[$COMPONENT_KEY], $array);
+ echo "+";
+ }
+ else {
+ // The component does exist, merge the details in - UPDATE.
+ $COMPONENTS[$COMPONENT_KEY] = array_merge($COMPONENTS[$COMPONENT_KEY], $array);
+ echo ".";
+ }
+
+ }
+
+ /*
+ * Loop over the Component data to see if we need to DELETE any components.
+ */
+ foreach ($COMPONENTS as $key => $array) {
+ // Guilty until proven innocent
+ $FOUND = false;
+
+ foreach ($tblCBQOS as $k => $v) {
+ if ($array['UID'] == $v['UID']) {
+ // Yay, we found it...
+ $FOUND = true;
+ }
+ }
+
+ if ($FOUND === false) {
+ // The component has not been found. we should delete it.
+ echo "-";
+ $COMPONENT->deleteComponent($key);
+ }
+ }
+
+ // Write the Components back to the DB.
+ $COMPONENT->setComponentPrefs($device['device_id'],$COMPONENTS);
+ echo "\n";
+
+ } // End if not error
+
+}
diff --git a/includes/polling/cisco-cbqos.inc.php b/includes/polling/cisco-cbqos.inc.php
new file mode 100644
index 0000000000..7d8fea76de
--- /dev/null
+++ b/includes/polling/cisco-cbqos.inc.php
@@ -0,0 +1,72 @@
+
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+ */
+
+if ($device['os_group'] == "cisco") {
+
+ $MODULE = 'Cisco-CBQOS';
+
+ require_once 'includes/component.php';
+ $COMPONENT = new component();
+ $options['filter']['type'] = array('=',$MODULE);
+ $options['filter']['disabled'] = array('=',0);
+ $options['filter']['ignore'] = array('=',0);
+ $COMPONENTS = $COMPONENT->getComponents($device['device_id'],$options);
+
+ // We only care about our device id.
+ $COMPONENTS = $COMPONENTS[$device['device_id']];
+
+ // Only collect SNMP data if we have enabled components
+ if (count($COMPONENTS > 0)) {
+ // Let's gather the stats..
+ $tblcbQosClassMapStats = snmpwalk_array_num($device, '.1.3.6.1.4.1.9.9.166.1.15.1.1', 2);
+
+ // Loop through the components and extract the data.
+ foreach ($COMPONENTS as $KEY => $ARRAY) {
+ $TYPE = $ARRAY['qos-type'];
+
+ // Get data from the class table.
+ if ($TYPE == 2) {
+ // Let's make sure the RRD is setup for this class.
+ $filename = "port-".$ARRAY['ifindex']."-cbqos-".$ARRAY['sp-id']."-".$ARRAY['sp-obj'].".rrd";
+ $rrd_filename = $config['rrd_dir'] . "/" . $device['hostname'] . "/" . safename ($filename);
+
+ if (!file_exists ($rrd_filename)) {
+ rrdtool_create ($rrd_filename, " DS:postbits:COUNTER:600:0:U DS:bufferdrops:COUNTER:600:0:U DS:qosdrops:COUNTER:600:0:U" . $config['rrd_rra']);
+ }
+
+ // Let's print some debugging info.
+ d_echo("\n\nComponent: ".$KEY."\n");
+ d_echo(" Class-Map: ".$ARRAY['label']."\n");
+ d_echo(" SPID.SPOBJ: ".$ARRAY['sp-id'].".".$ARRAY['sp-obj']."\n");
+ d_echo(" PostBytes: 1.3.6.1.4.1.9.9.166.1.15.1.1.10.".$ARRAY['sp-id'].".".$ARRAY['sp-obj']." = ".$tblcbQosClassMapStats['1.3.6.1.4.1.9.9.166.1.15.1.1.10'][$ARRAY['sp-id']][$ARRAY['sp-obj']]."\n");
+ d_echo(" BufferDrops: 1.3.6.1.4.1.9.9.166.1.15.1.1.21.".$ARRAY['sp-id'].".".$ARRAY['sp-obj']." = ".$tblcbQosClassMapStats['1.3.6.1.4.1.9.9.166.1.15.1.1.21'][$ARRAY['sp-id']][$ARRAY['sp-obj']]."\n");
+ d_echo(" QOSDrops: 1.3.6.1.4.1.9.9.166.1.15.1.1.17.".$ARRAY['sp-id'].".".$ARRAY['sp-obj']." = ".$tblcbQosClassMapStats['1.3.6.1.4.1.9.9.166.1.15.1.1.17'][$ARRAY['sp-id']][$ARRAY['sp-obj']]."\n");
+
+ $RRD['postbytes'] = $tblcbQosClassMapStats['1.3.6.1.4.1.9.9.166.1.15.1.1.10'][$ARRAY['sp-id']][$ARRAY['sp-obj']];
+ $RRD['bufferdrops'] = $tblcbQosClassMapStats['1.3.6.1.4.1.9.9.166.1.15.1.1.21'][$ARRAY['sp-id']][$ARRAY['sp-obj']];
+ $RRD['qosdrops'] = $tblcbQosClassMapStats['1.3.6.1.4.1.9.9.166.1.15.1.1.17'][$ARRAY['sp-id']][$ARRAY['sp-obj']];
+
+ // Update RRD
+ rrdtool_update ($rrd_filename, $RRD);
+
+ // Clean-up after yourself!
+ unset($filename, $rrd_filename);
+ }
+ } // End foreach components
+
+ echo $MODULE." ";
+ } // end if count components
+
+ // Clean-up after yourself!
+ unset($TYPE, $COMPONENTS, $COMPONENT, $options, $MODULE);
+}
\ No newline at end of file
diff --git a/includes/snmp.inc.php b/includes/snmp.inc.php
index e2d4bac018..cee0032cc0 100644
--- a/includes/snmp.inc.php
+++ b/includes/snmp.inc.php
@@ -1268,4 +1268,70 @@ function register_mibs($device, $mibs, $included_by)
}
echo "\n";
+
} // register_mibs
+
+/**
+ * SNMPWalk_array_num - performs a numeric SNMPWalk and returns an array containing $count indexes
+ * One Index:
+ * From: 1.3.6.1.4.1.9.9.166.1.15.1.1.27.18.655360 = 0
+ * To: $array['1.3.6.1.4.1.9.9.166.1.15.1.1.27.18']['655360'] = 0
+ * Two Indexes:
+ * From: 1.3.6.1.4.1.9.9.166.1.15.1.1.27.18.655360 = 0
+ * To: $array['1.3.6.1.4.1.9.9.166.1.15.1.1.27']['18']['655360'] = 0
+ * And so on...
+ * Think snmpwalk_cache_*_oid but for numeric data.
+ *
+ * Why is this useful?
+ * Some SNMP data contains a single index (eg. ifIndex in IF-MIB) and some is dual indexed
+ * (eg. PolicyIndex/ObjectsIndex in CISCO-CLASS-BASED-QOS-MIB).
+ * The resulting array allows us to easily access the top level index we want and iterate over the data from there.
+ *
+ * @param $device
+ * @param $OID
+ * @param int $indexes
+ * @internal param $string
+ * @return array
+ */
+function snmpwalk_array_num($device,$OID,$indexes=1) {
+ $array = array();
+ $string = snmp_walk($device, $OID, '-Osqn');
+
+ if ( $string === false) {
+ // False means: No Such Object.
+ return false;
+ }
+ if ($string == "") {
+ // Empty means SNMP timeout or some such.
+ return null;
+ }
+
+ // Let's turn the string into something we can work with.
+ foreach (explode("\n", $string) as $line) {
+ if ($line[0] == '.') {
+ // strip the leading . if it exists.
+ $line = substr($line,1);
+ }
+ list($key, $value) = explode(' ', $line, 2);
+ $prop_id = explode('.', $key);
+ $value = trim($value);
+
+ // if we have requested more levels that exist, set to the max.
+ if ($indexes > count($prop_id)) {
+ $indexes = count($prop_id)-1;
+ }
+
+ for ($i=0;$i<$indexes;$i++) {
+ // Pop the index off.
+ $index = array_pop($prop_id);
+ $value = array($index => $value);
+ }
+
+ // Rebuild our key
+ $key = implode('.',$prop_id);
+
+ // Add the entry to the master array
+ $array = array_replace_recursive($array,array($key => $value));
+ }
+ return $array;
+}