-
-
Notifications
You must be signed in to change notification settings - Fork 103
Expand file tree
/
Copy pathmain.go
More file actions
145 lines (132 loc) · 3.89 KB
/
main.go
File metadata and controls
145 lines (132 loc) · 3.89 KB
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package main
import (
"fmt"
"net/http"
_ "net/http/pprof"
"os"
"runtime/debug"
"strconv"
"strings"
"time"
tea "charm.land/bubbletea/v2"
"github.com/jessevdk/go-flags"
"github.com/moncho/dry/app"
"github.com/moncho/dry/appui"
"github.com/moncho/dry/docker"
"github.com/moncho/dry/version"
log "github.com/sirupsen/logrus"
)
// options dry's flags
type options struct {
Description bool `short:"d" long:"description" description:"Shows the description"`
MonitorMode string `short:"m" long:"monitor" description:"Starts in monitor mode, given value (if any) is the refresh rate" optional:"yes" optional-value:"500"`
// enable profiling
Profile bool `short:"p" long:"profile" description:"Enable profiling"`
Version bool `short:"v" long:"version" description:"Dry version"`
Splash int `short:"w" long:"splash" description:"Show loading screen for N seconds (max 10)" default:"0"`
Theme string `short:"T" long:"theme" description:"Color theme (dark, light)" default:"dark"`
Workspace bool `long:"workspace" description:"Enable experimental Phase 1 workspace layout"`
// Docker-related properties
DockerHost string `short:"H" long:"docker_host" description:"Docker Host"`
DockerCertPath string `short:"c" long:"docker_certpath" description:"Docker cert path"`
DockerTLSVerify string `short:"t" long:"docker_tls" description:"Docker TLS verify"`
}
func config(opts options) (app.Config, error) {
var cfg app.Config
if opts.DockerHost == "" {
if os.Getenv("DOCKER_HOST") == "" {
log.Printf(
"No DOCKER_HOST env variable found and no Host parameter was given, connecting to %s",
docker.DefaultDockerHost)
cfg.DockerHost = docker.DefaultDockerHost
} else {
cfg.DockerHost = os.Getenv("DOCKER_HOST")
cfg.DockerTLSVerify = getBool(os.Getenv("DOCKER_TLS_VERIFY"))
cfg.DockerCertPath = os.Getenv("DOCKER_CERT_PATH")
}
} else {
cfg.DockerHost = opts.DockerHost
cfg.DockerTLSVerify = getBool(opts.DockerTLSVerify)
cfg.DockerCertPath = opts.DockerCertPath
}
if opts.Splash > 0 {
if opts.Splash > 10 {
opts.Splash = 10
}
cfg.SplashDuration = time.Duration(opts.Splash) * time.Second
}
if opts.MonitorMode != "" {
cfg.MonitorMode = true
refreshRate, err := strconv.Atoi(opts.MonitorMode)
if err != nil {
return cfg, fmt.Errorf("invalid refresh rate %s: %w", opts.MonitorMode, err)
}
cfg.MonitorRefreshRate = refreshRate
}
cfg.WorkspaceMode = opts.Workspace
return cfg, nil
}
// getBool returns false if the given string looks like you mean
// false, true otherwise.
func getBool(key string) bool {
s := strings.ToLower(strings.Trim(key, " "))
if s == "" || s == "0" || s == "no" || s == "false" || s == "none" {
return false
}
return true
}
func main() {
defer func() {
if r := recover(); r != nil {
log.Printf("Dry panicked: %v", r)
log.Error(string(debug.Stack()))
os.Exit(1)
}
}()
// parse flags
var opts options
parser := flags.NewParser(&opts, flags.Default)
_, err := parser.Parse()
if err != nil {
flagError := err.(*flags.Error)
if flagError.Type == flags.ErrHelp {
return
}
if flagError.Type == flags.ErrUnknownFlag {
log.Print("Use --help to view all available options.")
return
}
log.Printf("Could not parse flags: %s", err)
return
}
if opts.Description {
fmt.Print(app.ShortHelp)
return
}
if opts.Version {
fmt.Printf("dry version %s, build %s", version.VERSION, version.GITCOMMIT)
return
}
// Start profiling (if required)
if opts.Profile {
go func() {
log.Fatal(http.ListenAndServe("localhost:6060", nil))
}()
}
cfg, err := config(opts)
if err != nil {
log.Println(err.Error())
return
}
if !appui.SetThemeByName(opts.Theme) {
log.Printf("Unknown theme %q, valid options: dark, light", opts.Theme)
return
}
appui.InitStyles()
m := app.NewModel(cfg)
p := tea.NewProgram(m)
if _, err := p.Run(); err != nil {
log.Printf("Error running dry: %s", err)
os.Exit(1)
}
}