-
Notifications
You must be signed in to change notification settings - Fork 0
/
cmd_add.go
111 lines (97 loc) · 2.39 KB
/
cmd_add.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
package main
import (
"net"
"github.com/etcdhosts/client-go"
"github.com/muesli/reflow/indent"
tea "github.com/charmbracelet/bubbletea"
"github.com/urfave/cli/v2"
)
func addCmd() *cli.Command {
return &cli.Command{
Name: "add",
Usage: "Add a DNS record",
UsageText: "add HOST IP",
Action: func(c *cli.Context) error {
if c.NArg() != 2 || net.ParseIP(c.Args().Get(1)) == nil {
cli.ShowCommandHelpAndExit(c, c.Command.Name, 1)
}
return tea.NewProgram(addMode{ctx: c, stages: 5}).Start()
},
}
}
type addMode struct {
ctx *cli.Context
hc *client.Client
hf *client.HostsFile
stages int
stageMsg string
progress float64
loaded bool
}
func (m addMode) Init() tea.Cmd {
return nil
}
// The main view, which just calls the approprate sub-view
func (m addMode) View() string {
return indent.String("\n"+m.stageMsg, 2) + indent.String("\n"+progressbar(cmdProgressBarWidth, m.progress)+"%"+"\n\n", 2)
}
// Main update function.
func (m addMode) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
// Make sure these keys always quit
if msg, ok := msg.(tea.KeyMsg); ok {
k := msg.String()
if k == "q" || k == "esc" || k == "ctrl+c" {
return m, tea.Quit
}
}
var err error
var stage int
switch msg.(type) {
case int:
stage = msg.(int)
default:
return m, func() tea.Msg { return stage }
}
switch stage {
case 0:
m.stageMsg = makeInfo("Create etcdhosts client...")
m.hc, err = createClient(m.ctx)
if err != nil {
m.stageMsg = makeError("ERROR: " + err.Error())
return m, tea.Quit
}
case 1:
m.stageMsg = makeInfo("Read hostsfile from etcd...")
m.hf, err = m.hc.ReadHostsFile()
if err != nil {
m.stageMsg = makeError("ERROR: " + err.Error())
return m, tea.Quit
}
case 2:
m.stageMsg = makeInfo("Add host to hostsfile...")
err = m.hf.AddHost(m.ctx.Args().Get(0), m.ctx.Args().Get(1))
if err != nil {
m.stageMsg = makeError("ERROR: " + err.Error())
return m, tea.Quit
}
case 3:
m.stageMsg = makeInfo("Put hostsfile into etcd...")
err = m.hc.PutHostsFile(m.hf)
if err != nil {
m.stageMsg = makeError("ERROR: " + err.Error())
return m, tea.Quit
}
case 4:
m.stageMsg = makeInfo("DNS records add success...")
}
stage++
if !m.loaded {
m.progress += float64(1) / float64(m.stages)
if m.progress >= 1 {
m.progress = 1
m.loaded = true
return m, tea.Quit
}
}
return m, func() tea.Msg { return stage }
}