Annotation of embedaddon/ntp/ntpsnmpd/ntpsnmpd.c, revision 1.1.1.1
1.1 misho 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 )
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:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>