Index: sql-schema/026.sql
===================================================================
--- sql-schema/026.sql	(revision 0)
+++ sql-schema/026.sql	(revision 0)
@@ -0,0 +1 @@
+CREATE TABLE IF NOT EXISTS `access_points` (  `accesspoint_id` int(11) NOT NULL AUTO_INCREMENT,  `device_id` int(11) NOT NULL,  `name` varchar(255) NOT NULL,  `radio_number` tinyint(4) DEFAULT NULL,  `type` varchar(16) NOT NULL,  `mac_addr` varchar(24) NOT NULL,  `deleted` tinyint(1) NOT NULL DEFAULT '0',  `channel` tinyint(4) unsigned NOT NULL DEFAULT '0',  `txpow` tinyint(4) NOT NULL DEFAULT '0',  `radioutil` tinyint(4) NOT NULL DEFAULT '0',  `numasoclients` smallint(6) NOT NULL DEFAULT '0',  `nummonclients` smallint(6) NOT NULL DEFAULT '0',  `numactbssid` tinyint(4) NOT NULL DEFAULT '0',  `nummonbssid` tinyint(4) NOT NULL DEFAULT '0',  `interference` tinyint(3) unsigned NOT NULL,  PRIMARY KEY (`accesspoint_id`),  KEY `deleted` (`deleted`),  KEY `name` (`name`,`radio_number`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Access Points';
\ No newline at end of file
Index: html/pages/device/graphs/wireless.inc.php
===================================================================
--- html/pages/device/graphs/wireless.inc.php	(revision 2920)
+++ html/pages/device/graphs/wireless.inc.php	(working copy)
@@ -7,4 +7,5 @@
   include("includes/print-device-graph.php");
 }
 
-?>
\ No newline at end of file
+
+?>
Index: html/pages/device.inc.php
===================================================================
--- html/pages/device.inc.php	(revision 2920)
+++ html/pages/device.inc.php	(working copy)
@@ -6,6 +6,7 @@
   $permit_ports = 1;
 }
 
+
 if (device_permitted($vars['device']) || $check_device == $vars['device'])
 {
   $selected['iface'] = "selected";
@@ -99,6 +100,15 @@
   </li>');
     }
 
+    if (@dbFetchCell("SELECT COUNT(accesspoint_id) FROM accesspoint WHERE device_id = '" . $device['device_id'] . "'") > '0')
+    {
+      echo('<li class="' . $select['accesspoints'] . '">
+    <a href="'.generate_device_url($device, array('tab' => 'accesspoints')). '">
+      <img src="images/icons/wireless.png" align="absmiddle" border="0" /> Access Points
+    </a>
+  </li>');
+    }
+
     if (isset($config['smokeping']['dir']))
     {
       $smokeping_files = array();
Index: html/includes/graphs/graph.inc.php
===================================================================
--- html/includes/graphs/graph.inc.php	(revision 2920)
+++ html/includes/graphs/graph.inc.php	(working copy)
@@ -39,10 +39,11 @@
   {
     include($config['install_dir'] . "/html/includes/graphs/$type/$subtype.inc.php");
   }
+
 }
 else
 {
-  graph_error("Graph Template Missing");
+  graph_error("$type*$subtype ");//Graph Template Missing");
 }
 
 function graph_error($string)
@@ -79,6 +80,7 @@
   }
 }
 
