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