]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/ntp/ntpsnmpd/ntpsnmpd.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / ntp / ntpsnmpd / ntpsnmpd.c
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