package main import ( "flag" "fmt" _ "github.com/TeaOSLab/EdgeCommon/pkg/langs/messages" "github.com/TeaOSLab/EdgeUser/internal/apps" teaconst "github.com/TeaOSLab/EdgeUser/internal/const" "github.com/TeaOSLab/EdgeUser/internal/gen" "github.com/TeaOSLab/EdgeUser/internal/nodes" "github.com/TeaOSLab/EdgeUser/internal/utils" _ "github.com/iwind/TeaGo/bootstrap" "github.com/iwind/TeaGo/maps" "github.com/iwind/gosock/pkg/gosock" "log" "os" "time" ) func main() { var app = apps.NewAppCmd(). Version(teaconst.Version). Product(teaconst.ProductName). Usage(teaconst.ProcessName+" [-v|start|stop|restart|service|daemon|upgrade]"). Usage(teaconst.ProcessName+" [env|prod]"). Option("-h", "show this help"). Option("-v", "show version"). Option("start", "start the service"). Option("stop", "stop the service"). Option("restart", "restart the service"). Option("service", "register service into systemd"). Option("daemon", "start the service with daemon"). Option("dev", "switch to 'dev' mode"). Option("prod", "switch to 'prod' mode"). Option("upgrade [--url=URL]", "upgrade from official site or an url"). Option("demo", "switch to demo mode") app.On("daemon", func() { nodes.NewUserNode().Daemon() }) app.On("service", func() { err := nodes.NewUserNode().InstallSystemService() if err != nil { fmt.Println("[ERROR]install failed: " + err.Error()) return } fmt.Println("done") }) app.On("generate", func() { err := gen.Generate() if err != nil { fmt.Println("generate failed: " + err.Error()) return } }) app.On("dev", func() { var env = "dev" var sock = gosock.NewTmpSock(teaconst.ProcessName) _, err := sock.Send(&gosock.Command{ Code: env, Params: nil, }) if err != nil { fmt.Println("failed to switch to '" + env + "': " + err.Error()) } else { fmt.Println("switch to '" + env + "' ok") } }) app.On("prod", func() { var env = "prod" var sock = gosock.NewTmpSock(teaconst.ProcessName) _, err := sock.Send(&gosock.Command{ Code: env, Params: nil, }) if err != nil { fmt.Println("failed to switch to '" + env + "': " + err.Error()) } else { fmt.Println("switch to '" + env + "' ok") } }) app.On("upgrade", func() { var downloadURL = "" var flagSet = flag.NewFlagSet("", flag.ContinueOnError) flagSet.StringVar(&downloadURL, "url", "", "new version download url") _ = flagSet.Parse(os.Args[2:]) var manager = utils.NewUpgradeManager("user", downloadURL) log.Println("checking latest version ...") var ticker = time.NewTicker(1 * time.Second) go func() { var lastProgress float32 = 0 var isStarted = false for range ticker.C { if manager.IsDownloading() { if !isStarted { log.Println("start downloading v" + manager.NewVersion() + " ...") isStarted = true } var progress = manager.Progress() if progress >= 0 { if progress == 0 || progress == 1 || progress-lastProgress >= 0.1 { lastProgress = progress log.Printf("%.2f%%", manager.Progress()*100) } } } else { break } } }() err := manager.Start() if err != nil { log.Println("upgrade failed: " + err.Error()) return } log.Println("finished!") log.Println("restarting ...") app.RunRestart() }) app.On("demo", func() { var sock = gosock.NewTmpSock(teaconst.ProcessName) if !sock.IsListening() { fmt.Println("[ERROR]the service not started yet, you should start the service first") return } reply, err := sock.Send(&gosock.Command{Code: "demo"}) if err != nil { fmt.Println("[ERROR]change demo mode failed: " + err.Error()) return } var isDemo = maps.NewMap(reply.Params).GetBool("isDemo") if isDemo { fmt.Println("change demo mode to: on") } else { fmt.Println("change demo mode to: off") } }) app.Run(func() { var userNode = nodes.NewUserNode() userNode.Run() }) }