/
main.go
113 lines (102 loc) · 2.99 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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package main
import (
"context"
"fmt"
"os"
"os/signal"
"strings"
"syscall"
"github.com/zefhemel/kingpin"
"github.com/egnyte/ax/pkg/backend/cloudwatch"
"github.com/egnyte/ax/pkg/backend/common"
"github.com/egnyte/ax/pkg/backend/docker"
"github.com/egnyte/ax/pkg/backend/kibana"
"github.com/egnyte/ax/pkg/backend/stackdriver"
"github.com/egnyte/ax/pkg/backend/stream"
"github.com/egnyte/ax/pkg/backend/subprocess"
"github.com/egnyte/ax/pkg/config"
)
var (
queryCommand = kingpin.Command("query", "Query logs").Default()
alertCommand = kingpin.Command("alert", "Be alerted when logs match a query")
alertDCommand = kingpin.Command("alertd", "Be alerted when logs match a query")
versionCommand = kingpin.Command("version", "Show the ax version")
upgrade = kingpin.Command("upgrade", "Upgrade Ax if a new version is available")
addAlertCommand = alertCommand.Command("add", "Add new alert")
version = "dev"
versionFlag = kingpin.Version(version)
)
func determineClient(em config.EnvMap) common.Client {
stat, _ := os.Stdin.Stat()
var client common.Client
if (stat.Mode() & os.ModeCharDevice) == 0 {
client = stream.New(os.Stdin)
} else {
switch em["backend"] {
case "docker":
client = docker.New(em["pattern"])
case "kibana":
client = kibana.New(em["url"], em["auth"], em["index"])
case "cloudwatch":
client = cloudwatch.New(em["accesskey"], em["accesssecretkey"], em["region"], em["groupname"])
case "stackdriver":
client = stackdriver.New(em["credentials"], em["project"], em["log"])
case "subprocess":
client = subprocess.New(strings.Split(em["command"], " "))
}
}
return client
}
func sigtermContextHandler(ctx context.Context) context.Context {
ctx, cancel := context.WithCancel(ctx)
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
switch <-c {
case os.Interrupt:
fmt.Println("Canceled through SIGINT (Ctrl-C)")
case syscall.SIGTERM:
fmt.Println("Canceled through SIGTERM")
}
cancel()
}()
return ctx
}
func main() {
cmd := kingpin.Parse()
rc := config.BuildConfig()
client := determineClient(rc.Env)
switch cmd {
case "query":
ctx := sigtermContextHandler(context.Background())
if client == nil {
if len(rc.Config.Environments) == 0 {
// Assuming first time use
fmt.Println("Welcome to ax! It looks like this is the first time running, so let's start with creating a new environment.")
config.AddEnv()
return
}
fmt.Println("No default environment set, please use the --env flag to set one. Exiting.")
return
}
queryMain(ctx, rc, client)
case "env add":
config.AddEnv()
case "env list":
config.ListEnvs()
case "env edit":
config.EditConfig()
case "alert add":
addAlertMain(rc, client)
case "alertd":
alertMain(context.Background(), rc)
case "version":
println(version)
case "upgrade":
if err := upgradeVersion(); err != nil {
fmt.Println("Upgrade failed.")
} else {
fmt.Println("Upgrade has been completed successfully.")
}
}
}