⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client_intf.c

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -