//go:build plus package main import ( "flag" "fmt" "github.com/TeaOSLab/EdgeDNS/internal/apps" "github.com/TeaOSLab/EdgeDNS/internal/configs" teaconst "github.com/TeaOSLab/EdgeDNS/internal/const" "github.com/TeaOSLab/EdgeDNS/internal/nodes" "github.com/TeaOSLab/EdgeDNS/internal/utils" "github.com/iwind/TeaGo/Tea" _ "github.com/iwind/TeaGo/bootstrap" "github.com/iwind/TeaGo/logs" "github.com/iwind/gosock/pkg/gosock" "net/http" _ "net/http/pprof" "os" "path/filepath" "time" ) func main() { var app = apps.NewAppCmd(). Version(teaconst.Version). Product(teaconst.ProductName). Usage(teaconst.ProcessName + " [-v|start|stop|restart|service|daemon|pprof|gc|uninstall]") app.On("start:before", func() { // validate config _, err := configs.LoadAPIConfig() if err != nil { fmt.Println("[ERROR]start failed: load api config from '" + Tea.ConfigFile(configs.ConfigFileName) + "' failed: " + err.Error()) os.Exit(0) } }) app.On("test", func() { err := nodes.NewDNSNode().Test() if err != nil { _, _ = os.Stderr.WriteString(err.Error()) } }) app.On("daemon", func() { nodes.NewDNSNode().Daemon() }) app.On("service", func() { err := nodes.NewDNSNode().InstallSystemService() if err != nil { fmt.Println("[ERROR]install failed: " + err.Error()) return } fmt.Println("done") }) app.On("pprof", func() { var flagSet = flag.NewFlagSet("pprof", flag.ExitOnError) var addr string flagSet.StringVar(&addr, "addr", "", "") _ = flagSet.Parse(os.Args[2:]) if len(addr) == 0 { addr = "127.0.0.1:6060" } logs.Println("starting with pprof '" + addr + "'...") go func() { err := http.ListenAndServe(addr, nil) if err != nil { logs.Println("[ERROR]" + err.Error()) } }() var node = nodes.NewDNSNode() node.Start() }) app.On("gc", func() { var sock = gosock.NewTmpSock(teaconst.ProcessName) _, err := sock.Send(&gosock.Command{Code: "gc"}) if err != nil { fmt.Println("[ERROR]" + err.Error()) } else { fmt.Println("ok") } }) app.On("uninstall", func() { // service fmt.Println("Uninstall service ...") var manager = utils.NewServiceManager(teaconst.ProcessName, teaconst.ProductName) go func() { _ = manager.Uninstall() }() // stop fmt.Println("Stopping ...") _, _ = gosock.NewTmpSock(teaconst.ProcessName).SendTimeout(&gosock.Command{Code: "stop"}, 1*time.Second) // delete files var exe, _ = os.Executable() if len(exe) == 0 { return } var dir = filepath.Dir(filepath.Dir(exe)) // ROOT / bin / exe // verify dir { fmt.Println("Checking '" + dir + "' ...") for _, subDir := range []string{"bin/" + filepath.Base(exe), "configs", "logs"} { _, err := os.Stat(dir + "/" + subDir) if err != nil { fmt.Println("[ERROR]program directory structure has been broken, please remove it manually.") return } } fmt.Println("Removing '" + dir + "' ...") err := os.RemoveAll(dir) if err != nil { fmt.Println("[ERROR]remove failed: " + err.Error()) } } // delete symbolic links fmt.Println("Removing symbolic links ...") _ = os.Remove("/usr/bin/" + teaconst.ProcessName) _ = os.Remove("/var/log/" + teaconst.ProcessName) // delete configs // nothing to delete for EdgeDNS // delete sock fmt.Println("Removing temporary files ...") var tempDir = os.TempDir() _ = os.Remove(tempDir + "/" + teaconst.ProcessName + ".sock") // done fmt.Println("[DONE]") }) app.Run(func() { var node = nodes.NewDNSNode() node.Start() }) }