diff --git a/src/usr.sbin/ntpd/ntp.c b/src/usr.sbin/ntpd/ntp.c index 26bd5669..3673bb8d 100644 --- a/src/usr.sbin/ntpd/ntp.c +++ b/src/usr.sbin/ntpd/ntp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ntp.c,v 1.99 2007/08/04 02:58:02 ckuethe Exp $ */ +/* $OpenBSD: ntp.c,v 1.100 2007/10/15 06:59:31 otto Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -38,14 +38,18 @@ #define PFD_MAX 2 volatile sig_atomic_t ntp_quit = 0; +volatile sig_atomic_t ntp_report = 0; struct imsgbuf *ibuf_main; struct ntpd_conf *conf; u_int peer_cnt; +u_int sensors_cnt; +time_t lastreport; void ntp_sighdlr(int); int ntp_dispatch_imsg(void); void peer_add(struct ntp_peer *); void peer_remove(struct ntp_peer *); +void report_peers(int); void ntp_sighdlr(int sig) @@ -55,6 +59,9 @@ ntp_sighdlr(int sig) case SIGTERM: ntp_quit = 1; break; + case SIGINFO: + ntp_report = 1; + break; } } @@ -65,7 +72,6 @@ ntp_main(int pipe_prnt[2], struct ntpd_conf *nconf) int hotplugfd, nullfd; u_int pfd_elms = 0, idx2peer_elms = 0; u_int listener_cnt, new_cnt, sent_cnt, trial_cnt; - u_int sensors_cnt = 0; pid_t pid; struct pollfd *pfd = NULL; struct passwd *pw; @@ -135,6 +141,7 @@ ntp_main(int pipe_prnt[2], struct ntpd_conf *nconf) signal(SIGTERM, ntp_sighdlr); signal(SIGINT, ntp_sighdlr); + signal(SIGINFO, ntp_sighdlr); signal(SIGPIPE, SIG_IGN); signal(SIGHUP, SIG_IGN); signal(SIGCHLD, SIG_DFL); @@ -173,6 +180,9 @@ ntp_main(int pipe_prnt[2], struct ntpd_conf *nconf) TAILQ_FOREACH(p, &conf->ntp_peers, entry) peer_cnt++; + /* wait 5 min before reporting first status to let things settle down */ + lastreport = time(NULL) + (5 * 60) - REPORT_INTERVAL; + while (ntp_quit == 0) { if (peer_cnt > idx2peer_elms) { if ((newp = realloc(idx2peer, sizeof(void *) * @@ -324,6 +334,8 @@ ntp_main(int pipe_prnt[2], struct ntpd_conf *nconf) if (s->next <= getmonotime()) sensor_query(s); } + report_peers(ntp_report); + ntp_report = 0; } msgbuf_write(&ibuf_main->w); @@ -403,6 +415,9 @@ ntp_dispatch_imsg(void) h->next = NULL; npeer->addr = h; npeer->addr_head.a = h; + npeer->addr_head.name = + peer->addr_head.name; + npeer->addr_head.pool = 1; client_peer_init(npeer); npeer->state = STATE_DNS_DONE; peer_add(npeer); @@ -654,3 +669,59 @@ error_interval(void) return (interval + r); } +void +report_peers(int always) +{ + time_t now; + u_int badpeers = 0; + u_int badsensors = 0; + struct ntp_peer *p; + struct ntp_sensor *s; + + TAILQ_FOREACH(p, &conf->ntp_peers, entry) { + if (p->trustlevel < TRUSTLEVEL_BADPEER) + badpeers++; + } + TAILQ_FOREACH(s, &conf->ntp_sensors, entry) { + if (!s->update.good) + badsensors++; + } + + now = time(NULL); + if (!always) { + if ((peer_cnt == 0 || badpeers == 0 || badpeers < peer_cnt / 2) + && (sensors_cnt == 0 || badsensors == 0 || + badsensors < sensors_cnt / 2)) + return; + + if (lastreport + REPORT_INTERVAL > now) + return; + } + lastreport = now; + if (peer_cnt > 0) { + log_warnx("%u out of %u peers valid", peer_cnt - badpeers, + peer_cnt); + TAILQ_FOREACH(p, &conf->ntp_peers, entry) { + if (p->trustlevel < TRUSTLEVEL_BADPEER) { + const char *a = "not resolved"; + const char *pool = ""; + if (p->addr) + a = log_sockaddr( + (struct sockaddr *)&p->addr->ss); + if (p->addr_head.pool) + pool = "from pool "; + log_warnx("bad peer %s%s (%s)", pool, + p->addr_head.name, a); + } + } + } + if (sensors_cnt > 0) { + log_warnx("%u out of %u sensors valid", + sensors_cnt - badsensors, sensors_cnt); + TAILQ_FOREACH(s, &conf->ntp_sensors, entry) { + if (!s->update.good) + log_warnx("bad sensor %s", s->device); + } + } +} + diff --git a/src/usr.sbin/ntpd/ntpd.8 b/src/usr.sbin/ntpd/ntpd.8 index 1bcc6821..8cea88f2 100644 --- a/src/usr.sbin/ntpd/ntpd.8 +++ b/src/usr.sbin/ntpd/ntpd.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ntpd.8,v 1.20 2007/09/13 14:34:36 pyr Exp $ +.\" $OpenBSD: ntpd.8,v 1.21 2007/10/15 06:59:32 otto Exp $ .\" .\" Copyright (c) 2003, 2004, 2006 Henning Brauer .\" @@ -14,7 +14,7 @@ .\" AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT .\" OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: September 13 2007 $ +.Dd $Mdocdate: October 15 2007 $ .Dt NTPD 8 .Os .Sh NAME @@ -108,6 +108,12 @@ This option allows .Nm to send DEBUG priority messages to syslog. .El +.Pp +When +.Nm +receives a +.Dv SIGINFO +signal, it will write its peer and sensor status to syslog. .Sh FILES .Bl -tag -width "/var/db/ntpd.driftXXX" -compact .It Pa /etc/ntpd.conf diff --git a/src/usr.sbin/ntpd/ntpd.h b/src/usr.sbin/ntpd/ntpd.h index 1ab2ffa3..73c01752 100644 --- a/src/usr.sbin/ntpd/ntpd.h +++ b/src/usr.sbin/ntpd/ntpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ntpd.h,v 1.87 2007/09/13 14:34:36 pyr Exp $ */ +/* $OpenBSD: ntpd.h,v 1.88 2007/10/15 06:59:32 otto Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -61,6 +61,7 @@ #define LOG_NEGLIGEE 32 /* negligible drift to not log (ms) */ #define FREQUENCY_SAMPLES 8 /* samples for est. of permanent drift */ #define MAX_FREQUENCY_ADJUST 128e-5 /* max correction per iteration */ +#define REPORT_INTERVAL (24*60*60) /* interval between status reports */ #define SENSOR_DATA_MAXAGE (15*60)