diff --git a/core/daemon.go b/core/daemon.go index 08457a9..eff3b46 100644 --- a/core/daemon.go +++ b/core/daemon.go @@ -6,7 +6,7 @@ import ( "path/filepath" "time" - "github.com/kardianos/service" + "github.com/openp2p-cn/service" ) type daemon struct { @@ -44,9 +44,9 @@ func (d *daemon) run() { } gLog.Println(LvINFO, mydir) conf := &service.Config{ - Name: ProducnName, - DisplayName: ProducnName, - Description: ProducnName, + Name: ProductName, + DisplayName: ProductName, + Description: ProductName, Executable: binPath, } @@ -95,9 +95,9 @@ func (d *daemon) run() { func (d *daemon) Control(ctrlComm string, exeAbsPath string, args []string) error { svcConfig := &service.Config{ - Name: ProducnName, - DisplayName: ProducnName, - Description: ProducnName, + Name: ProductName, + DisplayName: ProductName, + Description: ProductName, Executable: exeAbsPath, Arguments: args, } diff --git a/core/handlepush.go b/core/handlepush.go index a709069..8c23bdc 100644 --- a/core/handlepush.go +++ b/core/handlepush.go @@ -101,7 +101,6 @@ func handlePush(pn *P2PNetwork, subType uint16, msg []byte) error { msg := TunnelMsg{ID: t.id} pn.push(r.From, MsgPushAddRelayTunnelRsp, msg) } - }(req) case MsgPushAPPKey: req := APPKeySync{} diff --git a/core/openp2p.go b/core/openp2p.go index f52b909..d6c9bb4 100644 --- a/core/openp2p.go +++ b/core/openp2p.go @@ -13,7 +13,7 @@ func Run() { rand.Seed(time.Now().UnixNano()) baseDir := filepath.Dir(os.Args[0]) os.Chdir(baseDir) // for system service - gLog = NewLogger(baseDir, ProducnName, LvDEBUG, 1024*1024, LogFileAndConsole) + gLog = NewLogger(baseDir, ProductName, LvDEBUG, 1024*1024, LogFileAndConsole) // TODO: install sub command, deamon process if len(os.Args) > 1 { switch os.Args[1] { @@ -21,7 +21,7 @@ func Run() { fmt.Println(OpenP2PVersion) return case "update": - gLog = NewLogger(baseDir, ProducnName, LvDEBUG, 1024*1024, LogFileAndConsole) + gLog = NewLogger(baseDir, ProductName, LvDEBUG, 1024*1024, LogFileAndConsole) targetPath := filepath.Join(defaultInstallPath, defaultBinName) d := daemon{} err := d.Control("restart", targetPath, nil) @@ -70,7 +70,7 @@ var network *P2PNetwork func RunAsModule(baseDir string, token string, bw int, logLevel int) *P2PNetwork { rand.Seed(time.Now().UnixNano()) os.Chdir(baseDir) // for system service - gLog = NewLogger(baseDir, ProducnName, LvDEBUG, 1024*1024, LogFileAndConsole) + gLog = NewLogger(baseDir, ProductName, LvDEBUG, 1024*1024, LogFileAndConsole) parseParams("") diff --git a/core/p2pnetwork.go b/core/p2pnetwork.go index b61e296..703bb3b 100644 --- a/core/p2pnetwork.go +++ b/core/p2pnetwork.go @@ -7,7 +7,6 @@ import ( "encoding/json" "errors" "fmt" - "math" "math/rand" "net/http" "net/url" @@ -74,7 +73,6 @@ func (pn *P2PNetwork) run() { case <-pn.restartCh: pn.online = false pn.wg.Wait() // wait read/write goroutine exited - time.Sleep(NetworkHeartbeatTime) err := pn.init() if err != nil { gLog.Println(LvERROR, "P2PNetwork init error:", err) @@ -129,14 +127,12 @@ func (pn *P2PNetwork) runAll() { } config.retryNum++ config.retryTime = time.Now() - increase := math.Pow(1.5, float64(config.retryNum)) // exponential increase retry time. 1.5^x - if increase > 900 { - increase = 900 + if config.retryNum > 20 { config.Enabled = 0 gLog.Printf(LvWARN, "app %s has stopped retry, manually enable it on Web console", config.AppName) continue } - config.nextRetryTime = time.Now().Add(time.Second * time.Duration(increase)) + config.nextRetryTime = time.Now().Add(time.Second * 10) config.connectTime = time.Now() config.peerToken = pn.config.Token gConf.mtx.Unlock() // AddApp will take a period of time @@ -371,7 +367,7 @@ func (pn *P2PNetwork) addDirectTunnel(config AppConfig, tid uint64) (*P2PTunnel, gLog.Println(LvERROR, "init error:", initErr) return nil, initErr } - err := ErrorHandshake + var err error // try TCP6 if IsIPv6(t.config.peerIPv6) && IsIPv6(t.pn.config.publicIPv6) { gLog.Println(LvINFO, "try TCP6") @@ -417,7 +413,7 @@ func (pn *P2PNetwork) addDirectTunnel(config AppConfig, tid uint64) (*P2PTunnel, return t, nil } } - return nil, err + return nil, ErrorHandshake // only ErrorHandshake will try relay } func (pn *P2PNetwork) newTunnel(t *P2PTunnel, tid uint64, isClient bool) error { @@ -490,27 +486,28 @@ func (pn *P2PNetwork) init() error { go pn.readLoop() pn.config.mac = getmac(pn.config.localIP) pn.config.os = getOsName() - - req := ReportBasic{ - Mac: pn.config.mac, - LanIP: pn.config.localIP, - OS: pn.config.os, - HasIPv4: pn.config.hasIPv4, - HasUPNPorNATPMP: pn.config.hasUPNPorNATPMP, - Version: OpenP2PVersion, - } - rsp := netInfo() - gLog.Println(LvDEBUG, "netinfo:", rsp) - if rsp != nil && rsp.Country != "" { - if IsIPv6(rsp.IP.String()) { - pn.config.publicIPv6 = rsp.IP.String() + go func() { + req := ReportBasic{ + Mac: pn.config.mac, + LanIP: pn.config.localIP, + OS: pn.config.os, + HasIPv4: pn.config.hasIPv4, + HasUPNPorNATPMP: pn.config.hasUPNPorNATPMP, + Version: OpenP2PVersion, } - req.NetInfo = *rsp - } else { - pn.refreshIPv6(true) - } - req.IPv6 = pn.config.publicIPv6 - pn.write(MsgReport, MsgReportBasic, &req) + rsp := netInfo() + gLog.Println(LvDEBUG, "netinfo:", rsp) + if rsp != nil && rsp.Country != "" { + if IsIPv6(rsp.IP.String()) { + pn.config.publicIPv6 = rsp.IP.String() + } + req.NetInfo = *rsp + } else { + pn.refreshIPv6(true) + } + req.IPv6 = pn.config.publicIPv6 + pn.write(MsgReport, MsgReportBasic, &req) + }() gLog.Println(LvDEBUG, "P2PNetwork init ok") break } diff --git a/core/p2ptunnel.go b/core/p2ptunnel.go index 3aa1697..d27b661 100644 --- a/core/p2ptunnel.go +++ b/core/p2ptunnel.go @@ -106,7 +106,7 @@ func (t *P2PTunnel) connect() error { AppKey: appKey, Version: OpenP2PVersion, LinkMode: t.config.linkMode, - IsUnderlayServer: t.config.isUnderlayServer ^ 1, + IsUnderlayServer: t.config.isUnderlayServer ^ 1, // peer } if req.Token == 0 { // no relay token req.Token = t.pn.config.Token @@ -154,6 +154,9 @@ func (t *P2PTunnel) setRun(running bool) { } func (t *P2PTunnel) isActive() bool { + if !t.isRuning() { + return false + } t.hbMtx.Lock() defer t.hbMtx.Unlock() return time.Now().Before(t.hbTime.Add(TunnelIdleTimeout)) diff --git a/core/protocol.go b/core/protocol.go index 5ac9f65..4876967 100644 --- a/core/protocol.go +++ b/core/protocol.go @@ -10,8 +10,8 @@ import ( "time" ) -const OpenP2PVersion = "3.5.2" -const ProducnName string = "openp2p" +const OpenP2PVersion = "3.5.5" +const ProductName string = "openp2p" const LeastSupportVersion = "3.0.0" const ( @@ -146,7 +146,7 @@ const ( MaxRetry = 10 RetryInterval = time.Second * 30 PublicIPEchoTimeout = time.Second * 1 - NatTestTimeout = time.Second * 10 + NatTestTimeout = time.Second * 5 ClientAPITimeout = time.Second * 10 MaxDirectTry = 3 ) diff --git a/core/util_windows.go b/core/util_windows.go index 94b8f8e..e1828a6 100644 --- a/core/util_windows.go +++ b/core/util_windows.go @@ -45,9 +45,9 @@ func setFirewall() { } if isXP { exec.Command("cmd.exe", `/c`, fmt.Sprintf(`netsh firewall del allowedprogram "%s"`, fullPath)).Run() - exec.Command("cmd.exe", `/c`, fmt.Sprintf(`netsh firewall add allowedprogram "%s" "%s" ENABLE`, ProducnName, fullPath)).Run() + exec.Command("cmd.exe", `/c`, fmt.Sprintf(`netsh firewall add allowedprogram "%s" "%s" ENABLE`, ProductName, fullPath)).Run() } else { // win7 or later - exec.Command("cmd.exe", `/c`, fmt.Sprintf(`netsh advfirewall firewall del rule name="%s"`, ProducnName)).Run() - exec.Command("cmd.exe", `/c`, fmt.Sprintf(`netsh advfirewall firewall add rule name="%s" dir=in action=allow program="%s" enable=yes`, ProducnName, fullPath)).Run() + exec.Command("cmd.exe", `/c`, fmt.Sprintf(`netsh advfirewall firewall del rule name="%s"`, ProductName)).Run() + exec.Command("cmd.exe", `/c`, fmt.Sprintf(`netsh advfirewall firewall add rule name="%s" dir=in action=allow program="%s" enable=yes`, ProductName, fullPath)).Run() } } diff --git a/go.mod b/go.mod index 3d0d367..3c9157e 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,9 @@ go 1.18 require ( github.com/gorilla/websocket v1.4.2 - github.com/kardianos/service v1.2.0 github.com/lucas-clemente/quic-go v0.27.0 github.com/openp2p-cn/go-reuseport v0.3.2 + github.com/openp2p-cn/service v1.0.0 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f ) @@ -14,6 +14,7 @@ require ( github.com/cheekybits/genny v1.0.0 // indirect github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect + github.com/kardianos/service v1.2.2 // indirect github.com/marten-seemann/qtls-go1-16 v0.1.5 // indirect github.com/marten-seemann/qtls-go1-17 v0.1.1 // indirect github.com/marten-seemann/qtls-go1-18 v0.1.1 // indirect