/
main.go
80 lines (66 loc) · 1.76 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package main
import (
dkr "github.com/jeffjen/docker-monitor/docker"
up "github.com/jeffjen/docker-monitor/upkeep"
web "github.com/jeffjen/docker-monitor/web"
disc "github.com/jeffjen/go-discovery"
dcli "github.com/jeffjen/go-discovery/cli"
scli "github.com/jeffjen/go-message/push/slack/cli"
log "github.com/Sirupsen/logrus"
cli "github.com/codegangsta/cli"
"os"
"path"
)
const (
DiscoveryPath = "/docker/swarm/nodes"
)
func main() {
app := cli.NewApp()
app.Name = "docker-monitor"
app.Usage = "Monitor docker events and report to discovery service"
app.Authors = []cli.Author{
cli.Author{"Yi-Hung Jen", "yihungjen@gmail.com"},
}
app.Flags = NewFlag()
app.Action = Monitor
app.Run(os.Args)
}
func Monitor(ctx *cli.Context) {
var (
addr = ctx.String("addr")
idle = ctx.Bool("idle")
stop = make(chan struct{}, 1)
)
// setup register path for discovery
disc.RegisterPath = path.Join(ctx.String("cluster"), DiscoveryPath)
if err := dcli.Before(ctx); err != nil {
if err == dcli.ErrRequireDiscovery {
log.WithFields(log.Fields{"err": err}).Warning("discovery feature disabled")
} else {
log.WithFields(log.Fields{"err": err}).Fatal("halt")
}
}
if err := scli.Before(ctx); err != nil {
log.Error(err)
os.Exit(1)
}
// setup service upkeep
up.Init(ctx.Bool("persist"), scli.DefaultSlack)
if addr != "" {
log.WithFields(log.Fields{"addr": addr}).Info("API endpoint begin")
go web.RunAPIEndpoint(addr, stop)
} else {
log.Warning("API endpoint disabled")
}
if !idle {
log.Info("Track container life cycle")
go dkr.RunDockerEvent(stop)
} else {
log.Warning("docker event endpoint disabled")
}
if addr != "" || !idle {
<-stop // we should never reach pass this point
} else {
log.Warning("nothing to do; quit now")
}
}