/
cmd_edit.go
78 lines (70 loc) · 1.42 KB
/
cmd_edit.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
package main
import (
"bytes"
"fmt"
"io/ioutil"
"os"
"os/exec"
"runtime"
"github.com/etcdhosts/client-go"
"github.com/mritd/logger"
"github.com/urfave/cli/v2"
)
func editCmd() *cli.Command {
return &cli.Command{
Name: "edit",
Usage: "Edit the hosts file with an editor",
Action: func(c *cli.Context) error {
f, err := ioutil.TempFile("", "dnsctl")
if err != nil {
return err
}
defer func() {
_ = f.Close()
_ = os.Remove(f.Name())
}()
hc, err := createClient(c)
if err != nil {
return err
}
hf, err := hc.ReadHostsFile()
if err != nil {
return err
}
_, err = fmt.Fprint(f, hf.String())
if err != nil {
return err
}
// get os editor
editor := "vim"
if runtime.GOOS == "windows" {
editor = "notepad"
}
if v := os.Getenv("VISUAL"); v != "" {
editor = v
} else if e := os.Getenv("EDITOR"); e != "" {
editor = e
}
cmd := exec.Command(editor, f.Name())
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err = cmd.Run()
if err != nil {
return err
}
raw, err := ioutil.ReadFile(f.Name())
if err != nil {
return err
}
hm := client.Parse2Map(bytes.NewReader(raw))
if hm.String() == hf.String() {
logger.Info("DNS records not change.")
return nil
} else {
logger.Info("DNS records updated.")
return hc.ForcePutHostsFile(bytes.NewReader(raw))
}
},
}
}