1 /***************************************************************************** 2 * 3 * ntpsnmpd.c 4 * 5 * The NTP SNMP daemon is an Agent X subagent application that 6 * registers itself with a running SNMP Agent X master process running 7 * on the same machine on port TCP 705. It utilizes the libntqp library 8 * which accesses status and general data of a running ntpd process on 9 * the same machine and enables the user to monitor the status of a 10 * ntp daemon process via SNMP. 11 * 12 * This started as a Google Summer of Code 2008 project, 13 * including the ntpsnmpd sub agent and the libntpq library. 14 * 15 * For more information please visit 16 * http://support.ntp.org/bin/view/Dev/GSoC2008snmp 17 * Or contact: 18 * Harlan Stenn (Mentor) at stenn@ntp.org 19 * Heiko Gerstung (Student) at gerstung@ntp.org 20 * 21 ****************************************************************************/ 22 23 #include <ntp_snmp.h> 24 #include <signal.h> 25 #include <sys/time.h> 26 27 #ifdef SOLARIS /* needed with at least Solaris 8 */ 28 #include <siginfo.h> 29 #endif 30 31 #include <libntpq.h> 32 #include <ntpsnmpd-opts.h> 33 34 static int keep_running; 35 RETSIGTYPE stop_server(int); 36 37 RETSIGTYPE 38 stop_server(int a) { 39 keep_running = 0; 40 } 41 42 /* The main function just sets up a few things and then enters a loop in which it will 43 * wait for SNMP requests coming from the master agent 44 */ 45 46 int 47 main (int argc, char **argv) { 48 int background = 0; /* start as background process */ 49 int use_syslog = 1; /* use syslog for logging */ 50 51 { 52 int optct = optionProcess(&ntpsnmpdOptions, argc, argv); 53 argc -= optct; 54 argv += optct; 55 } 56 57 if (!HAVE_OPT(NOFORK)) 58 background = 1; 59 60 if (!HAVE_OPT(SYSLOG)) 61 use_syslog = 0; 62 63 /* using the net-snmp syslog facility */ 64 if (use_syslog) 65 snmp_enable_calllog(); 66 else 67 snmp_enable_stderrlog(); 68 69 /* Become Subagent */ 70 netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE, 1); 71 72 /* go into background mode, if requested */ 73 if (background && netsnmp_daemonize(1, !use_syslog)) 74 exit(1); 75 76 /* Now register with the master Agent X process */ 77 78 /* call Netsnmp socket startup macro, which will initialize the network stuff if required */ 79 SOCK_STARTUP; 80 81 /* Set AgentX socket interface */ 82 netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID, 83 NETSNMP_DS_AGENT_X_SOCKET, OPT_ARG( AGENTXSOCKET )); 84 85 init_agent("ntpsnmpd"); 86 87 /* Try to connect to ntpd */ 88 if ( ntpq_openhost("localhost", 0) == 0 ) 89 { 90 fprintf(stderr, "Error: Could not connect to ntpd. Aborting.\n"); 91 exit(1); 92 } 93 94 95 /* Register callback functions ... */ 96 init_ntpSnmpSubagentObject(); 97 init_snmp("ntpsnmpd"); 98 99 /* Signal handler */ 100 keep_running = 1; 101 signal(SIGTERM, stop_server); 102 signal(SIGINT, stop_server); 103 104 snmp_log(LOG_INFO,"ntpsnmpd started.\n"); 105 106 /* main loop here... */ 107 while(keep_running) { 108 agent_check_and_process(1); /* 0 == don't block */ 109 } 110 111 /* at shutdown time */ 112 ntpq_closehost(); 113 snmp_shutdown("ntpsnmpd"); 114 SOCK_CLEANUP; 115 116 return 0; 117 } 118 119