rendered paste body#include <sys/types.h>#include <net-snmp/net-snmp-config.h>#include <net-snmp/net-snmp-includes.h>#include <net-snmp/library/container.h>#include <net-snmp/library/data_list.h>#include <sys/types.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/time.h>#include <sys/select.h>#include <stdio.h>#include <netdb.h>#include <arpa/inet.h>#include <regex.h>#define NETSNMP_DS_WALK_INCLUDE_REQUESTED 1#define NETSNMP_DS_WALK_PRINT_STATISTICS 2#define NETSNMP_DS_WALK_DONT_CHECK_LEXICOGRAPHIC 3#define NETSNMP_DS_WALK_TIME_RESULTS 4#define NETSNMP_DS_WALK_DONT_GET_REQUESTED 5u_char *_snmp_var_print(const oid *, size_t, const netsnmp_variable_list *);u_char *_snmp_get_and_print(netsnmp_session *, oid *, size_t);netsnmp_session session;netsnmp_session *ss=NULL;size_t name_length;oid name[MAX_OID_LEN];size_t rootlen;oid root[MAX_OID_LEN];int numprinted=0;intsnmp_connect(int nagios_snmp_argc, char *nagios_snmp_argv_ro[]){ char **nagios_snmp_argv=NULL; int arg; int return_value=0; int intvar; /* copiamo gli argomenti in modo che non vengano utilizzati quelli in .fini (ro) */ if ((nagios_snmp_argv=(char **) malloc(nagios_snmp_argc * sizeof(char *)))==NULL) { fprintf (stderr, "libnagiossnmp --> Can't allocate enough space for nagios_snmp_argv\n"); } else { for (intvar=0; intvar<=nagios_snmp_argc; intvar++) { if (nagios_snmp_argv_ro[intvar]) { nagios_snmp_argv[intvar]=(char *) strdup(nagios_snmp_argv_ro[intvar]); } else { nagios_snmp_argv[intvar]=NULL; } } netsnmp_ds_register_config(ASN_BOOLEAN, "snmpwalk", "includeRequested", NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_WALK_INCLUDE_REQUESTED); netsnmp_ds_register_config(ASN_BOOLEAN, "snmpwalk", "excludeRequested", NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_WALK_DONT_GET_REQUESTED); netsnmp_ds_register_config(ASN_BOOLEAN, "snmpwalk", "printStatistics", NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_WALK_PRINT_STATISTICS); netsnmp_ds_register_config(ASN_BOOLEAN, "snmpwalk", "dontCheckOrdering", NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_WALK_DONT_CHECK_LEXICOGRAPHIC); netsnmp_ds_register_config(ASN_BOOLEAN, "snmpwalk", "timeResults", NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_WALK_TIME_RESULTS); if ((arg = snmp_parse_args(nagios_snmp_argc, nagios_snmp_argv, &session, NULL, NULL)) < 0) { fprintf (stderr, "libnagiossnmp --> Error while parsing arguments\n"); } else { rootlen = MAX_OID_LEN; if (snmp_parse_oid(nagios_snmp_argv[arg], root, &rootlen) == NULL) { snmp_perror(nagios_snmp_argv[arg]); } else { SOCK_STARTUP; /* open an SNMP session */ ss = snmp_open(&session); if (ss==NULL) { fprintf (stderr, "libnagiossnmp --> Can't open an snmp connection\n"); } else { /* get first object to start walk */ memmove(name, root, rootlen * sizeof(oid)); name_length = rootlen; return_value=1; } } } } return (return_value);}u_char *_snmp_var_print(const oid * objid, size_t objidlen, const netsnmp_variable_list * variable){ u_char *buf = NULL; size_t buf_len = 256; size_t out_len = 0; if ((buf = (u_char *) calloc(buf_len, 1)) == NULL) { fprintf (stderr, "libnagiossnmp --> Can't allocate space for buf\n"); } else { sprint_realloc_variable(&buf, &buf_len, &out_len, 1, objid, objidlen, variable); } return (buf);}u_char *_snmp_get_and_print(netsnmp_session * current_ss, oid * theoid, size_t theoid_len){ netsnmp_pdu *pdu; netsnmp_pdu *response; netsnmp_variable_list *vars; int status; u_char *buf=NULL; pdu = snmp_pdu_create(SNMP_MSG_GET); snmp_add_null_var(pdu, theoid, theoid_len); status = snmp_synch_response(current_ss, pdu, &response); if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR) { for (vars = response->variables; vars; vars = vars->next_variable) { numprinted++; buf=_snmp_var_print(vars->name, vars->name_length, vars); } } if (response) { snmp_free_pdu(response); } return (buf);}u_char *snmp_walk(void){ netsnmp_pdu *response; netsnmp_pdu *pdu; netsnmp_variable_list *vars; int count; int status; u_char *snmp_buf = NULL; if (ss==NULL) { fprintf (stderr, "libnagiossnmp --> Missing session\n"); } else { /* usleep - we won't kill the CPU.... */ usleep (10000); /* create PDU for GETNEXT request and add object name to request */ pdu = snmp_pdu_create(SNMP_MSG_GETNEXT); snmp_add_null_var(pdu, name, name_length); status = snmp_synch_response(ss, pdu, &response); if (status == STAT_SUCCESS) { if (response->errstat == SNMP_ERR_NOERROR) { /* check resulting variables */ for (vars = response->variables; vars; vars = vars->next_variable) { if ((vars->name_length < rootlen) || (memcmp(root, vars->name, rootlen * sizeof(oid))!= 0)) { /* not part of this subtree */ /* fprintf(stderr, "libnagiossnmp --> not part of this subtree: %s\n", _snmp_var_print(vars->name, vars->name_length, vars)); */ continue; } else { numprinted++; snmp_buf=_snmp_var_print(vars->name, vars->name_length, vars); } if ((vars->type != SNMP_ENDOFMIBVIEW) && (vars->type != SNMP_NOSUCHOBJECT) && (vars->type != SNMP_NOSUCHINSTANCE)) { /* not an exception value */ if (snmp_oid_compare(name, name_length, vars->name, vars->name_length) >= 0) { fprintf(stderr, "libnagiossnmp --> Error: OID not increasing: "); fprint_objid(stderr, name, name_length); fprintf(stderr, " >= "); fprint_objid(stderr, vars->name,vars->name_length); fprintf(stderr, "\n"); } memmove((char *) name, (char *) vars->name, vars->name_length * sizeof(oid)); name_length = vars->name_length; } else { /* an exception value, so stop */ } } } else { /* error in response, print it */ if (response->errstat == SNMP_ERR_NOSUCHNAME) { printf("End of MIB\n"); } else { fprintf(stderr, "libnagiossnmp --> Error in packet.\nReason: %s\n",snmp_errstring(response->errstat)); if (response->errindex != 0) { fprintf(stderr, "libnagiossnmp --> Failed object: "); for (count = 1, vars = response->variables; vars && count != response->errindex; vars = vars->next_variable, count++) { /*EMPTY*/; } if (vars) { fprint_objid(stderr, vars->name, vars->name_length); } fprintf(stderr, "\n"); } } } } else if (status == STAT_TIMEOUT) { fprintf(stderr, "libnagiossnmp --> Timeout: No Response from %s\n",session.peername); } else { /* status == STAT_ERROR */ snmp_sess_perror("snmpwalk", ss); if (response) { snmp_free_pdu(response); } if (numprinted == 0 && status == STAT_SUCCESS) { /* * no printed successful results, which may mean we were * pointed at an only existing instance. Attempt a GET, just * for get measure. */ snmp_buf=_snmp_get_and_print(ss, root, rootlen); } } } return (snmp_buf);}intsnmp_disconnect(void){ snmp_close(ss); SOCK_CLEANUP; return (0);}intbool_reg_exp(char *string, char *pattern){ int status; regex_t re; int return_value=0; if(regcomp(&re, pattern,REG_EXTENDED|REG_NOSUB)==0) { status=regexec(&re, string, (size_t) 0, NULL, 0); regfree(&re); if(status==0) { return_value=1; } } return(return_value);}voidreg_exp(char *strbuf, char *pattern, char *srcstring){ regex_t windisk_preg; regmatch_t pmatch[2]; /* compila la reg exp */ regcomp(&windisk_preg, pattern, REG_EXTENDED); /* la esegue ... */ if (regexec(&windisk_preg, strbuf, 2, pmatch, 0) == 0) { if ((pmatch[1].rm_eo - pmatch[1].rm_so) < strlen(strbuf)) { strncpy(srcstring, strbuf + pmatch[1].rm_so, pmatch[1].rm_eo - pmatch[1].rm_so); srcstring[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0'; } } regfree (&windisk_preg);}