📄 client_intf.c
字号:
getlabel_flag |= USE_LONG_NAMES; if (py_netsnmp_attr_long(session, "UseNumeric")) getlabel_flag |= USE_NUMERIC_OIDS; if (py_netsnmp_attr_long(session, "UseEnums")) sprintval_flag = USE_ENUMS; if (py_netsnmp_attr_long(session, "UseSprintValue")) sprintval_flag = USE_SPRINT_VALUE; best_guess = py_netsnmp_attr_long(session, "BestGuess"); retry_nosuch = py_netsnmp_attr_long(session, "RetryNoSuch"); pdu = snmp_pdu_create(SNMP_MSG_GET); if (varlist) { PyObject *varlist_iter = PyObject_GetIter(varlist); while (varlist_iter && (varbind = PyIter_Next(varlist_iter))) { tag = py_netsnmp_attr_string(varbind, "tag"); iid = py_netsnmp_attr_string(varbind, "iid"); tp = __tag2oid(tag, iid, oid_arr, &oid_arr_len, NULL, best_guess); if (oid_arr_len) { snmp_add_null_var(pdu, oid_arr, oid_arr_len); varlist_len++; } else { if (verbose) printf("error: get: unknown object ID (%s)", (tag ? tag : "<null>")); snmp_free_pdu(pdu); goto done; } /* release reference when done */ Py_DECREF(varbind); } Py_DECREF(varlist_iter); if (PyErr_Occurred()) { /* propagate error */ if (verbose) printf("error: get: unknown python error"); snmp_free_pdu(pdu); goto done; } } status = __send_sync_pdu(ss, pdu, &response, retry_nosuch, err_str, &err_num, &err_ind); /* ** Set up for numeric or full OID's, if necessary. Save the old ** output format so that it can be restored when we finish -- this ** is a library-wide global, and has to be set/restored for each ** session. */ old_format = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT); if (py_netsnmp_attr_long(session, "UseLongNames")) { getlabel_flag |= USE_LONG_NAMES; netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, NETSNMP_OID_OUTPUT_FULL); } /* Setting UseNumeric forces UseLongNames on so check for UseNumeric after UseLongNames (above) to make sure the final outcome of NETSNMP_DS_LIB_OID_OUTPUT_FORMAT is NETSNMP_OID_OUTPUT_NUMERIC */ if (py_netsnmp_attr_long(session, "UseNumeric")) { getlabel_flag |= USE_LONG_NAMES; getlabel_flag |= USE_NUMERIC_OIDS; netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, NETSNMP_OID_OUTPUT_NUMERIC); } val_tuple = PyTuple_New(varlist_len); /* initialize return tuple */ for (varlist_ind = 0; varlist_ind < varlist_len; varlist_ind++) { PyTuple_SetItem(val_tuple, varlist_ind, Py_BuildValue("")); } for(vars = (response ? response->variables : NULL), varlist_ind = 0; vars && (varlist_ind < varlist_len); vars = vars->next_variable, varlist_ind++) { varbind = PySequence_GetItem(varlist, varlist_ind); if (PyObject_HasAttrString(varbind, "tag")) { *str_buf = '.'; *(str_buf+1) = '\0'; out_len = 0; tp = netsnmp_sprint_realloc_objid_tree(&str_bufp, &str_buf_len, &out_len, 0, &buf_over, vars->name,vars->name_length); if (_debug_level) printf("netsnmp_get:str_bufp:%s:%d:%d\n", str_bufp,str_buf_len,out_len); str_buf[sizeof(str_buf)-1] = '\0'; if (__is_leaf(tp)) { type = (tp->type ? tp->type : tp->parent->type); getlabel_flag &= ~NON_LEAF_NAME; if (_debug_level) printf("netsnmp_get:is_leaf:%d\n",type); } else { getlabel_flag |= NON_LEAF_NAME; type = __translate_asn_type(vars->type); if (_debug_level) printf("netsnmp_get:!is_leaf:%d\n",tp->type); } if (_debug_level) printf("netsnmp_get:str_buf:%s\n",str_buf); __get_label_iid(str_buf, &tag, &iid, getlabel_flag); py_netsnmp_attr_set_string(varbind, "tag", tag, STRLEN(tag)); py_netsnmp_attr_set_string(varbind, "iid", iid, STRLEN(iid)); __get_type_str(type, type_str); py_netsnmp_attr_set_string(varbind, "type", type_str, STRLEN(type_str)); len = __snprint_value(str_buf,sizeof(str_buf), vars,tp,type,sprintval_flag); str_buf[len] = '\0'; py_netsnmp_attr_set_string(varbind, "val", str_buf, len); /* save in return tuple as well */ PyTuple_SetItem(val_tuple, varlist_ind, (len ? Py_BuildValue("s#", str_buf, len) : Py_BuildValue(""))); Py_DECREF(varbind); } else { printf("netsnmp_get: bad varbind (%d)\n", varlist_ind); } } /* Reset the library's behavior for numeric/symbolic OID's. */ netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, old_format); if (response) snmp_free_pdu(response); } done: SAFE_FREE(oid_arr); return (val_tuple ? val_tuple : Py_BuildValue(""));}static PyObject *netsnmp_getnext(PyObject *self, PyObject *args){ PyObject *session; PyObject *varlist; PyObject *varbind; PyObject *val_tuple = NULL; int varlist_len = 0; int varlist_ind; netsnmp_session *ss; netsnmp_pdu *pdu, *response; netsnmp_variable_list *vars; struct tree *tp; int len; oid *oid_arr; int oid_arr_len = MAX_OID_LEN; int type; char type_str[MAX_TYPE_NAME_LEN]; int status; u_char str_buf[STR_BUF_SIZE], *str_bufp = str_buf; size_t str_buf_len = sizeof(str_buf); size_t out_len = 0; int buf_over = 0; char *tag; char *iid; int getlabel_flag = NO_FLAGS; int sprintval_flag = USE_BASIC; int verbose = py_netsnmp_verbose(); int old_format; int best_guess; int retry_nosuch; int err_ind; int err_num; char err_str[STR_BUF_SIZE]; oid_arr = calloc(MAX_OID_LEN, sizeof(oid)); if (oid_arr && args) { if (!PyArg_ParseTuple(args, "OO", &session, &varlist)) { goto done; } ss = (SnmpSession *)py_netsnmp_attr_long(session, "sess_ptr"); strcpy(err_str, py_netsnmp_attr_string(session, "ErrorStr")); err_num = py_netsnmp_attr_long(session, "ErrorNum"); err_ind = py_netsnmp_attr_long(session, "ErrorInd"); if (py_netsnmp_attr_long(session, "UseLongNames")) getlabel_flag |= USE_LONG_NAMES; if (py_netsnmp_attr_long(session, "UseNumeric")) getlabel_flag |= USE_NUMERIC_OIDS; if (py_netsnmp_attr_long(session, "UseEnums")) sprintval_flag = USE_ENUMS; if (py_netsnmp_attr_long(session, "UseSprintValue")) sprintval_flag = USE_SPRINT_VALUE; best_guess = py_netsnmp_attr_long(session, "BestGuess"); retry_nosuch = py_netsnmp_attr_long(session, "RetryNoSuch"); pdu = snmp_pdu_create(SNMP_MSG_GETNEXT); if (varlist) { PyObject *varlist_iter = PyObject_GetIter(varlist); while (varlist_iter && (varbind = PyIter_Next(varlist_iter))) { tag = py_netsnmp_attr_string(varbind, "tag"); iid = py_netsnmp_attr_string(varbind, "iid"); tp = __tag2oid(tag, iid, oid_arr, &oid_arr_len, NULL, best_guess); if (_debug_level) printf("netsnmp_getnext: filling request: %s:%s:%d:%d\n", tag, iid, oid_arr_len,best_guess); if (oid_arr_len) { snmp_add_null_var(pdu, oid_arr, oid_arr_len); varlist_len++; } else { if (verbose) printf("error: get: unknown object ID (%s)", (tag ? tag : "<null>")); snmp_free_pdu(pdu); goto done; } /* release reference when done */ Py_DECREF(varbind); } Py_DECREF(varlist_iter); if (PyErr_Occurred()) { /* propagate error */ if (verbose) printf("error: get: unknown python error"); snmp_free_pdu(pdu); goto done; } } status = __send_sync_pdu(ss, pdu, &response, retry_nosuch, err_str, &err_num, &err_ind); /* ** Set up for numeric or full OID's, if necessary. Save the old ** output format so that it can be restored when we finish -- this ** is a library-wide global, and has to be set/restored for each ** session. */ old_format = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT); if (py_netsnmp_attr_long(session, "UseLongNames")) { getlabel_flag |= USE_LONG_NAMES; netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, NETSNMP_OID_OUTPUT_FULL); } /* Setting UseNumeric forces UseLongNames on so check for UseNumeric after UseLongNames (above) to make sure the final outcome of NETSNMP_DS_LIB_OID_OUTPUT_FORMAT is NETSNMP_OID_OUTPUT_NUMERIC */ if (py_netsnmp_attr_long(session, "UseNumeric")) { getlabel_flag |= USE_LONG_NAMES; getlabel_flag |= USE_NUMERIC_OIDS; netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, NETSNMP_OID_OUTPUT_NUMERIC); } val_tuple = PyTuple_New(varlist_len); /* initialize return tuple */ val_tuple = PyTuple_New(varlist_len); for (varlist_ind = 0; varlist_ind < varlist_len; varlist_ind++) { PyTuple_SetItem(val_tuple, varlist_ind, Py_BuildValue("")); } for(vars = (response ? response->variables : NULL), varlist_ind = 0; vars && (varlist_ind < varlist_len); vars = vars->next_variable, varlist_ind++) { varbind = PySequence_GetItem(varlist, varlist_ind); if (PyObject_HasAttrString(varbind, "tag")) { *str_buf = '.'; *(str_buf+1) = '\0'; out_len = 0; tp = netsnmp_sprint_realloc_objid_tree(&str_bufp, &str_buf_len, &out_len, 0, &buf_over, vars->name,vars->name_length); str_buf[sizeof(str_buf)-1] = '\0'; if (__is_leaf(tp)) { type = (tp->type ? tp->type : tp->parent->type); getlabel_flag &= ~NON_LEAF_NAME; } else { getlabel_flag |= NON_LEAF_NAME; type = __translate_asn_type(vars->type); } __get_label_iid(str_buf, &tag, &iid, getlabel_flag); if (_debug_level) printf("netsnmp_getnext: filling response: %s:%s\n", tag, iid); py_netsnmp_attr_set_string(varbind, "tag", tag, STRLEN(tag)); py_netsnmp_attr_set_string(varbind, "iid", iid, STRLEN(iid)); __get_type_str(type, type_str); py_netsnmp_attr_set_string(varbind, "type", type_str, STRLEN(type_str)); len = __snprint_value(str_buf,sizeof(str_buf), vars,tp,type,sprintval_flag); str_buf[len] = '\0'; py_netsnmp_attr_set_string(varbind, "val", str_buf, len); /* save in return tuple as well */ PyTuple_SetItem(val_tuple, varlist_ind, (len ? Py_BuildValue("s#", str_buf, len) : Py_BuildValue(""))); Py_DECREF(varbind); } else { printf("netsnmp_getnext: bad varbind (%d)\n", varlist_ind); } } /* Reset the library's behavior for numeric/symbolic OID's. */ netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, old_format); if (response) snmp_free_pdu(response); } done: SAFE_FREE(oid_arr); return (val_tuple ? val_tuple : Py_BuildValue(""));}static PyObject *netsnmp_walk(PyObject *self, PyObject *args){ PyObject *session; PyObject *varlist; PyObject *varbind; PyObject *val_tuple = NULL; PyObject *varbinds; int varlist_len = 0; int varlist_ind; netsnmp_session *ss; netsnmp_pdu *pdu, *response; netsnmp_variable_list *vars; struct tree *tp; int len; oid *oid_arr; int oid_arr_len = MAX_OID_LEN; int type; char type_str[MAX_TYPE_NAME_LEN]; int status; u_char str_buf[STR_BUF_SIZE], *str_bufp = str_buf; size_t str_buf_len = sizeof(str_buf); size_t out_len = 0; int buf_over = 0; char *tag; char *iid; int getlabel_flag = NO_FLAGS; int sprintval_flag = USE_BASIC; int verbose = py_netsnmp_verbose(); int old_format; int best_guess; int retry_nosuch; int err_ind; int err_num; char err_str[STR_BUF_SIZE]; int notdone = 1; int result_count = 0; oid_arr = calloc(MAX_OID_LEN, sizeof(oid)); if (oid_arr && args) { if (!PyArg_ParseTuple(args, "OO", &session, &varlist)) { goto done; } if (!varlist) { goto done; } if ((varbinds = PyObject_GetAttrString(varlist, "varbinds")) == NULL) { goto done; } ss = (SnmpSession *)py_netsnmp_attr_long(session, "sess_ptr"); strcpy(err_str, py_netsnmp_attr_string(session, "ErrorStr")); err_num = py_netsnmp_attr_long(session, "ErrorNum"); err_ind = py_netsnmp_attr_long(session, "ErrorInd"); if (py_netsnmp_attr_long(session, "UseLongNames")) getlabel_flag |= USE_LONG_NAMES; if (py_netsnmp_attr_long(session, "UseNumeric")) getlabel_flag |= USE_NUMERIC_OIDS; if (py_netsnmp_attr_long(session, "UseEnums")) sprintval_flag = USE_ENUMS; if (py_netsnmp_attr_long(session, "UseSprintValue")) sprintval_flag = USE_SPRINT_VALUE; best_guess = py_netsnmp_attr_long(session, "BestGuess"); retry_nosuch = py_netsnmp_attr_long(session, "RetryNoSuch"); PyObject *varlist_iter = PyObject_GetIter(varlist); pdu = snmp_pdu_create(SNMP_MSG_GETNEXT); /* get the initial starting oids*/ while (varlist_iter && (varbind = PyIter_Next(varlist_iter))) { tag = py_netsnmp_attr_string(varbind, "tag"); iid = py_netsnmp_attr_string(varbind, "iid"); tp = __tag2oid(tag, iid, oid_arr, &oid_arr_len, NULL, best_guess); if (_debug_level) printf("netsnmp_walk: filling request: %s:%s:%d:%d\n", tag, iid, oid_arr_len,best_guess); if (oid_arr_len) { snmp_add_null_var(pdu, oid_arr, oid_arr_len); varlist_len++; } else { if (verbose) printf("error: walk: unknown object ID (%s)", (tag ? tag : "<null>")); snmp_free_pdu(pdu); goto done; } /* release reference when done */ Py_DECREF(varbind); } Py_DECREF(varlist_iter); if (PyErr_Occurred()) { /* propagate error */ if (verbose) printf("error: walk: unknown python error (varlist)"); snmp_free_pdu(pdu); goto done; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -