All pastes #477548 Raw Edit

nagiossnmp.c

public c v1 · immutable
·published 2007-05-08 18:24 UTC
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);}