From 7686af39e0483b771a6f1fcd307a87443ae140b7 Mon Sep 17 00:00:00 2001 From: TenderIronh Date: Tue, 4 Jan 2022 15:34:29 +0800 Subject: [PATCH] Improve update mechanism --- config.go | 14 +++++++++----- daemon.go | 3 +-- handlepush.go | 48 +++++++++++++++++++++++++++++++++--------------- openp2p.go | 24 +++++++++++++++++------- protocol.go | 2 +- update.go | 16 +--------------- 6 files changed, 62 insertions(+), 45 deletions(-) diff --git a/config.go b/config.go index 0c3f881..cafa16b 100644 --- a/config.go +++ b/config.go @@ -9,6 +9,8 @@ import ( var gConf Config +const IntValueNotSet int = -99999999 + type AppConfig struct { // required AppName string @@ -31,11 +33,11 @@ type AppConfig struct { // TODO: add loglevel, maxlogfilesize type Config struct { - Network NetworkConfig `json:"network"` - Apps []AppConfig `json:"apps"` - daemonMode bool - logLevel int - mtx sync.Mutex + Network NetworkConfig `json:"network"` + Apps []AppConfig `json:"apps"` + LogLevel int + + mtx sync.Mutex } func (c *Config) add(app AppConfig) { @@ -78,6 +80,8 @@ func (c *Config) save() { func (c *Config) load() error { c.mtx.Lock() + c.LogLevel = IntValueNotSet + c.Network.ShareBandwidth = IntValueNotSet defer c.mtx.Unlock() data, err := ioutil.ReadFile("config.json") if err != nil { diff --git a/daemon.go b/daemon.go index 459882b..e34c4f3 100644 --- a/daemon.go +++ b/daemon.go @@ -62,7 +62,6 @@ func (d *daemon) run() { break } } - args = append(args, "-bydaemon") for { // start worker gLog.Println(LevelINFO, "start worker process") @@ -130,7 +129,7 @@ func install() { logLevel := installFlag.Int("loglevel", 1, "0:debug 1:info 2:warn 3:error") installFlag.Parse(os.Args[2:]) checkParams(*node, *user, *password) - gConf.logLevel = *logLevel + gConf.LogLevel = *logLevel gConf.Network.ServerHost = *serverHost gConf.Network.User = *user gConf.Network.Node = *node diff --git a/handlepush.go b/handlepush.go index fca4890..f6cb495 100644 --- a/handlepush.go +++ b/handlepush.go @@ -6,6 +6,10 @@ import ( "encoding/json" "fmt" "os" + "os/exec" + "path/filepath" + "runtime" + "syscall" "time" ) @@ -89,10 +93,23 @@ func handlePush(pn *P2PNetwork, subType uint16, msg []byte) error { }(req) case MsgPushUpdate: - update() - if gConf.daemonMode { - os.Exit(0) + targetPath := filepath.Join(defaultInstallPath, defaultBinName) + args := []string{"update"} + env := os.Environ() + // Windows does not support exec syscall. + if runtime.GOOS == "windows" { + cmd := exec.Command(targetPath, args...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.Stdin = os.Stdin + cmd.Env = env + err := cmd.Run() + if err == nil { + os.Exit(0) + } + return err } + return syscall.Exec(targetPath, args, env) case MsgPushReportApps: gLog.Println(LevelINFO, "MsgPushReportApps") req := ReportApps{} @@ -144,22 +161,23 @@ func handlePush(pn *P2PNetwork, subType uint16, msg []byte) error { gLog.Printf(LevelERROR, "wrong MsgPushEditApp:%s %s", err, string(msg[openP2PHeaderSize:])) return err } - var config AppConfig + var oldConf AppConfig // protocol0+srcPort0 exist, delApp - config.AppName = newApp.AppName - config.Protocol = newApp.Protocol0 - config.SrcPort = newApp.SrcPort0 - config.PeerNode = newApp.PeerNode - config.DstHost = newApp.DstHost - config.DstPort = newApp.DstPort + oldConf.AppName = newApp.AppName + oldConf.Protocol = newApp.Protocol0 + oldConf.SrcPort = newApp.SrcPort0 + oldConf.PeerNode = newApp.PeerNode + oldConf.DstHost = newApp.DstHost + oldConf.DstPort = newApp.DstPort - gConf.delete(config) + gConf.delete(oldConf) // AddApp - config.Protocol = newApp.Protocol - config.SrcPort = newApp.SrcPort - gConf.add(config) + newConf := oldConf + newConf.Protocol = newApp.Protocol + newConf.SrcPort = newApp.SrcPort + gConf.add(newConf) gConf.save() - pn.DeleteApp(config) // save quickly for the next request reportApplist + pn.DeleteApp(oldConf) // save quickly for the next request reportApplist // autoReconnect will auto AddApp // pn.AddApp(config) // TODO: report result diff --git a/openp2p.go b/openp2p.go index e168e36..6cd626e 100644 --- a/openp2p.go +++ b/openp2p.go @@ -14,6 +14,7 @@ func main() { binDir := filepath.Dir(os.Args[0]) os.Chdir(binDir) // for system service gLog = InitLogger(binDir, "openp2p", LevelDEBUG, 1024*1024, LogFileAndConsole) + // TODO: install sub command, deamon process // groups := flag.String("groups", "", "you could join in several groups. like: GroupName1:Password1;GroupName2:Password2; group name 8-31 characters") if len(os.Args) > 1 { @@ -26,7 +27,7 @@ func main() { update() targetPath := filepath.Join(defaultInstallPath, defaultBinName) d := daemon{} - err := d.Control("restart", targetPath, []string{"-d", "-f"}) + err := d.Control("restart", targetPath, nil) if err != nil { gLog.Println(LevelERROR, "restart service error:", err) } else { @@ -54,11 +55,11 @@ func main() { srcPort := flag.Int("srcport", 0, "source port ") protocol := flag.String("protocol", "tcp", "tcp or udp") appName := flag.String("appname", "", "app name") - flag.Bool("noshare", false, "deprecated. uses -sharebandwidth -1") + flag.Bool("noshare", false, "deprecated. uses -sharebandwidth -1") // Deprecated, rm later shareBandwidth := flag.Int("sharebandwidth", 10, "N mbps share bandwidth limit, private node no limit") - flag.Bool("f", false, "deprecated. config file") + flag.Bool("f", false, "deprecated. config file") // Deprecated, rm later daemonMode := flag.Bool("d", false, "daemonMode") - byDaemon := flag.Bool("bydaemon", false, "start by daemon") + flag.Bool("bydaemon", false, "start by daemon") // Deprecated, rm later logLevel := flag.Int("loglevel", 1, "0:debug 1:info 2:warn 3:error") flag.Parse() @@ -75,7 +76,8 @@ func main() { gConf.add(config) gConf.load() gConf.mtx.Lock() - gLog.setLevel(LogLevel(gConf.logLevel)) + + // spec paramters in commandline will always be used flag.Visit(func(f *flag.Flag) { if f.Name == "sharebandwidth" { gConf.Network.ShareBandwidth = *shareBandwidth @@ -93,9 +95,10 @@ func main() { gConf.Network.ServerHost = *serverHost } if f.Name == "loglevel" { - gConf.logLevel = *logLevel + gConf.LogLevel = *logLevel } }) + if gConf.Network.ServerHost == "" { gConf.Network.ServerHost = *serverHost } @@ -108,13 +111,20 @@ func main() { if gConf.Network.Password == "" { gConf.Network.Password = *password } + if gConf.LogLevel == IntValueNotSet { + gConf.LogLevel = *logLevel + } + if gConf.Network.ShareBandwidth == IntValueNotSet { + gConf.Network.ShareBandwidth = *shareBandwidth + } + gConf.Network.ServerPort = 27182 gConf.Network.UDPPort1 = 27182 gConf.Network.UDPPort2 = 27183 gLog.Println(LevelINFO, "openp2p start. version: ", OpenP2PVersion) + gLog.setLevel(LogLevel(gConf.LogLevel)) gConf.mtx.Unlock() gConf.save() - gConf.daemonMode = *byDaemon if *daemonMode { d := daemon{} d.run() diff --git a/protocol.go b/protocol.go index b0e46ae..110d873 100644 --- a/protocol.go +++ b/protocol.go @@ -10,7 +10,7 @@ import ( "time" ) -const OpenP2PVersion = "0.98.1" +const OpenP2PVersion = "0.99.0" const ProducnName string = "openp2p" type openP2PHeader struct { diff --git a/update.go b/update.go index 1650f5a..9c9d094 100644 --- a/update.go +++ b/update.go @@ -16,18 +16,9 @@ import ( "time" ) -// type updateFileInfo struct { -// Name string `json:"name,omitempty"` -// RelativePath string `json:"relativePath,omitempty"` -// Length int64 `json:"length,omitempty"` -// URL string `json:"url,omitempty"` -// Hash string `json:"hash,omitempty"` -// } - func update() { gLog.Println(LevelINFO, "update start") defer gLog.Println(LevelINFO, "update end") - // TODO: download from gitee. save flow c := http.Client{ Transport: &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, @@ -61,7 +52,6 @@ func update() { gLog.Println(LevelERROR, "update error:", updateInfo.Error, updateInfo.ErrorDetail) return } - os.MkdirAll("download", 0666) err = updateFile(updateInfo.Url, "", "openp2p") if err != nil { gLog.Println(LevelERROR, "update: download failed:", err) @@ -112,6 +102,7 @@ func updateFile(url string, checksum string, dst string) error { os.Rename(os.Args[0]+"0", os.Args[0]) return err } + os.Remove(tmpFile) return nil } @@ -133,11 +124,6 @@ func unzip(dst, src string) (err error) { for _, f := range archive.File { filePath := filepath.Join(dst, f.Name) fmt.Println("unzipping file ", filePath) - - // if !strings.HasPrefix(filePath, filepath.Clean(dst)+string(os.PathSeparator)) { - // fmt.Println("invalid file path") - // return - // } if f.FileInfo().IsDir() { fmt.Println("creating directory...") os.MkdirAll(filePath, os.ModePerm)