int log_handler_stdouterr( netsnmp_log_handler* logh, int pri, const char *str) { static int newline = 1; /* MTCRITICAL_RESOURCE */ const char *newline_ptr; char sbuf[40]; if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_LOG_TIMESTAMP) && newline) { sprintf_stamp(NULL, sbuf); } else { strcpy(sbuf, ""); } /* * Remember whether or not the current line ends with a newline for the * next call of log_handler_stdouterr(). */ newline_ptr = strrchr(str, '\n'); newline = newline_ptr && newline_ptr[1] == 0; if (logh->imagic) printf( "%s%s", sbuf, str); else fprintf(stderr, "%s%s", sbuf, str); return 1; }
void snmp_log_string (int priority, const char *string) { char sbuf[40]; struct snmp_log_message slm; #if HAVE_SYSLOG_H if (do_syslogging) { syslog(priority, string); } #endif if (do_log_callback) { slm.priority = priority; slm.msg = string; snmp_call_callbacks(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_LOGGING, &slm); } if (do_filelogging || do_stderrlogging) { if (ds_get_boolean(DS_LIBRARY_ID, DS_LIB_LOG_TIMESTAMP) && newline) { sprintf_stamp(NULL, (char *)&sbuf); } else { strcpy(sbuf, ""); } newline = string[strlen(string)-1] == '\n'; if (do_filelogging) fprintf(logfile, "%s%s", sbuf, string); if (do_stderrlogging) fprintf(stderr, "%s%s", sbuf, string); } }
RETSIGTYPE SnmpdShutDown(int a) { /* We've received a sigTERM. Shutdown by calling mib-module functions and sending out a shutdown trap. */ fprintf(stderr, "%s Received TERM or STOP signal... shutting down...\n", sprintf_stamp(NULL)); running = 0; }
int log_handler_stdouterr( netsnmp_log_handler* logh, int pri, const char *str) { char sbuf[40]; if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_LOG_TIMESTAMP) && newline) { sprintf_stamp(NULL, sbuf); } else { strcpy(sbuf, ""); } newline = str[strlen(str) - 1] == '\n'; /* XXX - Eh ? */ if (logh->imagic) printf( "%s%s", sbuf, str); else fprintf(stderr, "%s%s", sbuf, str); return 1; }
int log_handler_file( netsnmp_log_handler* logh, int pri, const char *str) { FILE *fhandle; char sbuf[40]; /* * We use imagic to save information about whether the next output * will start a new line, and thus might need a timestamp */ if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_LOG_TIMESTAMP) && logh->imagic) { sprintf_stamp(NULL, sbuf); } else { strcpy(sbuf, ""); } /* * If we haven't already opened the file, then do so. * Save the filehandle pointer for next time. * * Note that this should still work, even if the file * is closed in the meantime (e.g. a regular "cleanup" sweep) */ fhandle = (FILE*)logh->magic; if (!logh->magic) { fhandle = fopen(logh->token, "a+"); if (!fhandle) return 0; logh->magic = (void*)fhandle; } fprintf(fhandle, "%s%s", sbuf, str); fflush(fhandle); logh->imagic = str[strlen(str) - 1] == '\n'; return 1; }
int snmp_read_packet(int sd) { struct sockaddr_in from; int length, out_length, fromlength; u_char packet[1500], outpacket[1500]; #ifdef USE_LIBWRAP char *addr_string; #endif fromlength = sizeof from; length = recvfrom(sd, (char *) packet, 1500, 0, (struct sockaddr *)&from, &fromlength); if (length == -1) perror("recvfrom"); #ifdef USE_LIBWRAP addr_string = inet_ntoa(from.sin_addr); if(!addr_string) { addr_string = STRING_UNKNOWN; } if(hosts_ctl("snmpd", addr_string, addr_string, STRING_UNKNOWN)) { syslog(allow_severity, "Connection from %s", addr_string); } else { syslog(deny_severity, "Connection from %s refused", addr_string); return(0); } #endif #ifdef USING_MIBII_SNMP_MIB_MODULE snmp_inpkts++; #endif if (snmp_dump_packet){ printf("\nreceived %d bytes from %s:\n", length, inet_ntoa(from.sin_addr)); xdump(packet, length, ""); printf("\n"); fflush(stdout); } else if (log_addresses){ int count; for(count = 0; count < ADDRCACHE; count++){ if (addrCache[count].status > UNUSED /* used or old */ && from.sin_addr.s_addr == addrCache[count].addr) break; } if (count >= ADDRCACHE || verbose){ printf("%s Received SNMP packet(s) from %s\n", sprintf_stamp(NULL), inet_ntoa(from.sin_addr)); for(count = 0; count < ADDRCACHE; count++){ if (addrCache[count].status == UNUSED){ addrCache[count].addr = from.sin_addr.s_addr; addrCache[count].status = USED; break; } } } else { addrCache[count].status = USED; } } out_length = 1500; if (snmp_agent_parse(packet, length, outpacket, &out_length, from.sin_addr.s_addr)){ if (snmp_dump_packet){ printf("\nsent %d bytes to %s:\n", out_length, inet_ntoa(from.sin_addr)); xdump(outpacket, out_length, ""); printf("\n"); fflush(stdout); } #ifdef USING_MIBII_SNMP_MIB_MODULE snmp_outpkts++; #endif if (sendto(sd, (char *)outpacket, out_length, 0, (struct sockaddr *)&from, sizeof(from)) < 0){ perror("sendto"); return 0; } } return 1; }
int main(int argc, char *argv[]) { int arg,i; int ret; u_short dest_port = 161; int dont_fork = 0, dont_zero_log = 0; char logfile[300]; char *cptr, **argvptr; logfile[0] = 0; optconfigfile = NULL; dontReadConfigFiles = 0; #ifdef LOGFILE strcpy(logfile,LOGFILE); #endif /* * usage: snmpd */ for(arg = 1; arg < argc; arg++){ if (argv[arg][0] == '-'){ switch(argv[arg][1]){ case 'c': if (++arg == argc) usage(argv[0]); optconfigfile = strdup(argv[arg]); break; case 'C': dontReadConfigFiles = 1; break; case 'd': snmp_dump_packet++; verbose = 1; break; case 'q': snmp_set_quick_print(1); break; case 'D': debug_register_tokens(&argv[arg][2]); snmp_set_do_debugging(1); break; case 'p': if (++arg == argc) usage(argv[0]); dest_port = atoi(argv[arg]); if (dest_port <= 0) usage(argv[0]); break; case 'a': log_addresses++; break; case 'V': verbose = 1; break; case 'f': dont_fork = 1; break; case 'l': if (++arg == argc) usage(argv[0]); strcpy(logfile,argv[arg]); break; case 'L': logfile[0] = 0; break; case 'A': dont_zero_log = 1; break; case 'h': usage(argv[0]); break; case 'H': init_agent(); /* register our .conf handlers */ #ifdef HAVE_MIB register_mib_handlers(); /* snmplib .conf handlers */ #endif fprintf(stderr, "Configuration directives understood:\n"); read_config_print_usage(" "); break; case 'v': printf("\nUCD-snmp version: %s\n",VersionInfo); printf("Author: Wes Hardaker\n"); printf("Email: [email protected]\n\n"); exit (0); case '-': switch(argv[arg][2]){ case 'v': printf("\nUCD-snmp version: %s\n",VersionInfo); printf("Author: Wes Hardaker\n"); printf("Email: [email protected]\n\n"); exit (0); case 'h': usage(argv[0]); exit(0); } default: printf("invalid option: %s\n", argv[arg]); usage(argv[0]); break; } continue; } } /* initialize a argv set to the current for restarting the agent */ argvrestartp = (char **) malloc((argc+2) * sizeof (char *)); argvptr = argvrestartp; for(i=0, ret = 1; i < argc; i++) { ret += strlen(argv[i])+1; } argvrestart = (char *) malloc((ret)); argvrestartname = (char *) malloc(strlen(argv[0])+1); strcpy(argvrestartname,argv[0]); for(cptr = argvrestart,i = 0; i < argc; i++) { strcpy(cptr,argv[i]); *(argvptr++) = cptr; cptr += strlen(argv[i]) + 1; } *cptr = 0; *argvptr = NULL; /* open the logfile if necessary */ if (logfile[0]) { close(1); open(logfile,O_WRONLY|O_CREAT| ((dont_zero_log) ? O_APPEND : O_TRUNC), 0644); close(2); dup(1); close(0); } #ifdef USE_LIBWRAP openlog("snmpd", LOG_CONS, LOG_AUTH|LOG_INFO); #endif setvbuf (stdout, NULL, _IOLBF, BUFSIZ); printf ("%s UCD-SNMP version %s\n", sprintf_stamp (NULL), VersionInfo); if (!dont_fork && fork() != 0) /* detach from shell */ exit(0); init_agent(); /* register our .conf handlers */ #ifdef HAVE_MIB register_mib_handlers(); /* snmplib .conf handlers */ read_premib_configs(); /* read pre-mib-reading .conf handlers */ init_mib(); /* initialize the mib structures */ #endif update_config(0); /* read in config files and register HUP */ #ifdef PERSISTENTFILE /* read in the persistent information cache */ read_config_with_type(PERSISTENTFILE, "snmpd"); unlink(PERSISTENTFILE); /* nuke it now that we've read it */ #endif #ifdef HAVE_SNMP2P init_snmp2p( dest_port ); #endif printf("Opening port(s): "); fflush(stdout); if (( ret = open_port( dest_port )) > 0 ) sd_handlers[ret-1] = snmp_read_packet; /* Save pointer to function */ #ifdef HAVE_SNMP2P open_ports_snmp2p( ); #endif printf("\n"); fflush(stdout); /* get current time (ie, the time the agent started) */ gettimeofday(&starttime, NULL); starttime.tv_sec--; starttime.tv_usec += 1000000L; /* send coldstart trap via snmptrap(1) if possible */ send_easy_trap (0, 0); signal(SIGTERM, SnmpdShutDown); signal(SIGINT, SnmpdShutDown); memset(addrCache, 0, sizeof(addrCache)); receive(sdlist); #include "mib_module_shutdown.h" DEBUGMSGTL(("snmpd", "sending shutdown trap\n")); SnmpTrapNodeDown(); DEBUGMSGTL(("snmpd", "Bye...\n")); return 0; }