Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : SNMP Functions : snmprealwalk

snmprealwalk

Return all objects including their respective object ID within the specified one (PHP 4, PHP 5)
array snmprealwalk ( string host, string community, string object_id [, int timeout [, int retries]] )


Code Examples / Notes » snmprealwalk

scot

Some improvements based on testing a lot of OIDs on a lot of devices.
<?php
function snmptable($host, $community, $oid) {
   // TODO: get original state and restore at bottom
   snmp_set_oid_numeric_print(TRUE);
   snmp_set_quick_print(TRUE);
   snmp_set_enum_print(TRUE);
   $retval = array();
   $raw = snmprealwalk($host, $community, $oid);
   if (count($raw) == 0) return ($retval); // no data
   
   $prefix_length = 0;
   $largest = 0;
   foreach ($raw as $key => $value) {
       if ($prefix_length == 0) {
           // don't just use $oid's length since it may be non-numeric
           $prefix_elements = count(explode('.',$oid));
           $tmp = '.' . strtok($key, '.');
           while ($prefix_elements > 1) {
               $tmp .= '.' . strtok('.');
               $prefix_elements--;
           }
           $tmp .= '.';
           $prefix_length = strlen($tmp);
       }
       $key = substr($key, $prefix_length);
       $index = explode('.', $key, 2);
       isset($retval[$index[1]]) or $retval[$index[1]] = array();
       if ($largest < $index[0]) $largest = $index[0];
       $retval[$index[1]][$index[0]] = $value;
   }
   if (count($retval) == 0) return ($retval); // no data
   // fill in holes and blanks the agent may "give" you
   foreach($retval as $k => $x) {
       for ($i = 1; $i <= $largest; $i++) {
   if (! isset($retval[$k][$i])) {
               $retval[$k][$i] = '';
           }
       }
       ksort($retval[$k]);
   }
   return($retval);
}
?>


lars troen

snmprealwalk indexes the values using the oid instead of an integer. This is useful when you need data that is contained in the oid as well as the value.
Here's an example for retrieving and printing vlan info:
//
// I have collected the vlan identifiers earlier from the 3com mib and they are stored in the $vlan table.
//
 for($n=0;$n<count($vlan);$n++){
   print $vlan[$n][id]."  ".$vlan[$n][name]."
\n";
   $ifStackStatusTable=@snmprealwalk($switch, $community, ".1.3.6.1.2.1.31.1.2.1.3.".$vlan[$n][id]); // ifMIB.ifMIBObjects.ifStackTable.ifStackEntry.ifStackStatus
   for(reset($ifStackStatusTable);  $port = key($ifStackStatusTable);  next($ifStackStatusTable)){
     print "$port=$ifStackStatusTable[$port]
";
     }


scot

Since PHP doesn't have a nice snmptable-like function... here is a quick-and-dirty hack that works for me. Works on complete and sparse tables. The example oids are for the route (complete) and interface (often sparse) tables.
<?php
   $a = snmptable("10.1.1.1", "public", ".1.3.6.1.2.1.4.21") or die("error");
   print_r($a);
   $a = snmptable("10.1.1.1", "public", ".1.3.6.1.2.1.2.2") or die("error");
   print_r($a);
function snmptable($host, $community, $oid) {
   // TODO: get original state and restore at bottom
   snmp_set_oid_numeric_print(TRUE);
   snmp_set_quick_print(TRUE);
   snmp_set_enum_print(TRUE);
   $retval = array();
   $raw = snmprealwalk($host, $community, $oid) or die("snmptable: unable to walk OID $oid");
   $prefix_length = 0;
   foreach ($raw as $key => $value) {
       if ($prefix_length == 0) {
           // don't just use $oid's length since it may be non-numeric
           $prefix_elements = count(explode('.',$oid));
           $tmp = '.' . strtok($key, '.');
           while ($prefix_elements > 1) {
               $tmp .= '.' . strtok('.');
               $prefix_elements--;
           }
           $tmp .= '.';
           $prefix_length = strlen($tmp);
       }
       $key = substr($key, $prefix_length);
       $index = explode('.', $key, 2);
       isset($retval[$index[1]]) or $retval[$index[1]] = array();
       isset($firstrow) or $firstrow = $index[1];
       $retval[$index[1]][$index[0]] = $value;
   }
   // check for holes in the table and fill them in
   foreach ($retval[$firstrow] as $key => $tmp) {
       foreach($retval as $check => $tmp2) {
           if (! isset($retval[$check][$key])) {
               $retval[$check][$key] = '';
           }
       }
   }
   return($retval);
}
?>


stephen cope

Here's a way to find the uptime and number of users on a machine. (Note that uptime is the uptime of the snmpd daemon, which should be fairly close to the uptime for the host.)
<?php
       $state = snmprealwalk($host, "public", ".1.3.6.1.2.1.25.1", 50, 1);
       $uptime = ereg_replace("^.*\) ([0-9]+ .*):[0-9][0-9]\.[0-9]{2}.*$", "\\1", $state['host.hrSystem.hrSystemUptime.0']);
       $users  = (int)ereg_replace("Gauge32: ", "", $state['host.hrSystem.hrSystemNumUsers.0']);
       printf('<div class="machine"><dt>%s</dt><dd>%s</dd>', $host, $desc);
       printf('<dd>up %s</dd>', $uptime);
       if ( $users ) printf('<dd>%d user%s</dd>', $users, ($users > 1) ? 's' : '');
       printf('</div>');
?>


railson

Attention: timeout is in microseconds (multiply by 1,000,000 for seconds)

Change Language


Follow Navioo On Twitter
snmp_get_quick_print
snmp_get_valueretrieval
snmp_read_mib
snmp_set_enum_print
snmp_set_oid_numeric_print
snmp_set_oid_output_format
snmp_set_quick_print
snmp_set_valueretrieval
snmpget
snmpgetnext
snmprealwalk
snmpset
snmpwalk
snmpwalkoid
eXTReMe Tracker