+
 if ($error_msg) {
   graph_error($graph_error);
 } elseif (!$auth) {
@@ -109,6 +111,7 @@
     unlink($graphfile);
     echo("</div>");
   } else {
+
     if ($rrd_options)
     {
       rrdtool_graph($graphfile, $rrd_options);
Index: html/includes/functions.inc.php
===================================================================
--- html/includes/functions.inc.php	(revision 2920)
+++ html/includes/functions.inc.php	(working copy)
@@ -264,6 +264,7 @@
 
 function generate_graph_tag($args)
 {
+
   foreach ($args as $key => $arg)
   {
     $urlargs[] = $key."=".$arg;
@@ -352,11 +353,57 @@
   }
 }
 
+function generate_ap_link($args, $text = NULL, $type = NULL)
+{
+  global $config;
+
+
+
+  $args = ifNameDescr($args);
+  if (!$text) { $text = fixIfName($args['label']); }
+  if ($type) { $args['graph_type'] = $type; }
+  if (!isset($args['graph_type'])) { $args['graph_type'] = 'port_bits'; }
+
+  if (!isset($args['hostname'])) { $args = array_merge($args, device_by_id_cache($args['device_id'])); }
+
+  $content = "<div class=list-large>".$args['text']." - " . fixifName($args['label']) . "</div>";
+  if ($args['ifAlias']) { $content .= $args['ifAlias']."<br />"; }
+  $content .= "<div style=\'width: 850px\'>";
+  $graph_array['type']     = $args['graph_type'];
+  $graph_array['legend']   = "yes";
+  $graph_array['height']   = "100";
+  $graph_array['width']    = "340";
+  $graph_array['to']           = $config['time']['now'];
+  $graph_array['from']     = $config['time']['day'];
+  $graph_array['id']       = $args['accesspoint_id'];
+  $content .= generate_graph_tag($graph_array);
+  $graph_array['from']     = $config['time']['week'];
+  $content .= generate_graph_tag($graph_array);
+  $graph_array['from']     = $config['time']['month'];
+  $content .= generate_graph_tag($graph_array);
+  $graph_array['from']     = $config['time']['year'];
+  $content .= generate_graph_tag($graph_array);
+  $content .= "</div>";
+
+
+  $url = generate_ap_url($args);
+  if (port_permitted($args['interface_id'], $args['device_id'])) {
+    return overlib_link($url, $text, $content, $class);
+  } else {
+    return fixifName($text);
+  }
+}
+
 function generate_port_url($port, $vars=array())
 {
   return generate_url(array('page' => 'device', 'device' => $port['device_id'], 'tab' => 'port', 'port' => $port['interface_id']), $vars);
 }
 
+function generate_ap_url($ap, $vars=array())
+{
+  return generate_url(array('page' => 'device', 'device' => $ap['device_id'], 'tab' => 'accesspoint', 'ap' => $ap['accesspoint_id']), $vars);
+}
+
 function generate_port_thumbnail($args)
 {
   if (!$args['bg']) { $args['bg'] = "FFFFFF"; }
Index: html/includes/print-accesspoint-graphs.inc.php
===================================================================
--- html/includes/print-accesspoint-graphs.inc.php	(revision 0)
+++ html/includes/print-accesspoint-graphs.inc.php	(revision 0)
@@ -0,0 +1,13 @@
+<?php
+
+global $config;
+
+$graph_array['height'] = "100";
+$graph_array['width']  = "215";
+$graph_array['to']     = $config['time']['now'];
+$graph_array['id']     = $ap['accesspoint_id'];
+$graph_array['type']   = $graph_type;
+
+include("includes/print-quadgraphs.inc.php");
+
+?>
Index: html/includes/print-accesspoint.inc.php
===================================================================
--- html/includes/print-accesspoint.inc.php	(revision 0)
+++ html/includes/print-accesspoint.inc.php	(revision 0)
@@ -0,0 +1,92 @@
+<?php
+
+if($int_colour)
+{
+  $row_colour = $int_colour;
+} else {
+  if (!is_integer($i/2)) { $row_colour = $list_colour_a; } else { $row_colour = $list_colour_b; }
+}
+
+
+$text=$ap['name'] ." ".$ap['type'];
+$ap['text']=$text;
+
+echo("<tr style=\"background-color: $row_colour;\" valign=top onmouseover=\"this.style.backgroundColor='$list_highlight';\" onmouseout=\"this.style.backgroundColor='$row_colour';\" onclick=\"location.href='" . generate_ap_url($ap) . "/'\" style='cursor: pointer;'> 
+         <td valign=top width=350>");
+echo("        <span class=list-large> " . generate_ap_link($ap,  " $text </span><br />"));
+echo("<span class=interface-desc>");
+echo("$break".$ap['mac_addr']."<br>".$ap['type']. " - channel ".$ap['channel']);
+echo("<br />txpow $ap[txpow]");
+echo("</span>");
+echo("</td><td width=100>");
+
+
+echo("</td><td width=150>");
+$ap['graph_type'] = "accesspoints_numasoclients";
+echo(generate_ap_link($ap, "<img src='graph.php?type=$ap[graph_type]&amp;id=".$ap['accesspoint_id']."&amp;from=".$config['time']['day']."&amp;to=".$config['time']['now']."&amp;width=100&amp;height=20&amp;legend=no&amp;bg=".str_replace("#","", $row_colour)."'>"));
+echo("<br>\n");
+$ap['graph_type'] = "accesspoints_radioutil";
+echo(generate_ap_link($ap, "<img src='graph.php?type=$ap[graph_type]&amp;id=".$ap['accesspoint_id']."&amp;from=".$config['time']['day']."&amp;to=".$config['time']['now']."&amp;width=100&amp;height=20&amp;legend=no&amp;bg=".str_replace("#","", $row_colour)."'>"));
+echo("<br>\n");
+$ap['graph_type'] = "accesspoints_interference";
+echo(generate_ap_link($ap, "<img src='graph.php?type=$ap[graph_type]&amp;id=".$ap['accesspoint_id']."&amp;from=".$config['time']['day']."&amp;to=".$config['time']['now']."&amp;width=100&amp;height=20&amp;legend=no&amp;bg=".str_replace("#","", $row_colour)."'>"));
+echo("<br>\n");
+
+echo("</td><td width=120>");
+
+echo("<img src='images/icons/wireless.png' style='height:20px; width:20px;' align=absmiddle /> ".format_bi($ap[numasoclients])." Clients<br />");
+echo("<img src='images/icons/wireless.png' style='height:20px; width:20px;' align=absmiddle /> ".format_bi($ap[radioutil])." % busy<br />");
+echo("<img src='images/icons/wireless.png' style='height:20px; width:20px;' align=absmiddle /> ".format_bi($ap[interference])." interference index<br />");
+
+echo("</td></tr>");
+
+
+
+if ($vars['tab'] == "accesspoint") {
+
+
+  $graph_type='accesspoints_numasoclients';
+  echo("<tr style='background-color: $row_colour; padding: 0px;'><td colspan=7>");
+  echo("<div class='graphhead'>Associated Clients</div>");
+  include("includes/print-accesspoint-graphs.inc.php");
+  echo("</td></tr>");
+
+  $graph_type='accesspoints_interference';
+  echo("<tr style='background-color: $row_colour; padding: 0px;'><td colspan=7>");
+  echo("<div class='graphhead'>Interference</div>");
+  include("includes/print-accesspoint-graphs.inc.php");
+  echo("</td></tr>");
+
+  $graph_type='accesspoints_channel';
+  echo("<tr style='background-color: $row_colour; padding: 0px;'><td colspan=7>");
+  echo("<div class='graphhead'>Channel</div>");
+  include("includes/print-accesspoint-graphs.inc.php");
+  echo("</td></tr>");
+
+  $graph_type='accesspoints_txpow';
+  echo("<tr style='background-color: $row_colour; padding: 0px;'><td colspan=7>");
+  echo("<div class='graphhead'>Transmit Power</div>");
+  include("includes/print-accesspoint-graphs.inc.php");
+  echo("</td></tr>");
+
+  $graph_type='accesspoints_radioutil';
+  echo("<tr style='background-color: $row_colour; padding: 0px;'><td colspan=7>");
+  echo("<div class='graphhead'>Radio Utilization</div>");
+  include("includes/print-accesspoint-graphs.inc.php");
+  echo("</td></tr>");
+
+  $graph_type='accesspoints_nummonclients';
+  echo("<tr style='background-color: $row_colour; padding: 0px;'><td colspan=7>");
+  echo("<div class='graphhead'>Monitored Clients</div>");
+  include("includes/print-accesspoint-graphs.inc.php");
+  echo("</td></tr>");
+
+  $graph_type='accesspoints_nummonbssid';
+  echo("<tr style='background-color: $row_colour; padding: 0px;'><td colspan=7>");
+  echo("<div class='graphhead'>Number of monitored BSSIDs</div>");
+  include("includes/print-accesspoint-graphs.inc.php");
+  echo("</td></tr>");
+
+ }
+
+?>
Index: includes/static-config.php
===================================================================
--- includes/static-config.php	(revision 2920)
+++ includes/static-config.php	(working copy)
@@ -865,6 +865,13 @@
 $config['os'][$os]['type']              = "wireless";
 $config['os'][$os]['icon']              = "arubaos";
 
+$config['os'][$os]['over'][0]['graph']  = "device_arubacontroller_numaps";
+$config['os'][$os]['over'][0]['text']   = "Number of APs";
+$config['os'][$os]['over'][1]['graph']  = "device_arubacontroller_numclients";
+$config['os'][$os]['over'][1]['text']   = "Number of Clients";
+
+
+
 foreach ($config['os'] as $this_os => $blah)
 {
   if (isset($config['os'][$this_os]['group']))
Index: includes/polling/os/arubaos.inc.php
===================================================================
--- includes/polling/os/arubaos.inc.php	(revision 2920)
+++ includes/polling/os/arubaos.inc.php	(working copy)
@@ -4,4 +4,19 @@
 $badchars = array("(", ")", ",");
 list(,,$hardware,,$version,) = str_replace($badchars, "", explode (" ", $poll_device['sysDescr']));
 
+//// Build SNMP Cache Array
+
+//stuff about the controller
+$switch_info_oids = array('wlsxSwitchRole','wlsxSwitchMasterIp');
+echo("Caching Oids: ");
+foreach ($switch_info_oids as $oid) { echo("$oid "); $aruba_info = snmpwalk_cache_oid($device, $oid, $aruba_info, "WLSX-SWITCH-MIB"); }
+
+echo("\n");
+
+if ($aruba_info[0]['wlsxSwitchRole']=='master') {
+	$features="Master Controller";
+} else {
+	$features="Local Controller for ".$aruba_info[0]['wlsxSwitchMasterIp'];
+}	
+
 ?>
Index: includes/polling/aruba-controller.inc.php
===================================================================
--- includes/polling/aruba-controller.inc.php	(revision 0)
+++ includes/polling/aruba-controller.inc.php	(revision 0)
@@ -0,0 +1,146 @@
+<?php
+if ($device['type'] == 'wireless' && $device['os'] == 'arubaos') 
+{
+  global $config;
+
+  echo("Aruba Controller: ");
+  $polled = time();
+
+  //// Build SNMP Cache Array
+	
+  //stuff about the controller
+  $switch_info_oids = array('wlsxSwitchRole','wlsxSwitchMasterIp');
+  $switch_counter_oids = array('wlsxSwitchTotalNumAccessPoints.0','wlsxSwitchTotalNumStationsAssociated.0');
+
+
+  $switch_apinfo_oids = array('wlsxWlanRadioEntry','wlanAPChInterferenceIndex');
+  $switch_apname_oids = array('wlsxWlanRadioEntry.16');
+
+
+
+  $aruba_oids=array_merge($switch_info_oids,$switch_counter_oids);
+  echo("Caching Oids: ");
+  foreach ($aruba_oids as $oid) { echo("$oid "); $aruba_stats = snmpwalk_cache_oid($device, $oid, $aruba_stats, "WLSX-SWITCH-MIB"); }
+  foreach ($switch_apinfo_oids as $oid) { echo("$oid "); $aruba_apstats = snmpwalk_cache_oid_num($device, $oid, $aruba_apstats, "WLSX-WLAN-MIB"); }
+  foreach ($switch_apname_oids as $oid) { echo("$oid "); $aruba_apnames = snmpwalk_cache_oid_num($device, $oid, $aruba_apnames, "WLSX-WLAN-MIB"); }
+
+
+  echo("\n");
+
+  $rrdfile = $host_rrd . "/aruba-controller".safename(".rrd");
+  if (!is_file($rrdfile))
+  {
+    rrdtool_create($rrdfile," --step 300 DS:NUMAPS:GAUGE:600:0:12500000000 DS:NUMCLIENTS:GAUGE:600:0:12500000000 ".$config['rrd_rra']);
+  }
+
+  $cont_rrd_update="$polled:".$aruba_stats[0]['wlsxSwitchTotalNumAccessPoints'].":".$aruba_stats[0]['wlsxSwitchTotalNumStationsAssociated'];
+  $ret = rrdtool_update($rrdfile,$cont_rrd_update);
+
+  // also save the info about how many clients in the same place as the wireless module
+  $wificlientsrrd  = $config['rrd_dir'] . "/" . $device['hostname'] . "/" . safename("wificlients-radio1.rrd");
+
+  if (!is_file($wificlientsrrd))
+  {
+    rrdtool_create($wificlientsrrd,"--step 300 DS:wificlients:GAUGE:600:-273:10000 ".$config['rrd_rra']);
+  }
+
+  rrdtool_update($wificlientsrrd,"N:".$aruba_stats[0]['wlsxSwitchTotalNumStationsAssociated']);
+
+  $graphs['wifi_clients'] = TRUE;
+
+
+  $ap_db = dbFetchRows("SELECT * FROM `accesspoint` WHERE `device_id` = ?", array($device['device_id']));
+
+
+  foreach ($aruba_apnames as $key => $value) {
+    $radioid=str_replace("1.3.6.1.4.1.14823.2.2.1.5.2.1.5.1.16.","",$key);
+    $name=$value[''];
+    $type         =$aruba_apstats["1.3.6.1.4.1.14823.2.2.1.5.2.1.5.1.2.$radioid"][''];
+    $channel      =$aruba_apstats["1.3.6.1.4.1.14823.2.2.1.5.2.1.5.1.3.$radioid"]['']+0;
+    $txpow        =$aruba_apstats["1.3.6.1.4.1.14823.2.2.1.5.2.1.5.1.4.$radioid"]['']+0;
+    $radioutil    =$aruba_apstats["1.3.6.1.4.1.14823.2.2.1.5.2.1.5.1.6.$radioid"]['']+0;
+    $numasoclients=$aruba_apstats["1.3.6.1.4.1.14823.2.2.1.5.2.1.5.1.7.$radioid"]['']+0;
+    $nummonclients=$aruba_apstats["1.3.6.1.4.1.14823.2.2.1.5.2.1.5.1.8.$radioid"]['']+0;
+    $numactbssid  =$aruba_apstats["1.3.6.1.4.1.14823.2.2.1.5.2.1.5.1.9.$radioid"]['']+0;
+    $nummonbssid  =$aruba_apstats["1.3.6.1.4.1.14823.2.2.1.5.2.1.5.1.10.$radioid"]['']+0;
+    $interference =$aruba_apstats["1.3.6.1.4.1.14823.2.2.1.5.3.1.6.1.11.$radioid"]['']+0;
+
+    $radionum=substr($radioid,strlen($radioid)-1,1);
+
+    if ($debug)
+    {
+      echo("* radioid: $radioid\n");
+      echo("  radionum: $radionum\n");
+      echo("  name: $name\n");
+      echo("  type: $type\n");
+      echo("  channel: $channel\n");
+      echo("  txpow: $txpow\n");
+      echo("  radioutil: $radioutil\n");
+      echo("  numasoclients: $numasoclients\n");			
+      echo("  interference: $interference\n");			
+
+    }
+
+    // if there is a numeric channel, assume the rest of the data is valid, I guess		
+    if (is_numeric($channel))
+    {
+      $rrd_file = $config['rrd_dir'] . "/" . $device['hostname'] ."/" .safename("arubaap-$name.$radionum.rrd");
+      if (!is_file($rrd_file))
+      {
+	$dslist="DS:channel:GAUGE:600:0:200 ";
+	$dslist.="DS:txpow:GAUGE:600:0:200 ";
+	$dslist.="DS:radioutil:GAUGE:600:0:100 ";
+	$dslist.="DS:nummonclients:GAUGE:600:0:500 ";
+	$dslist.="DS:nummonbssid:GAUGE:600:0:200 ";
+	$dslist.="DS:numasoclients:GAUGE:600:0:500 ";
+	$dslist.="DS:interference:GAUGE:600:0:2000 ";
+	rrdtool_create($rrd_file, "--step 300 $dslist ".$config['rrd_rra']);
+      }
+
+      rrdtool_update($rrd_file,  "$polled:".$channel.":".$txpow.":".$radioutil.":".$nummonclients.":".$nummonbssid.":".$numasoclients.":".$interference);
+    }
+
+    //generate the mac address
+    $macparts=explode(".",$radioid,-1);
+    $mac="";
+    foreach ($macparts as $part) {
+      $mac.=sprintf("%02x",$part).":";
+    }
+    $mac=rtrim($mac,":");
+
+
+    $foundid=0;
+
+    for ($z=0;$z<sizeof($ap_db);$z++) { 
+      if ($ap_db[$z]['name']==$name && $ap_db[$z]['radio_number']==$radionum) {
+	$foundid=$ap_db[$z]['accesspoint_id'];
+	$ap_db[$z]['seen']=1;
+	continue;
+      }
+    }
+
+
+
+    if ($foundid==0) {
+      $ap_id = dbInsert(array('device_id' => $device['device_id'], 'name' => $name,'radio_number'=>$radionum, 'type'=>$type,'mac_addr'=>$mac,'channel'=>$channel,'txpow'=>$txpow,'radioutil'=>$radioutil,'numasoclients'=>$numasoclients,'nummonclients'=>$nummonclients,'numactbssid'=>$numactbssid,'nummonbssid'=>$nummonbssid,'interference'=>$interference), 'accesspoint');
+    } else {
+      dbUpdate(array('mac_addr' => $mac,'deleted'=>0,'channel'=>$channel,'txpow'=>$txpow,'radioutil'=>$radioutil,'numasoclients'=>$numasoclients,'nummonclients'=>$nummonclients,'numactbssid'=>$numactbssid,'nummonbssid'=>$nummonbssid,'interference'=>$interference), 'accesspoint', '`accesspoint_id` = ?', Array($foundid));
+    }
+
+
+
+  }
+
+  //mark APs which are not on this controller anymore as deleted
+  for ($z=0;$z<sizeof($ap_db);$z++) {
+    if (!isset($ap_db[$z]['seen']) && $ap_db[$z]['deleted']==0) {
+      dbUpdate(array('deleted'=>1), 'accesspoint', '`accesspoint_id` = ?', Array($ap_db[$z]['accesspoint_id']));
+    }
+	  
+
+  }
+
+}
+
+
+?>
Index: includes/defaults.inc.php
===================================================================
--- includes/defaults.inc.php	(revision 2920)
+++ includes/defaults.inc.php	(working copy)
@@ -33,6 +33,20 @@
 $config['neato']          = "/usr/bin/neato";
 $config['sfdp']           = "/usr/bin/sfdp";
 
+
+
+
+### RRD Format Settings
+### These should not normally be changed
+### Though one could conceivably increase or decrease the size of each RRA if one had performance problems
+### Or if one had a very fast I/O subsystem with no performance worries.
+
+$config['rrd_rra']  = " RRA:AVERAGE:0.5:1:2016 RRA:AVERAGE:0.5:6:1440 RRA:AVERAGE:0.5:24:1440 RRA:AVERAGE:0.5:288:1440 ";
+$config['rrd_rra'] .= " RRA:MAX:0.5:1:720 RRA:MIN:0.5:6:1440     RRA:MIN:0.5:24:775     RRA:MIN:0.5:288:797 ";
+$config['rrd_rra'] .= " RRA:MAX:0.5:1:720 RRA:MAX:0.5:6:1440     RRA:MAX:0.5:24:775     RRA:MAX:0.5:288:797 ";
+$config['rrd_rra'] .= " RRA:LAST:0.5:1:1440 ";
+
+
 ### RRDCacheD - Make sure it can write to your RRD dir!
 
 #$config['rrdcached']    = "unix:/var/run/rrdcached.sock";
@@ -381,6 +395,7 @@
 $config['poller_modules']['cisco-ace-serverfarms']	  = 1;
 $config['poller_modules']['netscaler-vsvr']               = 1;
 $config['poller_modules']['entity-physical']              = 1;
+$config['poller_modules']['aruba-controller']		  = 1;
 
 ## List of discovery modules. Need to be in this array to be
 ## considered for execution.
Index: includes/snmp.inc.php
===================================================================
--- includes/snmp.inc.php	(revision 2920)
+++ includes/snmp.inc.php	(working copy)
@@ -161,6 +161,9 @@
   else { return false; }
 }
 
+
+
+
 function snmp_walk($device, $oid, $options = NULL, $mib = NULL, $mibdir = NULL)
 {
   global $debug,$config,$runtime_stats;
@@ -363,6 +366,29 @@
   return $array;
 }
 
+// just like snmpwalk_cache_oid except that it returns the numerical oid as the index
+// this is useful when the oid is indexed by the mac address and snmpwalk would
+// return periods (.) for non-printable numbers, thus making many different indexes appear 
+// to be the same.
+function snmpwalk_cache_oid_num($device, $oid, $array, $mib = NULL, $mibdir = NULL)
+{
+  $data = snmp_walk($device, $oid, "-OQUn", $mib, $mibdir);
+
+  foreach (explode("\n", $data) as $entry)
+  {
+    list($oid,$value) = explode("=", $entry);
+    $oid = trim($oid); $value = trim($value);
+    list($oid, $index) = explode(".", $oid, 2);
+    if (!strstr($value, "at this OID") && isset($oid) && isset($index))
+    {
+      $array[$index][$oid] = $value;
+    }
+  }
+
+  return $array;
+}
+
+
 function snmpwalk_cache_multi_oid($device, $oid, $array, $mib = NULL, $mibdir = NULL)
 {
   global $cache;
Index: includes/common.php
===================================================================
--- includes/common.php	(revision 2920)
+++ includes/common.php	(working copy)
@@ -260,6 +260,16 @@
   return device_by_id_cache(getidbyname($name), $refresh);
 }
 
+
+function accesspoint_by_id($ap_id, $refresh = '0') {
+
+  $ap = dbFetchRow("SELECT * FROM `accesspoint` WHERE `accesspoint_id` = ?", array($ap_id));
+
+  return $ap;
+
+}
+
+
 function device_by_id_cache($device_id, $refresh = '0')
 {
   global $cache;
