summaryrefslogtreecommitdiff
path: root/checkjobs.go
diff options
context:
space:
mode:
authorKevin Chabowski <kevin@kch42.de>2013-09-14 12:42:30 +0200
committerKevin Chabowski <kevin@kch42.de>2013-09-14 12:42:30 +0200
commit33c32f1e026482d60de635656a53de723114fcb7 (patch)
tree95a828ed57cd32769b2586143342caae15017025 /checkjobs.go
parentd81063cc7986234a6b6276560fbd054a538d25cb (diff)
downloadmailremind-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.go75
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())
+}