lytboris Sun, 08 May 2011 13:58:37 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=310839
Log: * new option for SNMP::get: force keys of return array be as in request array * new option for SNMP::walk: use suffix of OID for keys in return array, not full OID Changed paths: U php/php-src/trunk/ext/snmp/php_snmp.h U php/php-src/trunk/ext/snmp/snmp.c U php/php-src/trunk/ext/snmp/tests/snmp-object-error.phpt U php/php-src/trunk/ext/snmp/tests/snmp-object.phpt
Modified: php/php-src/trunk/ext/snmp/php_snmp.h =================================================================== --- php/php-src/trunk/ext/snmp/php_snmp.h 2011-05-08 13:17:06 UTC (rev 310838) +++ php/php-src/trunk/ext/snmp/php_snmp.h 2011-05-08 13:58:37 UTC (rev 310839) @@ -41,6 +41,9 @@ #include "TSRM.h" #endif +#include <net-snmp/net-snmp-config.h> +#include <net-snmp/net-snmp-includes.h> + PHP_MINIT_FUNCTION(snmp); PHP_MSHUTDOWN_FUNCTION(snmp); PHP_MINFO_FUNCTION(snmp); @@ -109,7 +112,8 @@ char *oid; char type; char *value; - + oid name[MAX_OID_LEN]; + size_t name_length; } snmpobjarg; ZEND_BEGIN_MODULE_GLOBALS(snmp) Modified: php/php-src/trunk/ext/snmp/snmp.c =================================================================== --- php/php-src/trunk/ext/snmp/snmp.c 2011-05-08 13:17:06 UTC (rev 310838) +++ php/php-src/trunk/ext/snmp/snmp.c 2011-05-08 13:58:37 UTC (rev 310839) @@ -421,6 +421,10 @@ #define SNMP_CMD_WALK (1<<3) /* force values-only output */ #define SNMP_NUMERIC_KEYS (1<<7) +/* use user-supplied OID names for keys in array output mode in GET method */ +#define SNMP_ORIGINAL_NAMES_AS_KEYS (1<<8) +/* use OID suffix (`index') for keys in array output mode in WALK method */ +#define SNMP_USE_SUFFIX_AS_KEYS (1<<9) #ifdef COMPILE_DL_SNMP ZEND_GET_MODULE(snmp) @@ -677,7 +681,7 @@ oid root[MAX_NAME_LEN]; size_t rootlen = 0; int gotroot = 0; - int status, count; + int status, count, found; char buf[2048]; char buf2[2048]; int keepwalking=1; @@ -716,6 +720,10 @@ memmove((char *)name, (char *)root, rootlen * sizeof(oid)); name_length = rootlen; objid_query->offset = objid_query->count; + + memmove((char *)objid_query->vars[0].name, (char *)root, rootlen * sizeof(oid)); + objid_query->vars[0].name_length = rootlen; + } if ((ss = snmp_open(session)) == NULL) { @@ -731,11 +739,11 @@ if (st & (SNMP_CMD_GET | SNMP_CMD_GETNEXT)) { pdu = snmp_pdu_create((st & SNMP_CMD_GET) ? SNMP_MSG_GET : SNMP_MSG_GETNEXT); for (count = 0; objid_query->offset < objid_query->count && count < objid_query->step; objid_query->offset++, count++){ - name_length = MAX_OID_LEN; - if (!snmp_parse_oid(objid_query->vars[objid_query->offset].oid, name, &name_length)) { + objid_query->vars[objid_query->offset].name_length = MAX_OID_LEN; + if (!snmp_parse_oid(objid_query->vars[objid_query->offset].oid, objid_query->vars[objid_query->offset].name, &(objid_query->vars[objid_query->offset].name_length))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid object identifier: %s", objid_query->vars[objid_query->offset].oid); } else { - snmp_add_null_var(pdu, name, name_length); + snmp_add_null_var(pdu, objid_query->vars[objid_query->offset].name, objid_query->vars[objid_query->offset].name_length); } } if(pdu->variables == NULL){ @@ -747,16 +755,16 @@ } else if (st & SNMP_CMD_SET) { pdu = snmp_pdu_create(SNMP_MSG_SET); for (count = 0; objid_query->offset < objid_query->count && count < objid_query->step; objid_query->offset++, count++){ - name_length = MAX_OID_LEN; - if (!snmp_parse_oid(objid_query->vars[objid_query->offset].oid, name, &name_length)) { + objid_query->vars[objid_query->offset].name_length = MAX_OID_LEN; + if (!snmp_parse_oid(objid_query->vars[objid_query->offset].oid, objid_query->vars[objid_query->offset].name, &(objid_query->vars[objid_query->offset].name_length))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid object identifier: %s", objid_query->vars[objid_query->offset].oid); snmp_free_pdu(pdu); snmp_close(ss); RETVAL_FALSE; return; } else { - if ((snmp_errno = snmp_add_var(pdu, name, name_length, objid_query->vars[objid_query->offset].type, objid_query->vars[objid_query->offset].value))) { - snprint_objid(buf, sizeof(buf), name, name_length); + if ((snmp_errno = snmp_add_var(pdu, objid_query->vars[objid_query->offset].name, objid_query->vars[objid_query->offset].name_length, objid_query->vars[objid_query->offset].type, objid_query->vars[objid_query->offset].value))) { + snprint_objid(buf, sizeof(buf), objid_query->vars[objid_query->offset].name, objid_query->vars[objid_query->offset].name_length); php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not add variable: OID='%s' type='%c' value='%s': %s", buf, objid_query->vars[objid_query->offset].type, objid_query->vars[objid_query->offset].value, snmp_api_errstring(snmp_errno)); snmp_free_pdu(pdu); snmp_close(ss); @@ -823,6 +831,34 @@ } if (st & SNMP_NUMERIC_KEYS) { add_next_index_zval(return_value, snmpval); + } else if (st & SNMP_ORIGINAL_NAMES_AS_KEYS && st & SNMP_CMD_GET) { + found = 0; + for (count = 0; count < objid_query->count; count++) { + if (objid_query->vars[count].name_length == vars->name_length && snmp_oid_compare(objid_query->vars[count].name, objid_query->vars[count].name_length, vars->name, vars->name_length) == 0) { + found = 1; + objid_query->vars[count].name_length = 0; /* mark this name as used */ + break; + } + } + if (found) { + add_assoc_zval(return_value, objid_query->vars[count].oid, snmpval); + } else { + snprint_objid(buf2, sizeof(buf2), vars->name, vars->name_length); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not find original OID name for '%s'", buf2); + } + } else if (st & SNMP_USE_SUFFIX_AS_KEYS && st & SNMP_CMD_WALK) { + snprint_objid(buf2, sizeof(buf2), vars->name, vars->name_length); + if (objid_query->vars[0].name_length <= vars->name_length && snmp_oid_compare(objid_query->vars[0].name, objid_query->vars[0].name_length, vars->name, objid_query->vars[0].name_length) == 0) { + buf2[0] = '\0'; + count = objid_query->vars[0].name_length; + while(count < vars->name_length){ + sprintf(buf, "%lu.", vars->name[count]); + strcat(buf2, buf); + count++; + } + buf2[strlen(buf2) - 1] = '\0'; /* remove trailing '.' */ + } + add_assoc_zval(return_value, buf2, snmpval); } else { snprint_objid(buf2, sizeof(buf2), vars->name, vars->name_length); add_assoc_zval(return_value, buf2, snmpval); @@ -1276,6 +1312,7 @@ zval **oid, **value, **type; char *a1, *a2, *a3, *a4, *a5, *a6, *a7; int a1_len, a2_len, a3_len, a4_len, a5_len, a6_len, a7_len; + zend_bool use_orignames = 0, suffix_keys = 0; long timeout = SNMP_DEFAULT_TIMEOUT; long retries = SNMP_DEFAULT_RETRIES; int argc = ZEND_NUM_ARGS(); @@ -1327,12 +1364,21 @@ RETURN_FALSE; } } else if (st & SNMP_CMD_WALK) { - if (zend_parse_parameters(argc TSRMLS_CC, "Z|ll", &oid, &(objid_query.non_repeaters), &(objid_query.max_repetitions)) == FAILURE) { + if (zend_parse_parameters(argc TSRMLS_CC, "Z|bll", &oid, &suffix_keys, &(objid_query.non_repeaters), &(objid_query.max_repetitions)) == FAILURE) { RETURN_FALSE; } + if (suffix_keys) { + st |= SNMP_USE_SUFFIX_AS_KEYS; + } + } else if (st & SNMP_CMD_GET) { + if (zend_parse_parameters(argc TSRMLS_CC, "Z|b", &oid, &use_orignames) == FAILURE) { + RETURN_FALSE; + } + if (use_orignames) { + st |= SNMP_ORIGINAL_NAMES_AS_KEYS; + } } else { - /* SNMP_CMD_GET - * SNMP_CMD_GETNEXT + /* SNMP_CMD_GETNEXT */ if (zend_parse_parameters(argc TSRMLS_CC, "Z", &oid) == FAILURE) { RETURN_FALSE; Modified: php/php-src/trunk/ext/snmp/tests/snmp-object-error.phpt =================================================================== --- php/php-src/trunk/ext/snmp/tests/snmp-object-error.phpt 2011-05-08 13:17:06 UTC (rev 310838) +++ php/php-src/trunk/ext/snmp/tests/snmp-object-error.phpt 2011-05-08 13:58:37 UTC (rev 310839) @@ -46,9 +46,10 @@ var_dump($session->close()); $session = new SNMP(SNMP_VERSION_2c, $hostname, $community, $timeout, $retries); -var_dump($session->walk('.1.3.6.1.2.1.1', '')); -var_dump($session->walk('.1.3.6.1.2.1.1', 0, '')); +var_dump($session->walk('.1.3.6.1.2.1.1', FALSE, '')); +var_dump($session->walk('.1.3.6.1.2.1.1', FALSE, 0, '')); var_dump($session->get()); +var_dump($session->getnext()); var_dump($session->set()); var_dump($session->max_oids); @@ -75,15 +76,18 @@ bool(false) bool(true) -Warning: SNMP::walk() expects parameter 2 to be long, string given in %s on line %d +Warning: SNMP::walk() expects parameter 3 to be long, string given in %s on line %d bool(false) -Warning: SNMP::walk() expects parameter 3 to be long, string given in %s on line %d +Warning: SNMP::walk() expects parameter 4 to be long, string given in %s on line %d bool(false) -Warning: SNMP::get() expects exactly 1 parameter, 0 given in %s on line %d +Warning: SNMP::get() expects at least 1 parameter, 0 given in %s on line %d bool(false) +Warning: SNMP::getnext() expects exactly 1 parameter, 0 given in %s on line %d +bool(false) + Warning: SNMP::set() expects exactly 3 parameters, 0 given in %s on line %d bool(false) NULL Modified: php/php-src/trunk/ext/snmp/tests/snmp-object.phpt =================================================================== --- php/php-src/trunk/ext/snmp/tests/snmp-object.phpt 2011-05-08 13:17:06 UTC (rev 310838) +++ php/php-src/trunk/ext/snmp/tests/snmp-object.phpt 2011-05-08 13:58:37 UTC (rev 310839) @@ -30,6 +30,15 @@ var_dump($session->getnext('.1.3.6.1.2.1.1.1.0')); var_dump($session->close()); +echo "GET with preserving original OID names\n"; +$session = new SNMP(SNMP_VERSION_2c, $hostname, $community, $timeout, $retries); +$orig = array('.1.3.6.1.2.1.1.1.0', '.1.3.6.1.2.1.1.5.0'); +$result = $session->get($orig, TRUE); +foreach($orig as $oid){ + var_dump($result[$oid]); +} +var_dump($session->close()); + echo "WALK multiple on single OID\n"; $session = new SNMP(SNMP_VERSION_2c, $hostname, $community, $timeout, $retries); $z = $session->walk('.1.3.6.1.2.1.1'); @@ -67,6 +76,15 @@ var_dump(array_shift($z)); var_dump($session->close()); +echo "WALK multiple on single OID with OID suffix as keys\n"; +$session = new SNMP(SNMP_VERSION_2c, $hostname, $community, $timeout, $retries); +$z = $session->walk('.1.3.6.1.2.1.1', TRUE); +var_dump(gettype($z)); +var_dump(count($z)); +var_dump(key($z)); +var_dump(array_shift($z)); +var_dump($session->close()); + echo "SNMPv3 (default security settings)\n"; $session = new SNMP(SNMP_VERSION_3, $hostname, $user_noauth, $timeout, $retries); #$session->setSecurity($user_noauth, 'noAuthNoPriv', '', '', '', '', '', ''); @@ -126,6 +144,10 @@ string(%d) "%S" string(%d) "%S" bool(true) +GET with preserving original OID names +string(%d) "%s" +string(%d) "%s" +bool(true) WALK multiple on single OID string(5) "array" int(%d) @@ -150,6 +172,12 @@ string(%d) "%S" string(%d) "%S" bool(true) +WALK multiple on single OID with OID suffix as keys +string(5) "array" +int(%d) +string(3) "1.0" +string(%d) "%s" +bool(true) SNMPv3 (default security settings) string(%d) "%S" string(%d) "%S"
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php