#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)
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;
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) {
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){
} 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);
}
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);
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();
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;
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);
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 at least 1 parameter, 0 given in %s on line %d
bool(false)
-Warning: SNMP::get() expects exactly 1 parameter, 0 given in %s on line %d
+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
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');
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', '', '', '', '', '', '');
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)
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"