📄 client_intf.c
字号:
#include <Python.h>#include <net-snmp/net-snmp-config.h>#include <net-snmp/net-snmp-includes.h>#include <sys/types.h>#include <arpa/inet.h>#include <errno.h>#include <stdio.h>#include <ctype.h>#ifdef I_SYS_TIME#include <sys/time.h>#endif#include <netdb.h>#include <stdlib.h>#ifdef HAVE_REGEX_H#include <regex.h>#endif#define SUCCESS 1#define FAILURE 0#define VARBIND_TAG_F 0#define VARBIND_IID_F 1#define VARBIND_VAL_F 2#define VARBIND_TYPE_F 3#define TYPE_UNKNOWN 0#define MAX_TYPE_NAME_LEN 32#define STR_BUF_SIZE (MAX_TYPE_NAME_LEN * MAX_OID_LEN)#define ENG_ID_BUF_SIZE 32#define NO_RETRY_NOSUCH 0/* these should be part of transform_oids.h ? */#define USM_AUTH_PROTO_MD5_LEN 10#define USM_AUTH_PROTO_SHA_LEN 10#define USM_PRIV_PROTO_DES_LEN 10#define STRLEN(x) (x ? strlen(x) : 0)typedef netsnmp_session SnmpSession;typedef struct tree SnmpMibNode;static void __recalc_timeout (struct timeval*,struct timeval*, struct timeval*,struct timeval*, int* );static in_addr_t __parse_address (char*);static int __is_numeric_oid (char*);static int __is_leaf (struct tree*);static int __translate_appl_type (char*);static int __translate_asn_type (int);static int __snprint_value (char *, size_t, netsnmp_variable_list*, struct tree *, int, int);static int __sprint_num_objid (char *, oid *, int);static int __scan_num_objid (char *, oid *, size_t *);static int __get_type_str (int, char *);static int __get_label_iid (char *, char **, char **, int);static int __oid_cmp (oid *, int, oid *, int);static int __tp_sprint_num_objid (char*,SnmpMibNode *);static SnmpMibNode * __get_next_mib_node (SnmpMibNode *);static struct tree * __oid2tp (oid*, int, struct tree *, int*);static struct tree * __tag2oid (char *, char *, oid *, int *, int *, int);static int __concat_oid_str (oid *, int *, char *);static int __add_var_val_str (netsnmp_pdu *, oid *, int, char *, int, int);#define USE_NUMERIC_OIDS 0x08#define NON_LEAF_NAME 0x04#define USE_LONG_NAMES 0x02#define FAIL_ON_NULL_IID 0x01#define NO_FLAGS 0x00/* Wrapper around fprintf(stderr, ...) for clean and easy debug output. */static int _debug_level = 0;#ifdef DEBUGGING#define DBPRT(severity, otherargs) \ do { \ if (_debug_level && severity <= _debug_level) { \ (void)printf(otherargs); \ } \ } while (/*CONSTCOND*/0)#else /* DEBUGGING */#define DBPRT(severity, otherargs) /* Ignore */#endif /* DEBUGGING */#define SAFE_FREE(x) do {if (x != NULL) free(x);} while(/*CONSTCOND*/0)void__libraries_init(char *appname){ static int have_inited = 0; if (have_inited) return; have_inited = 1; snmp_set_quick_print(1); snmp_enable_stderrlog(); init_snmp(appname); netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_DONT_BREAKDOWN_OIDS, 1); netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_SUFFIX_ONLY, 1); netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, NETSNMP_OID_OUTPUT_SUFFIX);}static void__recalc_timeout (tvp, ctvp, ltvp, itvp, block)struct timeval* tvp;struct timeval* ctvp;struct timeval* ltvp;struct timeval* itvp;int *block;{ struct timeval now; if (!timerisset(itvp)) return; /* interval zero means loop forever */ *block = 0; gettimeofday(&now,(struct timezone *)0); if (ctvp->tv_sec < 0) { /* first time or callback just fired */ timersub(&now,ltvp,ctvp); timersub(ctvp,itvp,ctvp); timersub(itvp,ctvp,ctvp); timeradd(ltvp,itvp,ltvp); } else { timersub(&now,ltvp,ctvp); timersub(itvp,ctvp,ctvp); } /* flag is set for callback but still hasnt fired so set to something * small and we will service packets first if there are any ready * (also guard against negative timeout - should never happen?) */ if (!timerisset(ctvp) || ctvp->tv_sec < 0 || ctvp->tv_usec < 0) { ctvp->tv_sec = 0; ctvp->tv_usec = 10; } /* if snmp timeout > callback timeout or no more requests to process */ if (timercmp(tvp, ctvp, >) || !timerisset(tvp)) { *tvp = *ctvp; /* use the smaller non-zero timeout */ timerclear(ctvp); /* used as a flag to let callback fire on timeout */ }}static in_addr_t__parse_address(address)char *address;{ in_addr_t addr; struct sockaddr_in saddr; struct hostent *hp; if ((addr = inet_addr(address)) != -1) return addr; hp = gethostbyname(address); if (hp == NULL){ return (-1); /* error value */ } else { memcpy(&saddr.sin_addr, hp->h_addr, hp->h_length); return saddr.sin_addr.s_addr; }}static int__is_numeric_oid (oidstr)char* oidstr;{ if (!oidstr) return 0; for (; *oidstr; oidstr++) { if (isalpha((int)*oidstr)) return 0; } return(1);}static int__is_leaf (tp)struct tree* tp;{ char buf[MAX_TYPE_NAME_LEN]; return (tp && (__get_type_str(tp->type,buf) || (tp->parent && __get_type_str(tp->parent->type,buf) )));}static SnmpMibNode*__get_next_mib_node (tp)SnmpMibNode* tp;{ /* printf("tp = %lX, parent = %lX, peer = %lX, child = %lX\n", tp, tp->parent, tp->next_peer, tp->child_list); */ if (tp->child_list) return(tp->child_list); if (tp->next_peer) return(tp->next_peer); if (!tp->parent) return(NULL); for (tp = tp->parent; !tp->next_peer; tp = tp->parent) { if (!tp->parent) return(NULL); } return(tp->next_peer);}static int__translate_appl_type(typestr)char* typestr;{ if (typestr == NULL || *typestr == '\0') return TYPE_UNKNOWN; if (!strncasecmp(typestr,"INTEGER32",8)) return(TYPE_INTEGER32); if (!strncasecmp(typestr,"INTEGER",3)) return(TYPE_INTEGER); if (!strncasecmp(typestr,"UNSIGNED32",3)) return(TYPE_UNSIGNED32); if (!strcasecmp(typestr,"COUNTER")) /* check all in case counter64 */ return(TYPE_COUNTER); if (!strncasecmp(typestr,"GAUGE",3)) return(TYPE_GAUGE); if (!strncasecmp(typestr,"IPADDR",3)) return(TYPE_IPADDR); if (!strncasecmp(typestr,"OCTETSTR",3)) return(TYPE_OCTETSTR); if (!strncasecmp(typestr,"TICKS",3)) return(TYPE_TIMETICKS); if (!strncasecmp(typestr,"OPAQUE",3)) return(TYPE_OPAQUE); if (!strncasecmp(typestr,"OBJECTID",3)) return(TYPE_OBJID); if (!strncasecmp(typestr,"NETADDR",3)) return(TYPE_NETADDR); if (!strncasecmp(typestr,"COUNTER64",3)) return(TYPE_COUNTER64); if (!strncasecmp(typestr,"NULL",3)) return(TYPE_NULL); if (!strncasecmp(typestr,"BITS",3)) return(TYPE_BITSTRING); if (!strncasecmp(typestr,"ENDOFMIBVIEW",3)) return(SNMP_ENDOFMIBVIEW); if (!strncasecmp(typestr,"NOSUCHOBJECT",7)) return(SNMP_NOSUCHOBJECT); if (!strncasecmp(typestr,"NOSUCHINSTANCE",7)) return(SNMP_NOSUCHINSTANCE); if (!strncasecmp(typestr,"UINTEGER",3)) return(TYPE_UINTEGER); /* historic - should not show up */ /* but it does? */ if (!strncasecmp(typestr, "NOTIF", 3)) return(TYPE_NOTIFTYPE); if (!strncasecmp(typestr, "TRAP", 4)) return(TYPE_TRAPTYPE); return(TYPE_UNKNOWN);}static int__translate_asn_type(type)int type;{ switch (type) { case ASN_INTEGER: return(TYPE_INTEGER); break; case ASN_OCTET_STR: return(TYPE_OCTETSTR); break; case ASN_OPAQUE: return(TYPE_OPAQUE); break; case ASN_OBJECT_ID: return(TYPE_OBJID); break; case ASN_TIMETICKS: return(TYPE_TIMETICKS); break; case ASN_GAUGE: return(TYPE_GAUGE); break; case ASN_COUNTER: return(TYPE_COUNTER); break; case ASN_IPADDRESS: return(TYPE_IPADDR); break; case ASN_BIT_STR: return(TYPE_BITSTRING); break; case ASN_NULL: return(TYPE_NULL); break; /* no translation for these exception type values */ case SNMP_ENDOFMIBVIEW: case SNMP_NOSUCHOBJECT: case SNMP_NOSUCHINSTANCE: return(type); break; case ASN_UINTEGER: return(TYPE_UINTEGER); break; case ASN_COUNTER64: return(TYPE_COUNTER64); break; default: return(TYPE_OTHER); fprintf(stderr, "translate_asn_type: unhandled asn type (%d)\n",type); break; }}#define USE_BASIC 0#define USE_ENUMS 1#define USE_SPRINT_VALUE 2static int__snprint_value (buf, buf_len, var, tp, type, flag)char * buf;size_t buf_len;netsnmp_variable_list * var;struct tree * tp;int type;int flag;{ int len = 0; u_char* ip; struct enum_list *ep; buf[0] = '\0'; if (flag == USE_SPRINT_VALUE) { snprint_value(buf, buf_len, var->name, var->name_length, var); len = STRLEN(buf); } else { switch (var->type) { case ASN_INTEGER: if (flag == USE_ENUMS) { for(ep = tp->enums; ep; ep = ep->next) { if (ep->value == *var->val.integer) { strcpy(buf, ep->label); len = STRLEN(buf); break; } } } if (!len) { sprintf(buf,"%ld", *var->val.integer); len = STRLEN(buf); } break; case ASN_GAUGE: case ASN_COUNTER: case ASN_TIMETICKS: case ASN_UINTEGER: sprintf(buf,"%lu", (unsigned long) *var->val.integer); len = STRLEN(buf); break; case ASN_OCTET_STR: case ASN_OPAQUE: memcpy(buf, (char*)var->val.string, var->val_len); len = var->val_len; break; case ASN_IPADDRESS: ip = (u_char*)var->val.string; sprintf(buf, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); len = STRLEN(buf); break; case ASN_NULL: break; case ASN_OBJECT_ID: __sprint_num_objid(buf, (oid *)(var->val.objid), var->val_len/sizeof(oid)); len = STRLEN(buf); break; case SNMP_ENDOFMIBVIEW: sprintf(buf,"%s", "ENDOFMIBVIEW"); break; case SNMP_NOSUCHOBJECT: sprintf(buf,"%s", "NOSUCHOBJECT"); break; case SNMP_NOSUCHINSTANCE: sprintf(buf,"%s", "NOSUCHINSTANCE"); break; case ASN_COUNTER64:#ifdef OPAQUE_SPECIAL_TYPES case ASN_OPAQUE_COUNTER64: case ASN_OPAQUE_U64:#endif printU64(buf,(struct counter64 *)var->val.counter64); len = STRLEN(buf); break;#ifdef OPAQUE_SPECIAL_TYPES case ASN_OPAQUE_I64: printI64(buf,(struct counter64 *)var->val.counter64); len = STRLEN(buf); break;#endif case ASN_BIT_STR: snprint_bitstring(buf, sizeof(buf), var, NULL, NULL, NULL); len = STRLEN(buf); break;#ifdef OPAQUE_SPECIAL_TYPES case ASN_OPAQUE_FLOAT: if (var->val.floatVal) sprintf(buf,"%f", *var->val.floatVal); break; case ASN_OPAQUE_DOUBLE: if (var->val.doubleVal) sprintf(buf,"%f", *var->val.doubleVal); break;#endif case ASN_NSAP: default: fprintf(stderr,"snprint_value: asn type not handled %d\n",var->type); } } return(len);}static int__sprint_num_objid (buf, objid, len)char *buf;oid *objid;int len;{ int i; buf[0] = '\0'; for (i=0; i < len; i++) { sprintf(buf,".%lu",*objid++); buf += STRLEN(buf); } return SUCCESS;}static int__tp_sprint_num_objid (buf, tp)char *buf;SnmpMibNode *tp;{ oid newname[MAX_OID_LEN], *op; /* code taken from get_node in snmp_client.c */ for (op = newname + MAX_OID_LEN - 1; op >= newname; op--) { *op = tp->subid; tp = tp->parent; if (tp == NULL) break; } return __sprint_num_objid(buf, op, newname + MAX_OID_LEN - op);}static int__scan_num_objid (buf, objid, len)char *buf;oid *objid;size_t *len;{ char *cp; *len = 0; if (*buf == '.') buf++; cp = buf; while (*buf) { if (*buf++ == '.') { sscanf(cp, "%lu", objid++); /* *objid++ = atoi(cp); */ (*len)++; cp = buf; } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -