why my modified snmptrapd often lose trap messages-_-

麻 雪蛟 <[email protected]>
Newsgroups gmane.network.net-snmp.user
Message-ID <[email protected]>
hi
  I modified snmptrapd file, add a global trap handler by myself, and I 
delete some instructuions of standard snmptrapd(I think it maybe useless), 
and It runs ok, but I find a problem, when sending trap messages after my 
snmptrapd program started for one minute, my deamon couldn't receive the 
trap messages or couldn't invoke my global trap handler..I don't konw why? 
did I delete crucial code of original snmptrapd??

following is my thin snmptraps code:

start_trapd like main funtion!

int start_trapd()
{
    netsnmp_session *sess_list = NULL, *ss = NULL;
    netsnmp_transport *transport = NULL;
    int             i = 0, depmsg = 0;
    int             count, numfds, block;
    fd_set          fdset;
    struct timeval  timeout, *tvp;
    int             dofork = 1;
    char           *cp, *listen_ports = NULL;
    char           *trap1_fmt_str_remember = NULL;

//#ifdef SIGTERM
//    signal(SIGTERM, term_handler);
//#endif
//#ifdef SIGHUP
//    signal(SIGHUP, hup_handler);
//#endif
//#ifdef SIGINT
//    signal(SIGINT, term_handler);
//#endif
//#ifdef SIGPIPE
//    signal(SIGPIPE, SIG_IGN);   /* 'Inline' failure of wayward readers */
// #endif

    /*
     * we need to be called back later 
     */
    snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA,
                           usm_store_users, NULL);

#ifdef WIN32
    setvbuf(stdout, NULL, _IONBF, BUFSIZ);
#else
    setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
#endif

	/*
     * don't fail if we can't do agentx (ie, socket not there, or not root) 

     */
    netsnmp_ds_toggle_boolean(NETSNMP_DS_APPLICATION_ID, 
			      NETSNMP_DS_AGENT_NO_ROOT_ACCESS);
    /*
     * ignore any warning messages.
     */
    netsnmp_ds_toggle_boolean(NETSNMP_DS_APPLICATION_ID, 
			      NETSNMP_DS_AGENT_NO_CONNECTION_WARNINGS);

    /*
     * initialize the agent library 
     */
    init_agent("snmptrapd");

/*
	add trap message handler
	--anders
*/
	netsnmp_add_global_traphandler(NETSNMPTRAPD_POST_HANDLER, 
trap_message_handler);

    /*
     * Initialize the world. Create initial user 
     */
//    init_snmp("snmptrapd");
//    if (trap1_fmt_str_remember) {
//        free_trap1_fmt();
//        free_trap2_fmt();
//        print_format1 = strdup(trap1_fmt_str_remember);
//        print_format2 = strdup(trap1_fmt_str_remember);
//    }

    if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
			       NETSNMP_DS_AGENT_QUIT_IMMEDIATELY)) {
        /*
         * just starting up to process specific configuration and then
         * shutting down immediately. 
         */
        running = 0;
    }

     SOCK_STARTUP;

    if (listen_ports)
        cp = listen_ports;
    else
        cp = default_port;

    while (cp != NULL) {
        char *sep = strchr(cp, ',');
        char  listen_name[128];
        char *cp2 = strchr(cp, ':');

        if (sep != NULL) {
            *sep = 0;
        }

           /*
            * Make sure this defaults to listening on port 162
            */
        if (!cp2) {
            snprintf(listen_name, sizeof(listen_name), "%s:162", cp);
            cp2 = listen_name;
        } else {
            cp2 = cp;
        }
        transport = netsnmp_tdomain_transport(cp2, 1, "udp");
        if (transport == NULL) {
//            snmp_log(LOG_ERR, "couldn't open %s -- errno %d (\"%s\")\n",
//                     cp2, errno, strerror(errno));
            snmptrapd_close_sessions(sess_list);
            SOCK_CLEANUP;
            exit(1);
        } else {
            ss = snmptrapd_add_session(transport);
            if (ss == NULL) {
                /*
                 * Shouldn't happen?  We have already opened the transport
                 * successfully so what could have gone wrong?  
                 */
                snmptrapd_close_sessions(sess_list);
                netsnmp_transport_free(transport);
//                if (Syslog) {
//                    snmp_log(LOG_ERR, "couldn't open snmp - %m");
//                }
                SOCK_CLEANUP;
                exit(1);
            } else {
                ss->next = sess_list;
                sess_list = ss;
            }
        }

        /*
         * Process next listen address, if there is one.  
         */

        if (sep != NULL) {
            *sep = ',';
            cp = sep + 1;
        } else {
            cp = NULL;
        }
    }

    /*
     * ignore early sighup during startup
     */
    reconfig = 0;

//#ifdef WIN32SERVICE
//    trapd_status = SNMPTRAPD_RUNNING;
//#endif
    while (running) {
        if (reconfig) {
             reconfig = 0;
        }
        numfds = 0;
        FD_ZERO(&fdset);
        block = 0;
        tvp = &timeout;
        timerclear(tvp);
        tvp->tv_sec = 5;
        snmp_select_info(&numfds, &fdset, tvp, &block);
        if (block == 1)
            tvp = NULL;         /* block without timeout */
        count = select(numfds, &fdset, 0, 0, tvp);
        gettimeofday(&Now, 0);
        if (count > 0) {
            snmp_read(&fdset);
        } else
            switch (count) {
            case 0:
                snmp_timeout();
                break;
            case -1:
                if (errno == EINTR)
                    continue;
//                 snmp_log_perror("select");
                running = 0;
                break;
            default:
//                 fprintf(stderr, "select returned %d\n", count);
                running = 0;
            }
	run_alarms();
    }

    if (Print || Log) {
        struct tm      *tm;
        time_t          timer;
        time(&timer);
        tm = localtime(&timer);
    }


    snmptrapd_close_sessions(sess_list);
    snmp_shutdown("snmptrapd");
//#ifdef WIN32SERVICE
//    trapd_status = SNMPTRAPD_STOPPED;
//#endif
    snmp_disable_log();
    SOCK_CLEANUP;
    return 0;
}

int trap_message_handler(netsnmp_pdu	     *pdu,
                       netsnmp_transport     *transport,
                       netsnmp_trapd_handler *handler)
{
	char *strIpAddress;
	struct in_addr sInAddr;
	char oidBuf[200];
	struct variable_list *vars;

	memset(oidBuf, 200, 0);

	//parse pdu->enterprise variable to string
	snprint_objid(oidBuf, 200, pdu->enterprise, pdu->enterprise_length);
	
	//covert agent_addr to string ip address
	sInAddr.S_un.S_un_b.s_b1 = pdu->agent_addr[0];
	sInAddr.S_un.S_un_b.s_b2 = pdu->agent_addr[1];
	sInAddr.S_un.S_un_b.s_b3 = pdu->agent_addr[2];
	sInAddr.S_un.S_un_b.s_b4 = pdu->agent_addr[3];
	strIpAddress = inet_ntoa(sInAddr);

	//print basic information
	printf("Agent address  : %s\n", strIpAddress);
	printf("Enterprise     : %s\n", oidBuf);
	printf("Generic trap   : %d\n", pdu->trap_type);
	printf("Sepecific trap : %d\n", pdu->specific_type);
	printf("Time stamp     : %d\n", pdu->time);

	//print variable
	printf("Bind variable  :\n");
	for (vars = pdu->variables; vars; vars = vars->next_variable)
	{
		char buf[1000];
		memset (buf, 1000, 0);
		//snprint_variable (buf, 1000, vars->name, vars->name_length, vars);
		print_variable(vars->name, vars->name_length, vars);
	}
	printf("--------------------------\n");
	return 1;
}


Best Regards
Anders

_________________________________________________________________
涓虹杩琛浜ゆ锛璇蜂娇 MSN Messenger:  http://messenger.msn.com/cn  



-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click
_______________________________________________
Net-snmp-users mailing list
[email protected]
Please see the following page to unsubscribe or change other options:
https://lists.sourceforge.net/lists/listinfo/net-snmp-users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.