diff options
author | Kevin Chabowski <kevin@kch42.de> | 2013-09-14 12:42:30 +0200 |
---|---|---|
committer | Kevin Chabowski <kevin@kch42.de> | 2013-09-14 12:42:30 +0200 |
commit | 33c32f1e026482d60de635656a53de723114fcb7 (patch) | |
tree | 95a828ed57cd32769b2586143342caae15017025 /checkjobs.go | |
parent | d81063cc7986234a6b6276560fbd054a538d25cb (diff) | |
download | mailremind-33c32f1e026482d60de635656a53de723114fcb7.tar.gz mailremind-33c32f1e026482d60de635656a53de723114fcb7.tar.bz2 mailremind-33c32f1e026482d60de635656a53de723114fcb7.zip |
checkjobs (was checkmails) now recovers from panics
Diffstat (limited to 'checkjobs.go')
-rw-r--r-- | checkjobs.go | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/checkjobs.go b/checkjobs.go new file mode 100644 index 0000000..2b4af74 --- /dev/null +++ b/checkjobs.go @@ -0,0 +1,75 @@ +package main + +import ( + "bytes" + "fmt" + "kch42.de/gostuff/mailremind/model" + "log" + "time" +) + +var checkInterval int64 + +func initCheckjobs() { + var err error + if checkInterval, err = conf.GetInt("schedules", "checkInterval"); err != nil { + log.Fatalf("Could not read config schedules.checkInterval: %s", err) + } +} + +func checkjobs() { + timech := make(chan time.Time) + go func(ch chan time.Time) { + ticker := time.NewTicker(time.Duration(checkInterval) * time.Second) + + ch <- time.Now() + for t := range ticker.C { + ch <- t + } + }(timech) + + for t := range timech { + checkjobsOnce(t) + } +} + +func checkjobsOnce(t time.Time) { + defer func() { + if r := recover(); r != nil { + log.Printf("!! recovered from panic in checkjobsOnce: %s", r) + } + }() + + jobs := dbcon.JobsBefore(t) + + for _, job := range jobs { + if sendjob(job, t) { + next := job.Chronos().NextAfter(t) + if next.IsZero() { + if err := job.Delete(); err != nil { + log.Printf("Failed deleting job %s after job was done: %s", job.ID(), err) + } + } else { + if err := job.SetNext(next); err != nil { + log.Printf("Filed setting next for job %s: %s", job.ID(), err) + } + } + } + } +} + +func sendjob(job model.Job, t time.Time) bool { + user := job.User() + buf := new(bytes.Buffer) + + fmt.Fprintf(buf, "From: %s\n", MailFrom) + fmt.Fprintf(buf, "To: %s\n", user.Email()) + fmt.Fprintf(buf, "Subject: %s\n", job.Subject()) + fmt.Fprintf(buf, "Date: %s\n", t.In(user.Location()).Format(time.RFC1123Z)) + + fmt.Fprintln(buf, "") + + buf.Write(job.Content()) + + return Mail(user.Email(), MailFrom, buf.Bytes()) +} |