diff --git a/cmd/edge-node/main.go b/cmd/edge-node/main.go index 0a1e94c..d3fb630 100644 --- a/cmd/edge-node/main.go +++ b/cmd/edge-node/main.go @@ -7,6 +7,7 @@ import ( "github.com/TeaOSLab/EdgeNode/internal/apps" teaconst "github.com/TeaOSLab/EdgeNode/internal/const" "github.com/TeaOSLab/EdgeNode/internal/nodes" + "github.com/TeaOSLab/EdgeNode/internal/utils" fsutils "github.com/TeaOSLab/EdgeNode/internal/utils/fs" _ "github.com/iwind/TeaGo/bootstrap" "github.com/iwind/TeaGo/logs" @@ -17,17 +18,77 @@ import ( "net/http" _ "net/http/pprof" "os" + "path/filepath" "sort" + "time" ) func main() { var app = apps.NewAppCmd(). Version(teaconst.Version). Product(teaconst.ProductName). - Usage(teaconst.ProcessName + " [-v|start|stop|restart|status|quit|test|reload|service|daemon|pprof|accesslog]"). - Usage(teaconst.ProcessName + " [trackers|goman|conns|gc]"). + Usage(teaconst.ProcessName + " [-v|start|stop|restart|status|quit|test|reload|service|daemon|pprof|accesslog|uninstall]"). + Usage(teaconst.ProcessName + " [trackers|goman|conns|gc|bandwidth|disk]"). Usage(teaconst.ProcessName + " [ip.drop|ip.reject|ip.remove|ip.close] IP") + 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", "configs/api.yaml", "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 EdgeNode + + // delete sock + fmt.Println("Removing temporary files ...") + var tempDir = os.TempDir() + _ = os.Remove(tempDir + "/" + teaconst.ProcessName + ".sock") + _ = os.Remove(tempDir + "/" + teaconst.AccessLogSockName) + + // cache ... + fmt.Println("Please delete cache directories by yourself.") + + // done + fmt.Println("[DONE]") + }) app.On("test", func() { err := nodes.NewNode().Test() if err != nil { diff --git a/internal/utils/dbs/db.go b/internal/utils/dbs/db.go index 3736a07..ad1baad 100644 --- a/internal/utils/dbs/db.go +++ b/internal/utils/dbs/db.go @@ -12,7 +12,6 @@ import ( "github.com/TeaOSLab/EdgeNode/internal/remotelogs" "github.com/TeaOSLab/EdgeNode/internal/utils/fs" _ "github.com/mattn/go-sqlite3" - "net/url" "strings" "sync" "time" @@ -202,12 +201,12 @@ func (this *DB) Close() error { }() // print log - if len(this.dsn) > 0 { + /**if len(this.dsn) > 0 { u, _ := url.Parse(this.dsn) if u != nil && len(u.Path) > 0 { remotelogs.Debug("DB", "close '"+u.Path) } - } + }**/ return this.rawDB.Close() } diff --git a/internal/utils/service_linux.go b/internal/utils/service_linux.go index aa1ae90..7981966 100644 --- a/internal/utils/service_linux.go +++ b/internal/utils/service_linux.go @@ -62,10 +62,10 @@ func (this *ServiceManager) Uninstall() error { } // disable service - exec.Command(systemd, "disable", teaconst.SystemdServiceName+".service").Start() + _ = exec.Command(systemd, "disable", teaconst.SystemdServiceName+".service").Start() // reload - exec.Command(systemd, "daemon-reload") + _ = exec.Command(systemd, "daemon-reload").Start() return files.NewFile(systemdServiceFile).Delete() } @@ -149,7 +149,7 @@ WantedBy=multi-user.target` executils.NewTimeoutCmd(30*time.Second, systemd, "stop", shortName+".service") // reload - executils.NewTimeoutCmd(30*time.Second, systemd, "daemon-reload") + _ = executils.NewTimeoutCmd(30*time.Second, systemd, "daemon-reload").Start() // enable var cmd = executils.NewTimeoutCmd(30*time.Second, systemd, "enable", shortName+".service")