mirror of https://github.com/shunfei/cronsun
noticer: 发送邮件通知
parent
a715b16849
commit
48d8565690
|
@ -2,6 +2,7 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/cockroachdb/cmux"
|
"github.com/cockroachdb/cmux"
|
||||||
|
|
||||||
|
@ -33,6 +34,13 @@ func main() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
noticer, err := models.NewMail(10 * time.Second)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
go models.StartNoticer(noticer)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
err := httpServer.Serve(httpL)
|
err := httpServer.Serve(httpL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -49,6 +49,7 @@ type Conf struct {
|
||||||
Once string // 马上执行任务路径
|
Once string // 马上执行任务路径
|
||||||
Lock string // job lock 路径
|
Lock string // job lock 路径
|
||||||
Group string // 节点分组
|
Group string // 节点分组
|
||||||
|
Noticer string // 通知
|
||||||
|
|
||||||
Ttl int64 // 节点超时时间,单位秒
|
Ttl int64 // 节点超时时间,单位秒
|
||||||
ReqTimeout int // 请求超时时间,单位秒
|
ReqTimeout int // 请求超时时间,单位秒
|
||||||
|
@ -128,10 +129,13 @@ func (c *Conf) parse() error {
|
||||||
}
|
}
|
||||||
log.InitConf(c.Log)
|
log.InitConf(c.Log)
|
||||||
|
|
||||||
c.Cmd = cleanKeyPrefix(c.Cmd)
|
|
||||||
c.Node = cleanKeyPrefix(c.Node)
|
c.Node = cleanKeyPrefix(c.Node)
|
||||||
c.Proc = cleanKeyPrefix(c.Proc)
|
c.Proc = cleanKeyPrefix(c.Proc)
|
||||||
|
c.Cmd = cleanKeyPrefix(c.Cmd)
|
||||||
|
c.Once = cleanKeyPrefix(c.Once)
|
||||||
|
c.Lock = cleanKeyPrefix(c.Lock)
|
||||||
c.Group = cleanKeyPrefix(c.Group)
|
c.Group = cleanKeyPrefix(c.Group)
|
||||||
|
c.Noticer = cleanKeyPrefix(c.Noticer)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -185,7 +189,7 @@ func (c *Conf) reload() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// etcd key 选项需要重启
|
// etcd key 选项需要重启
|
||||||
cf.Node, cf.Proc, cf.Cmd, cf.Once, cf.Lock, cf.Group = c.Node, c.Proc, c.Cmd, c.Once, c.Lock, c.Group
|
cf.Node, cf.Proc, cf.Cmd, cf.Once, cf.Lock, cf.Group, cf.Noticer = c.Node, c.Proc, c.Cmd, c.Once, c.Lock, c.Group, c.Noticer
|
||||||
|
|
||||||
*c = *cf
|
*c = *cf
|
||||||
log.Noticef("config file[%s] reload success", *confFile)
|
log.Noticef("config file[%s] reload success", *confFile)
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
"Once": "/cronsun/once/",
|
"Once": "/cronsun/once/",
|
||||||
"Lock": "/cronsun/lock/",
|
"Lock": "/cronsun/lock/",
|
||||||
"Group": "/cronsun/group/",
|
"Group": "/cronsun/group/",
|
||||||
|
"Noticer": "/cronsun/noticer/",
|
||||||
"#Ttl": "节点超时时间,单位秒",
|
"#Ttl": "节点超时时间,单位秒",
|
||||||
"Ttl": 10,
|
"Ttl": 10,
|
||||||
"#ReqTimeout": "etcd 请求超时时间,单位秒",
|
"#ReqTimeout": "etcd 请求超时时间,单位秒",
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
package models
|
package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
client "github.com/coreos/etcd/clientv3"
|
||||||
"github.com/go-gomail/gomail"
|
"github.com/go-gomail/gomail"
|
||||||
|
|
||||||
"sunteng/commons/log"
|
"sunteng/commons/log"
|
||||||
|
@ -28,9 +31,25 @@ type Mail struct {
|
||||||
msgChan chan *Message
|
msgChan chan *Message
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMail() (m *Mail, err error) {
|
func NewMail(timeout time.Duration) (m *Mail, err error) {
|
||||||
cf := conf.Config.Mail
|
var (
|
||||||
sc, err := cf.Dialer.Dial()
|
sc gomail.SendCloser
|
||||||
|
done = make(chan struct{})
|
||||||
|
cf = conf.Config.Mail
|
||||||
|
)
|
||||||
|
|
||||||
|
// qq 邮箱的 Auth 出错后, 501 命令超时 2min 才能退出
|
||||||
|
go func() {
|
||||||
|
sc, err = cf.Dialer.Dial()
|
||||||
|
close(done)
|
||||||
|
}()
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-done:
|
||||||
|
case <-time.After(timeout):
|
||||||
|
err = fmt.Errorf("connect to smtp timeout")
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -47,6 +66,7 @@ func NewMail() (m *Mail, err error) {
|
||||||
|
|
||||||
func (m *Mail) Serve() {
|
func (m *Mail) Serve() {
|
||||||
var err error
|
var err error
|
||||||
|
sm := gomail.NewMessage()
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case msg := <-m.msgChan:
|
case msg := <-m.msgChan:
|
||||||
|
@ -59,7 +79,7 @@ func (m *Mail) Serve() {
|
||||||
m.open = true
|
m.open = true
|
||||||
}
|
}
|
||||||
|
|
||||||
sm := gomail.NewMessage()
|
sm.Reset()
|
||||||
sm.SetHeader("From", m.cf.Username)
|
sm.SetHeader("From", m.cf.Username)
|
||||||
sm.SetHeader("To", msg.To...)
|
sm.SetHeader("To", msg.To...)
|
||||||
sm.SetHeader("Subject", msg.Subject)
|
sm.SetHeader("Subject", msg.Subject)
|
||||||
|
@ -79,3 +99,26 @@ func (m *Mail) Serve() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Mail) Send(msg *Message) {
|
||||||
|
m.msgChan <- msg
|
||||||
|
}
|
||||||
|
|
||||||
|
func StartNoticer(n Noticer) {
|
||||||
|
go n.Serve()
|
||||||
|
rch := DefalutClient.Watch(conf.Config.Noticer, client.WithPrefix())
|
||||||
|
var err error
|
||||||
|
for wresp := range rch {
|
||||||
|
for _, ev := range wresp.Events {
|
||||||
|
switch {
|
||||||
|
case ev.IsCreate(), ev.IsModify():
|
||||||
|
msg := new(Message)
|
||||||
|
if err = json.Unmarshal(ev.Kv.Value, msg); err != nil {
|
||||||
|
log.Warnf("msg[%s] umarshal err: %s", string(ev.Kv.Value), err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
n.Send(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue