snmprealwalk

(PHP 3 >= 3.0.8, PHP 4, PHP 5)

snmprealwalk --  返回指定的所有对象,包括它们各自的对象 ID

描述

array snmprealwalk ( string host, string community, string object_id [, int timeout [, int retries]] )

警告

本函数暂无文档,仅有参数列表。


add a note add a note User Contributed Notes
scot at indievisible dot org
10-Aug-2006 03:10
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);
}
 
?>
scot at indievisible dot org
09-Aug-2006 11:16
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);
}
?>
railson at amixsi dot com dot br
31-May-2006 01:52
Attention: timeout is in microseconds (multiply by 1,000,000 for seconds)
Stephen Cope
10-Sep-2004 11:38
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>');
?>
Lars Troen
24-Feb-2003 09:30
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]."<br>\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]<br>";
     }