From 6b8d3f7d479826a34f757c1fb2e1913cb9b2b72a Mon Sep 17 00:00:00 2001 From: TenderIronh Date: Thu, 7 Apr 2022 23:09:47 +0800 Subject: [PATCH] 1.4.2 --- README-ZH.md | 8 ++++++-- README.md | 6 ++++++ config.go | 49 +++++++++++++++++++++++++++++++++++-------------- daemon.go | 16 +++++++++++++++- handlepush.go | 10 +++++----- log.go | 5 +++++ openp2p.go | 9 ++++++++- p2pnetwork.go | 21 ++++++++++++++------- protocol.go | 6 ++++-- 9 files changed, 98 insertions(+), 32 deletions(-) diff --git a/README-ZH.md b/README-ZH.md index 2a42894..1bfedbb 100644 --- a/README-ZH.md +++ b/README-ZH.md @@ -39,7 +39,12 @@ P2P直连可以让你的设备跑满带宽。不论你的设备在任何网络 分别在本地和远程电脑下载后双击运行,一键安装 ![image](/doc/images/install.png) + +Windows默认会阻止没有花钱买它家证书签名过的程序,选择“仍要运行”即可。 + ![image](/doc/images/win10warn.png) + + ![image](/doc/images/stillrun.png) ### 3.新建P2P应用 ![image](/doc/images/devices.png) @@ -120,8 +125,7 @@ go build ## 参与贡献 TODO或ISSUE里如果有你擅长的领域,或者你有特别好的主意,可以加入OpenP2P项目,贡献你的代码。待项目茁壮成长后,你们就是知名开源项目的主要代码贡献者,岂不快哉。 -## 商业合作 -它是一个中国人发起的项目,更懂国内网络环境,更懂用户需求,更好的企业级支持 + ## 技术交流 QQ群:16947733 邮箱:openp2p.cn@gmail.com tenderiron@139.com diff --git a/README.md b/README.md index 7ac4843..4cfdf69 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,12 @@ Download on local and remote computers and double-click to run, one-click instal ![image](/doc/images/install_en.png) +By default, Windows will block programs that have not been signed by the Microsoft's certificate, and you can select "Run anyway". + + ![image](/doc/images/win10warn_en.png) + + ![image](/doc/images/stillrun_en.png) + ### 3.New P2PApp ![image](/doc/images/devices_en.png) diff --git a/config.go b/config.go index 3465554..f87cfc2 100644 --- a/config.go +++ b/config.go @@ -4,7 +4,6 @@ import ( "encoding/json" "flag" "io/ioutil" - "os" "sync" "time" ) @@ -32,15 +31,17 @@ type AppConfig struct { retryTime time.Time nextRetryTime time.Time shareBandwidth int + errMsg string + connectTime time.Time } // TODO: add loglevel, maxlogfilesize type Config struct { - Network NetworkConfig `json:"network"` - Apps []*AppConfig `json:"apps"` - LogLevel int - - mtx sync.Mutex + Network NetworkConfig `json:"network"` + Apps []*AppConfig `json:"apps"` + LogLevel int + daemonMode bool + mtx sync.Mutex } func (c *Config) switchApp(app AppConfig, enabled int) { @@ -115,6 +116,27 @@ func (c *Config) load() error { return err } +func (c *Config) setToken(token uint64) { + c.mtx.Lock() + defer c.mtx.Unlock() + c.Network.Token = token +} +func (c *Config) setUser(user string) { + c.mtx.Lock() + defer c.mtx.Unlock() + c.Network.User = user +} +func (c *Config) setNode(node string) { + c.mtx.Lock() + defer c.mtx.Unlock() + c.Network.Node = node +} +func (c *Config) setShareBandwidth(bw int) { + c.mtx.Lock() + defer c.mtx.Unlock() + c.Network.ShareBandwidth = bw +} + type NetworkConfig struct { // local info Token uint64 @@ -147,6 +169,7 @@ func parseParams() { appName := flag.String("appname", "", "app name") shareBandwidth := flag.Int("sharebandwidth", 10, "N mbps share bandwidth limit, private network no limit") daemonMode := flag.Bool("d", false, "daemonMode") + notVerbose := flag.Bool("nv", false, "not log console") logLevel := flag.Int("loglevel", 1, "0:debug 1:info 2:warn 3:error") flag.Parse() @@ -161,8 +184,8 @@ func parseParams() { if config.SrcPort != 0 { gConf.add(config, true) } - gConf.mtx.Lock() - + // gConf.mtx.Lock() // when calling this func it's single-thread no lock + gConf.daemonMode = *daemonMode // spec paramters in commandline will always be used flag.Visit(func(f *flag.Flag) { if f.Name == "sharebandwidth" { @@ -203,11 +226,9 @@ func parseParams() { gConf.Network.UDPPort1 = 27182 gConf.Network.UDPPort2 = 27183 gLog.setLevel(LogLevel(gConf.LogLevel)) - gConf.mtx.Unlock() - gConf.save() - if *daemonMode { - d := daemon{} - d.run() - os.Exit(0) + if *notVerbose { + gLog.setMode(LogFile) } + // gConf.mtx.Unlock() + gConf.save() } diff --git a/daemon.go b/daemon.go index d8df4ed..14e106c 100644 --- a/daemon.go +++ b/daemon.go @@ -64,10 +64,18 @@ func (d *daemon) run() { break } } + args = append(args, "-nv") for { // start worker + tmpDump := filepath.Join("log", "dump.log.tmp") + dumpFile := filepath.Join("log", "dump.log") + f, err := os.Create(filepath.Join(tmpDump)) + if err != nil { + gLog.Printf(LevelERROR, "start worker error:%s", err) + return + } gLog.Println(LevelINFO, "start worker process, args:", args) - execSpec := &os.ProcAttr{Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}} + execSpec := &os.ProcAttr{Env: append(os.Environ(), "GOTRACEBACK=crash"), Files: []*os.File{os.Stdin, os.Stdout, f}} p, err := os.StartProcess(binPath, args, execSpec) if err != nil { gLog.Printf(LevelERROR, "start worker error:%s", err) @@ -75,6 +83,12 @@ func (d *daemon) run() { } d.proc = p _, _ = p.Wait() + f.Close() + time.Sleep(time.Second) + err = os.Rename(tmpDump, dumpFile) + if err != nil { + gLog.Printf(LevelERROR, "rename dump error:%s", err) + } if !d.running { return } diff --git a/handlepush.go b/handlepush.go index 12072a5..94de9af 100644 --- a/handlepush.go +++ b/handlepush.go @@ -127,6 +127,7 @@ func handlePush(pn *P2PNetwork, subType uint16, msg []byte) error { } appInfo := AppInfo{ AppName: config.AppName, + Error: config.errMsg, Protocol: config.Protocol, SrcPort: config.SrcPort, RelayNode: relayNode, @@ -137,7 +138,8 @@ func handlePush(pn *P2PNetwork, subType uint16, msg []byte) error { PeerUser: config.PeerUser, PeerIP: config.peerIP, PeerNatType: config.peerNatType, - RetryTime: config.retryTime.String(), + RetryTime: config.retryTime.Local().Format("2006-01-02T15:04:05-0700"), + ConnectTime: config.connectTime.Local().Format("2006-01-02T15:04:05-0700"), IsActive: appActive, Enabled: config.Enabled, } @@ -180,10 +182,8 @@ func handlePush(pn *P2PNetwork, subType uint16, msg []byte) error { gLog.Printf(LevelERROR, "wrong MsgPushEditNode:%s %s", err, string(msg[openP2PHeaderSize:])) return err } - gConf.mtx.Lock() - gConf.Network.Node = req.NewName - gConf.Network.ShareBandwidth = req.Bandwidth - gConf.mtx.Unlock() + gConf.setNode(req.NewName) + gConf.setShareBandwidth(req.Bandwidth) gConf.save() // TODO: hot reload os.Exit(0) diff --git a/log.go b/log.go index a5976d6..8c28a8a 100644 --- a/log.go +++ b/log.go @@ -97,6 +97,11 @@ func (vl *V8log) setLevel(level LogLevel) { defer vl.mtx.Unlock() vl.level = level } +func (vl *V8log) setMode(mode int) { + vl.mtx.Lock() + defer vl.mtx.Unlock() + vl.mode = mode +} func (vl *V8log) checkFile() { if vl.maxLogSize <= 0 { diff --git a/openp2p.go b/openp2p.go index 338a252..2002c62 100644 --- a/openp2p.go +++ b/openp2p.go @@ -40,9 +40,16 @@ func main() { } else { installByFilename() } + parseParams() gLog.Println(LevelINFO, "openp2p start. version: ", OpenP2PVersion) gLog.Println(LevelINFO, "Contact: QQ Group: 16947733, Email: openp2p.cn@gmail.com") - parseParams() + + if gConf.daemonMode { + d := daemon{} + d.run() + return + } + gLog.Println(LevelINFO, &gConf) setFirewall() network := P2PNetworkInstance(&gConf.Network) diff --git a/p2pnetwork.go b/p2pnetwork.go index dbb8b00..d8398a9 100644 --- a/p2pnetwork.go +++ b/p2pnetwork.go @@ -94,9 +94,11 @@ func (pn *P2PNetwork) Connect(timeout int) bool { } func (pn *P2PNetwork) runAll() { - gConf.mtx.Lock() + gConf.mtx.Lock() // lock for copy gConf.Apps and the modification of config(it's pointer) defer gConf.mtx.Unlock() - for _, config := range gConf.Apps { + allApps := gConf.Apps // read a copy, other thread will modify the gConf.Apps + + for _, config := range allApps { if config.nextRetryTime.After(time.Now()) { continue } @@ -133,7 +135,13 @@ func (pn *P2PNetwork) runAll() { increase = 900 } config.nextRetryTime = time.Now().Add(time.Second * time.Duration(increase)) // exponential increase retry time. 1.3^x - pn.AddApp(*config) + config.connectTime = time.Now() + gConf.mtx.Unlock() // AddApp will take a period of time + err := pn.AddApp(*config) + gConf.mtx.Lock() + if err != nil { + config.errMsg = err.Error() + } } } func (pn *P2PNetwork) autorunApp() { @@ -202,6 +210,7 @@ func (pn *P2PNetwork) addRelayTunnel(config AppConfig, appid uint64, appkey uint return t, rspID.ID, rsp.Mode, err } +// use *AppConfig to save status func (pn *P2PNetwork) AddApp(config AppConfig) error { gLog.Printf(LevelINFO, "addApp %s to %s:%s:%d start", config.AppName, config.PeerNode, config.DstHost, config.DstPort) defer gLog.Printf(LevelINFO, "addApp %s to %s:%s:%d end", config.AppName, config.PeerNode, config.DstHost, config.DstPort) @@ -459,10 +468,8 @@ func (pn *P2PNetwork) handleMessage(t int, msg []byte) { pn.serverTs = rsp.Ts pn.config.Token = rsp.Token pn.config.User = rsp.User - gConf.mtx.Lock() - gConf.Network.Token = rsp.Token - gConf.Network.User = rsp.User - gConf.mtx.Unlock() + gConf.setToken(rsp.Token) + gConf.setUser(rsp.User) gConf.save() pn.localTs = time.Now().Unix() gLog.Printf(LevelINFO, "login ok. user=%s,Server ts=%d, local ts=%d", rsp.User, rsp.Ts, pn.localTs) diff --git a/protocol.go b/protocol.go index 9c627b2..73585da 100644 --- a/protocol.go +++ b/protocol.go @@ -10,7 +10,7 @@ import ( "time" ) -const OpenP2PVersion = "1.3.0" +const OpenP2PVersion = "1.4.2" const ProducnName string = "openp2p" type openP2PHeader struct { @@ -134,6 +134,7 @@ const ( PublicIPEchoTimeout = time.Second * 3 NatTestTimeout = time.Second * 10 ClientAPITimeout = time.Second * 10 + MaxDirectTry = 5 ) // NATNone has public ip @@ -270,7 +271,7 @@ type ReportConnect struct { NatType int `json:"natType,omitempty"` PeerNode string `json:"peerNode,omitempty"` DstPort int `json:"dstPort,omitempty"` - DstHost string `json:"dsdtHost,omitempty"` + DstHost string `json:"dstHost,omitempty"` PeerUser string `json:"peerUser,omitempty"` PeerNatType int `json:"peerNatType,omitempty"` PeerIP string `json:"peerIP,omitempty"` @@ -298,6 +299,7 @@ type AppInfo struct { RelayMode string `json:"relayMode,omitempty"` Version string `json:"version,omitempty"` RetryTime string `json:"retryTime,omitempty"` + ConnectTime string `json:"connectTime,omitempty"` IsActive int `json:"isActive,omitempty"` Enabled int `json:"enabled,omitempty"` }