Merge branch 'master' of github.com:shunfei/cronsun into develop

pull/69/head
Doflatango 2018-03-06 14:17:28 +08:00
commit f52cc9d1bd
10 changed files with 68 additions and 34 deletions

View File

@ -53,7 +53,7 @@ We encourage you to try it, it's easy to use, see how it works for you. We belie
"users": [
"www", "db"
],
"#ext": "allowed execution file extension",
"#ext": "allowed execution file extensions",
"ext": [
".cron.sh", ".cron.py"
]
@ -66,11 +66,13 @@ We encourage you to try it, it's easy to use, see how it works for you. We belie
Install from binary [latest release](https://github.com/shunfei/cronsun/releases/latest)
Or build from source, require `go >= 1.9+`
Or build from source ([feature/glide](https://github.com/shunfei/cronsun/tree/feature/glide)), require `go >= 1.9+`, [glide](https://glide.sh/)
```
go get -u github.com/shunfei/cronsun
cd $GOPATH/src/github.com/shunfei/cronsun
git checkout feature/glide
glide update
sh build.sh
```
@ -78,9 +80,9 @@ sh build.sh
1. Install [MongoDB](http://docs.mongodb.org/manual/installation/)
2. Install [etcd3](https://github.com/coreos/etcd)
3. Modify config in `conf` dir
4. Start Node: `./cronnode -conf conf/base.json`, start Web: `./cronweb -conf conf/base.json`
5. Opne `http://127.0.0.1:7079/ui/` with the browser
3. Open and update Etcd(`conf/etcd.json`) and MongoDB(`conf/db.json`) configurations
4. Start cronnode: `./cronnode -conf conf/base.json`, start cronweb: `./cronweb -conf conf/base.json`
5. Open `http://127.0.0.1:7079` in browser
## Screenshot

View File

@ -61,7 +61,7 @@ func main() {
if len(conf.Config.Mail.HttpAPI) > 0 {
noticer = &cronsun.HttpAPI{}
} else {
mailer, err := cronsun.NewMail(10 * time.Second)
mailer, err := cronsun.NewMail(30 * time.Second)
if err != nil {
log.Errorf(err.Error())
return

View File

@ -22,7 +22,7 @@ type Client struct {
}
func NewClient(cfg *conf.Conf) (c *Client, err error) {
cli, err := client.New(cfg.Etcd)
cli, err := client.New(cfg.Etcd.Copy())
if err != nil {
return
}
@ -86,6 +86,12 @@ func (c *Client) Grant(ttl int64) (*client.LeaseGrantResponse, error) {
return c.Client.Grant(ctx, ttl)
}
func (c *Client) Revoke(id client.LeaseID) (*client.LeaseRevokeResponse, error) {
ctx, cancel := context.WithTimeout(context.Background(), c.reqTimeout)
defer cancel()
return c.Client.Revoke(ctx, id)
}
func (c *Client) KeepAliveOnce(id client.LeaseID) (*client.LeaseKeepAliveResponse, error) {
ctx, cancel := NewEtcdTimeoutContext(c)
defer cancel()

View File

@ -62,7 +62,7 @@ type Conf struct {
// 默认 300
LockTtl int64
Etcd client.Config
Etcd *etcdConfig
Mgo *db.Config
Web *webConfig
Mail *MailConf
@ -70,6 +70,19 @@ type Conf struct {
Security *Security
}
type etcdConfig struct {
Endpoints []string
Username string
Password string
DialTimeout int64 // 单位秒
conf client.Config
}
func (e *etcdConfig) Copy() client.Config {
return e.conf
}
type webConfig struct {
BindAddr string
Auth struct {
@ -130,8 +143,12 @@ func (c *Conf) parse(confFile string) error {
}
if c.Etcd.DialTimeout > 0 {
c.Etcd.DialTimeout *= time.Second
c.Etcd.conf.DialTimeout = time.Duration(c.Etcd.DialTimeout) * time.Second
}
c.Etcd.conf.Username = c.Etcd.Username
c.Etcd.conf.Password = c.Etcd.Password
c.Etcd.conf.Endpoints = c.Etcd.Endpoints
if c.Ttl <= 0 {
c.Ttl = 10
}

View File

@ -3,12 +3,14 @@
"To": ["na@nb.com"],
"#HttpAPI": "如有此字段,则按 http api 方式发送",
"#Keepalive": "如果此时间段内没有邮件发送,则关闭 SMTP 连接,单位/秒",
"Keepalive": 30,
"Keepalive": 60,
"#doc": "https://godoc.org/github.com/go-gomail/gomail#Dialer",
"Host": "smtp.exmail.qq.com",
"Port": 25,
"Username": "sendmail@nb.com",
"Password": "nbhh",
"SSL": false,
"LocalName": "sendmail@nb.com"
"#LocalName": "LocalName is the hostname sent to the SMTP server with the HELO command.",
"#LocalName": "By default, "localhost" is sent.",
"LocalName": "localhost"
}

5
job.go
View File

@ -119,8 +119,8 @@ func (l *locker) unlock() {
close(l.done)
l.timer.Stop()
if _, err := DefalutClient.KeepAliveOnce(l.lID); err != nil {
log.Warnf("unlock keep alive err: %s", err.Error())
if _, err := DefalutClient.Revoke(l.lID); err != nil {
log.Warnf("unlock revoke err: %s", err.Error())
}
}
@ -307,6 +307,7 @@ func (rule *JobRule) Valid() error {
return nil
}
// Note: this function did't check the job.
func GetJob(group, id string) (job *Job, err error) {
job, _, err = GetJobAndRev(group, id)
return

View File

@ -332,6 +332,13 @@ func (n *Node) groupAddNode(g *cronsun.Group) {
n.link.delGroupJob(g.ID, jid)
continue
}
if err = job.Valid(); err != nil {
log.Warnf("invalid job[%s][%s]: %s", jl.gname, jid, err.Error())
n.link.delGroupJob(g.ID, jid)
continue
}
job.Init(n.ID, n.Hostname)
}

View File

@ -94,9 +94,8 @@ func (m *Mail) Serve() {
if m.open {
if err = m.sc.Close(); err != nil {
log.Warnf("close smtp server err: %s", err.Error())
} else {
m.open = false
}
m.open = false
}
m.timer.Reset(time.Duration(m.cf.Keepalive) * time.Second)
}

File diff suppressed because one or more lines are too long

View File

@ -53,14 +53,14 @@ export default {
data: function(){
return {
log: {
id: 'sdfas',
jobId: 'wewe',
jobGroup: 'test',
name: 'run run run',
node: '192.168.1.2',
id: '',
jobId: '',
jobGroup: '',
name: '',
node: '',
user: '',
command: 'echo hello;',
output: 'hello',
command: '',
output: '',
exitCode: 0,
beginTime: new Date(),
endTime: new Date()
@ -72,7 +72,7 @@ export default {
computed: {
printResult(){
return this.log.output.replace("\r\n", "^M\r\n");
return this.log.output ? this.log.output.replace("\r\n", "^M\r\n") : '';
}
},