143 lines
3.5 KiB
Go
143 lines
3.5 KiB
Go
//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()
|
|
})
|
|
}
|