📄 client_intf.c
字号:
vars->val_len = len; if (val && len) memcpy((char *)vars->val.string, val, len); else { ret = FAILURE; vars->val.string = (u_char*)strdup(""); vars->val_len = 0; } break; case TYPE_IPADDR: vars->type = ASN_IPADDRESS; vars->val.integer = (long *)malloc(sizeof(long)); if (val) *(vars->val.integer) = inet_addr(val); else { ret = FAILURE; *(vars->val.integer) = 0; } vars->val_len = sizeof(long); break; case TYPE_OBJID: vars->type = ASN_OBJECT_ID; vars->val_len = MAX_OID_LEN; /* if (read_objid(val, oidbuf, &(vars->val_len))) { */ /* tp = __tag2oid(val,NULL,oidbuf,&(vars->val_len),NULL,0); */ if (!val || !snmp_parse_oid(val, oidbuf, &vars->val_len)) { vars->val.objid = NULL; ret = FAILURE; } else { vars->val_len *= sizeof(oid); vars->val.objid = (oid *)malloc(vars->val_len); memcpy((char *)vars->val.objid, (char *)oidbuf, vars->val_len); } break; default: vars->type = ASN_NULL; vars->val_len = 0; vars->val.string = NULL; ret = FAILURE; } return ret;}/* takes ss and pdu as input and updates the 'response' argument *//* the input 'pdu' argument will be freed */static int__send_sync_pdu(ss, pdu, response, retry_nosuch, err_str, err_num, err_ind)netsnmp_session *ss;netsnmp_pdu *pdu;netsnmp_pdu **response;int retry_nosuch;char *err_str;int *err_num;int *err_ind;{ int status; long command = pdu->command; *response = NULL;retry: status = snmp_synch_response(ss, pdu, response); if ((*response == NULL) && (status == STAT_SUCCESS)) status = STAT_ERROR; switch (status) { case STAT_SUCCESS: switch ((*response)->errstat) { case SNMP_ERR_NOERROR: break; case SNMP_ERR_NOSUCHNAME: if (retry_nosuch && (pdu = snmp_fix_pdu(*response, command))) { if (*response) snmp_free_pdu(*response); goto retry; } /* Pv1, SNMPsec, Pv2p, v2c, v2u, v2*, and SNMPv3 PDUs */ case SNMP_ERR_TOOBIG: case SNMP_ERR_BADVALUE: case SNMP_ERR_READONLY: case SNMP_ERR_GENERR: /* in SNMPv2p, SNMPv2c, SNMPv2u, SNMPv2*, and SNMPv3 PDUs */ case SNMP_ERR_NOACCESS: case SNMP_ERR_WRONGTYPE: case SNMP_ERR_WRONGLENGTH: case SNMP_ERR_WRONGENCODING: case SNMP_ERR_WRONGVALUE: case SNMP_ERR_NOCREATION: case SNMP_ERR_INCONSISTENTVALUE: case SNMP_ERR_RESOURCEUNAVAILABLE: case SNMP_ERR_COMMITFAILED: case SNMP_ERR_UNDOFAILED: case SNMP_ERR_AUTHORIZATIONERROR: case SNMP_ERR_NOTWRITABLE: /* in SNMPv2c, SNMPv2u, SNMPv2*, and SNMPv3 PDUs */ case SNMP_ERR_INCONSISTENTNAME: default: strcat(err_str,(char*)snmp_errstring((*response)->errstat)); *err_num = (int)(*response)->errstat; *err_ind = (*response)->errindex; status = (*response)->errstat; break; } break; case STAT_TIMEOUT: case STAT_ERROR: strcat(err_str, (char*)snmp_api_errstring(ss->s_snmp_errno)); *err_num = ss->s_snmp_errno; break; default: strcat(err_str, "send_sync_pdu: unknown status"); *err_num = ss->s_snmp_errno; break; } if (_debug_level && *err_num) printf("XXX sync PDU: %s\n", err_str); return(status);}static PyObject * py_netsnmp_construct_varbind(void){ PyObject *module; PyObject *dict; PyObject *callable; module = PyImport_ImportModule("netsnmp"); dict = PyModule_GetDict(module); callable = PyDict_GetItemString(dict, "Varbind"); return PyObject_CallFunction(callable, "");}static char *py_netsnmp_attr_string(PyObject *obj, char * attr_name){ char *val = NULL; if (obj && attr_name && PyObject_HasAttrString(obj, attr_name)) { PyObject *attr = PyObject_GetAttrString(obj, attr_name); if (attr) { val = PyString_AsString(attr); Py_DECREF(attr); } } return val;}static longpy_netsnmp_attr_long(PyObject *obj, char * attr_name){ long val = -1; if (obj && attr_name && PyObject_HasAttrString(obj, attr_name)) { PyObject *attr = PyObject_GetAttrString(obj, attr_name); if (attr) { val = PyInt_AsLong(attr); Py_DECREF(attr); } } return val;}static intpy_netsnmp_verbose(void){ int verbose = 0; PyObject *pkg = PyImport_ImportModule("netsnmp"); if (pkg) { verbose = py_netsnmp_attr_long(pkg, "verbose"); Py_DECREF(pkg); } return verbose;}static intpy_netsnmp_attr_set_string(PyObject *obj, char *attr_name, char *val, size_t len){ int ret = -1; if (obj && attr_name) { PyObject* val_obj = (val ? Py_BuildValue("s#", val, len) : Py_BuildValue("")); ret = PyObject_SetAttrString(obj, attr_name, val_obj); Py_DECREF(val_obj); } return ret;}static PyObject *netsnmp_create_session(PyObject *self, PyObject *args){ int version; char *community; char *peer; int lport; int retries; int timeout; SnmpSession session = {0}; SnmpSession *ss = NULL; int verbose = py_netsnmp_verbose(); if (!PyArg_ParseTuple(args, "issiii", &version, &community, &peer, &lport, &retries, &timeout)) return NULL; __libraries_init("python"); session.version = -1;#ifndef DISABLE_SNMPV1 if (version == 1) { session.version = SNMP_VERSION_1; }#endif#ifndef DISABLE_SNMPV2C if (version == 2) { session.version = SNMP_VERSION_2c; }#endif if (version == 3) { session.version = SNMP_VERSION_3; } if (session.version == -1) { if (verbose) printf("error:snmp_new_session:Unsupported SNMP version (%d)\n", version); goto end; } session.community_len = STRLEN((char *)community); session.community = (u_char *)community; session.peername = peer; session.local_port = lport; session.retries = retries; /* 5 */ session.timeout = timeout; /* 1000000L */ session.authenticator = NULL; ss = snmp_open(&session); if (ss == NULL) { if (verbose) printf("error:snmp_new_session: Couldn't open SNMP session"); } end: return Py_BuildValue("i", (int)ss);}static PyObject *netsnmp_create_session_v3(PyObject *self, PyObject *args){ int version; char *peer; int lport; int retries; int timeout; char * sec_name; int sec_level; char * sec_eng_id; char * context_eng_id; char * context; char * auth_proto; char * auth_pass; char * priv_proto; char * priv_pass; int eng_boots; int eng_time; SnmpSession session = {0}; SnmpSession *ss = NULL; int verbose = py_netsnmp_verbose(); if (!PyArg_ParseTuple(args, "isiiisisssssssii", &version, &peer, &lport, &retries, &timeout, &sec_name, &sec_level, &sec_eng_id, &context_eng_id, &context, &auth_proto, &auth_pass, &priv_proto, &priv_pass, &eng_boots, &eng_time)) return NULL; __libraries_init("python"); if (version == 3) { session.version = SNMP_VERSION_3; } else { if (verbose) printf("error:snmp_new_v3_session:Unsupported SNMP version (%d)\n", version); goto end; } session.peername = peer; session.retries = retries; /* 5 */ session.timeout = timeout; /* 1000000L */ session.authenticator = NULL; session.contextNameLen = STRLEN(context); session.contextName = context; session.securityNameLen = STRLEN(sec_name); session.securityName = sec_name; session.securityLevel = sec_level; session.securityModel = USM_SEC_MODEL_NUMBER; session.securityEngineIDLen = hex_to_binary2((unsigned char*)sec_eng_id, STRLEN(sec_eng_id), (char **) &session.securityEngineID); session.contextEngineIDLen = hex_to_binary2((unsigned char*)sec_eng_id, STRLEN(sec_eng_id), (char **) &session.contextEngineID); session.engineBoots = eng_boots; session.engineTime = eng_time;#ifndef DISABLE_MD5 if (!strcmp(auth_proto, "MD5")) { session.securityAuthProto = snmp_duplicate_objid(usmHMACMD5AuthProtocol, USM_AUTH_PROTO_MD5_LEN); session.securityAuthProtoLen = USM_AUTH_PROTO_MD5_LEN; } else#endif if (!strcmp(auth_proto, "SHA")) { session.securityAuthProto = snmp_duplicate_objid(usmHMACSHA1AuthProtocol, USM_AUTH_PROTO_SHA_LEN); session.securityAuthProtoLen = USM_AUTH_PROTO_SHA_LEN; } else if (!strcmp(auth_proto, "DEFAULT")) { session.securityAuthProto = get_default_authtype(&session.securityAuthProtoLen); } else { if (verbose) printf("error:snmp_new_v3_session:Unsupported authentication protocol(%s)\n", auth_proto); goto end; } if (session.securityLevel >= SNMP_SEC_LEVEL_AUTHNOPRIV) { if (STRLEN(auth_pass) > 0) { session.securityAuthKeyLen = USM_AUTH_KU_LEN; if (generate_Ku(session.securityAuthProto, session.securityAuthProtoLen, (u_char *)auth_pass, STRLEN(auth_pass), session.securityAuthKey, &session.securityAuthKeyLen) != SNMPERR_SUCCESS) { if (verbose) printf("error:snmp_new_v3_session:Error generating Ku from authentication password.\n"); goto end; } } }#ifndef DISABLE_DES if (!strcmp(priv_proto, "DES")) { session.securityPrivProto = snmp_duplicate_objid(usmDESPrivProtocol, USM_PRIV_PROTO_DES_LEN); session.securityPrivProtoLen = USM_PRIV_PROTO_DES_LEN; } else#endif if (!strncmp(priv_proto, "AES", 3)) { session.securityPrivProto = snmp_duplicate_objid(usmAESPrivProtocol, USM_PRIV_PROTO_AES_LEN); session.securityPrivProtoLen = USM_PRIV_PROTO_AES_LEN; } else if (!strcmp(priv_proto, "DEFAULT")) { session.securityPrivProto = get_default_privtype(&session.securityPrivProtoLen); } else { if (verbose) printf("error:snmp_new_v3_session:Unsupported privacy protocol(%s)\n", priv_proto); goto end; } if (session.securityLevel >= SNMP_SEC_LEVEL_AUTHPRIV) { session.securityPrivKeyLen = USM_PRIV_KU_LEN; if (generate_Ku(session.securityAuthProto, session.securityAuthProtoLen, (u_char *)priv_pass, STRLEN(priv_pass), session.securityPrivKey, &session.securityPrivKeyLen) != SNMPERR_SUCCESS) { if (verbose) printf("error:v3_session: couldn't gen Ku from priv pass phrase.\n"); goto end; } } ss = snmp_open(&session); end: if (ss == NULL) { if (verbose) printf("error:v3_session: couldn't open SNMP session(%s).\n", snmp_api_errstring(snmp_errno)); } free (session.securityEngineID); free (session.contextEngineID); return Py_BuildValue("i", (int)ss);}static PyObject *netsnmp_delete_session(PyObject *self, PyObject *args){ PyObject *session; SnmpSession *ss = NULL; if (!PyArg_ParseTuple(args, "O", &session)) { return NULL; } ss = (SnmpSession *)py_netsnmp_attr_long(session, "sess_ptr"); snmp_close(ss); return (Py_BuildValue(""));}static PyObject *netsnmp_get(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"))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -