// TODO: this is ugly func updateTimeOf(what string) { v := stats.Get("last") if v == nil { return } v = times.Get(what) if v == nil { var t expvar.String t.Set(time.Now().Format(TimeNZ)) times.Set(what, &t) return } if e, ok := v.(*expvar.String); ok { e.Set(time.Now().Format(TimeNZ)) } }
// TODO: maybe we should use Func() and just keep a stats structure. // But that would require locking and nngh nngh. func setupExpvars() { var m expvar.Map m.Init() m.Set("notls", expvar.Func(notls.Stats)) m.Set("yakkers", expvar.Func(yakkers.Stats)) stats.Set("sizes", &m) stats.Set("dnsbl_hits", expvar.Func(dblcounts.Stats)) stats.Set("sbl_hits", expvar.Func(sblcounts.Stats)) // BUG: must remember to do this for all counters so they have // an initial value. var evts expvar.Map evts.Init() evts.Set("connections", &events.connections) evts.Set("tls_errors", &events.tlserrs) evts.Set("yakkers", &events.yakkers) evts.Set("notls_conns", &events.notlscnt) evts.Set("rules_errors", &events.ruleserr) evts.Set("yakker_adds", &events.yakads) evts.Set("rsetdrops", &events.rsetdrops) evts.Set("abandons", &events.abandons) evts.Set("refuseds", &events.refuseds) stats.Set("events", &evts) var mailevts expvar.Map var goodevts expvar.Map var cmds expvar.Map mailevts.Init() goodevts.Init() cmds.Init() // Maybe these should track refused commands? Not sure. cmds.Set("ehlo", &events.ehlo) cmds.Set("mailfrom", &events.mailfrom) cmds.Set("rcptto", &events.rcptto) cmds.Set("data", &events.data) mailevts.Set("commands", &cmds) // These are counts of *accepted* commands. // TODO: maybe revise how things are counted? Dunno. goodevts.Set("ehlo", &events.ehloAccept) goodevts.Set("mailfrom", &events.mailfromAccept) goodevts.Set("rcptto", &events.rcpttoAccept) goodevts.Set("data", &events.dataAccept) goodevts.Set("messages", &events.messages) mailevts.Set("accepted", &goodevts) mailevts.Set("ehlo_tlson", &events.tlson) mailevts.Set("quits", &events.quits) mailevts.Set("aborts", &events.aborts) mailevts.Set("rsets", &events.rsets) stats.Set("smtpcounts", &mailevts) // constants stats.Add("pid", int64(os.Getpid())) var stime expvar.String stime.Set(time.Now().String()) stats.Set("startTime", &stime) var conntime expvar.String times.Init() // We're going to have connections, so we set this now. times.Set("connection", &conntime) stats.Set("last", ×) }