From ddaac2d155f78e2dead27db7a496da8ceb429fdd Mon Sep 17 00:00:00 2001 From: Mmx <1624045573@qq.com> Date: Fri, 3 Dec 2021 19:59:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E5=A4=9A=E7=BD=91?= =?UTF-8?q?=E5=8D=A1=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/guardian.go | 38 +++++++++++++++++++++++++++++-------- controllers/login.go | 4 +++- go.mod | 2 +- go.sum | 6 ++---- main.go | 29 ++++++++++++++++++++++------ models/config.go | 9 +++++---- models/eth.go | 8 ++++++++ util/checker.go | 10 ++++++---- util/eth.go | 42 +++++++++++++++++++++++++++++++++++++++++ v1/login.go | 13 ++++++++----- v1/transfer/login.go | 4 ++++ 11 files changed, 132 insertions(+), 33 deletions(-) create mode 100644 models/eth.go create mode 100644 util/eth.go diff --git a/controllers/guardian.go b/controllers/guardian.go index 40f2965..828741d 100644 --- a/controllers/guardian.go +++ b/controllers/guardian.go @@ -2,6 +2,7 @@ package controllers import ( "github.com/Mmx233/BitSrunLoginGo/global" + srunModels "github.com/Mmx233/BitSrunLoginGo/models" "github.com/Mmx233/BitSrunLoginGo/util" "os" "os/exec" @@ -27,17 +28,38 @@ func Guardian(output bool) { defer func() { _ = recover() }() - if !util.Checker.NetOk(global.Config.Settings.Timeout) { - util.Log.Println("Network down, trying to login") - e := Login(output, true) - if e != nil { - util.Log.Println("Error: ", e) + if global.Config.Settings.Interfaces == "" { //单网卡 + if !util.Checker.NetOk(global.Config.Settings.Timeout, nil) { + util.Log.Println("Network down, trying to login") + e := Login(output, true, nil) + if e != nil { + util.Log.Println("Error: ", e) + } + } else { + if global.Config.Settings.DemoMode { + util.Log.Println("Network ok") + } } - } else { - if global.Config.Settings.DemoMode { - util.Log.Println("Network ok") + } else { //多网卡 + interfaces, e := util.GetInterfaceAddr() + if e == nil { + var down []srunModels.Eth + for _, eth := range interfaces { + if !util.Checker.NetOk(global.Config.Settings.Timeout, eth.Addr) { + util.Log.Println(eth.Name + " network down") + down = append(down, eth) + } + } + + for _, eth := range down { + e := Login(output, true, eth.Addr) + if e != nil { + util.Log.Println(eth.Name+" login error: ", e) + } + } } } + c <- false }() <-c diff --git a/controllers/login.go b/controllers/login.go index a40dd0d..48b37a7 100644 --- a/controllers/login.go +++ b/controllers/login.go @@ -4,10 +4,11 @@ import ( "github.com/Mmx233/BitSrunLoginGo/global" BitSrun "github.com/Mmx233/BitSrunLoginGo/v1" "github.com/Mmx233/BitSrunLoginGo/v1/transfer" + "net" ) // Login 登录逻辑 -func Login(output bool, skipCheck bool) error { +func Login(output bool, skipCheck bool, localAddr net.Addr) error { return BitSrun.Login(&srunTransfer.Login{ Demo: global.Config.Settings.DemoMode, OutPut: output, @@ -17,5 +18,6 @@ func Login(output bool, skipCheck bool) error { Form: &global.Config.Form, Meta: &global.Config.Meta, }, + LocalAddr: localAddr, }) } diff --git a/go.mod b/go.mod index de763fa..d7f118b 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( github.com/Mmx233/config v0.0.3 - github.com/Mmx233/tool v0.3.8 + github.com/Mmx233/tool v0.3.9 github.com/PuerkitoBio/goquery v1.8.0 // indirect github.com/andybalholm/cascadia v1.3.1 // indirect github.com/howeyc/fsnotify v0.9.0 diff --git a/go.sum b/go.sum index b424807..eee4397 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/Mmx233/config v0.0.3 h1:E744hob5fWD5P7m7q+91Z41R+Y1LDkxIhQXIeV1tel0= github.com/Mmx233/config v0.0.3/go.mod h1:3mt+LSHUvD/C6tq1ge/Dmp8xKivFmo7gxSihCPjIAi0= -github.com/Mmx233/tool v0.3.8 h1:6CQcxAbK3/bSn6/MacUvXpclhCsgHCa/Dt7+H+ZstTQ= -github.com/Mmx233/tool v0.3.8/go.mod h1:un5MCoI21lH40fFI5S9++aja8nJb+2sjATak7PnGMZ0= +github.com/Mmx233/tool v0.3.9 h1:yeb1uCD8gKcx5g62XQZuxAEHaOxILWyR0Uf9VMECoac= +github.com/Mmx233/tool v0.3.9/go.mod h1:un5MCoI21lH40fFI5S9++aja8nJb+2sjATak7PnGMZ0= github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U= github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI= github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= @@ -9,8 +9,6 @@ github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEq github.com/howeyc/fsnotify v0.9.0 h1:0gtV5JmOKH4A8SsFxG2BczSeXWWPvcMT0euZt5gDAxY= github.com/howeyc/fsnotify v0.9.0/go.mod h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA= golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 h1:0qxwC5n+ttVOINCBeRHO0nq9X7uy8SDsPoi5OaCdIEI= -golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211201190559-0a0e4e1bb54c h1:WtYZ93XtWSO5KlOMgPZu7hXY9WhMZpprvlm5VwvAl8c= golang.org/x/net v0.0.0-20211201190559-0a0e4e1bb54c/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/main.go b/main.go index b8e4927..25795f9 100644 --- a/main.go +++ b/main.go @@ -15,13 +15,30 @@ func main() { } else if global.Config.Settings.Guardian.Enable { //进入守护模式流程 controllers.EnterGuardian() - } else if err := controllers.Login(true, false); err != nil { //单次登录模式 - util.Log.Println("运行出错,状态异常") - if global.Config.Settings.DemoMode { - util.Log.Fatalln(err) - } else { - util.Log.Println(err) + } + + //单次登录模式 + if global.Config.Settings.Interfaces == "" { //单网卡 + if err := controllers.Login(true, false, nil); err != nil { + util.Log.Println("运行出错,状态异常") + if global.Config.Settings.DemoMode { + util.Log.Fatalln(err) + } else { + util.Log.Println(err) + return + } + } + } else { //多网卡 + interfaces, e := util.GetInterfaceAddr() + if e != nil { return } + for _, eth := range interfaces { + if err := controllers.Login(true, false, eth.Addr); err != nil { + util.Log.Println(eth.Name + "运行出错,状态异常") + util.Log.Println(err) + } + } } + } diff --git a/models/config.go b/models/config.go index 02c33af..27c79ac 100644 --- a/models/config.go +++ b/models/config.go @@ -13,10 +13,11 @@ type Guardian struct { } type Settings struct { - Timeout uint `json:"timeout"` - DemoMode bool `json:"demo_mode"` - Guardian Guardian - Daemon Daemon + Timeout uint `json:"timeout"` + Interfaces string `json:"interfaces"` + DemoMode bool `json:"demo_mode"` + Guardian Guardian + Daemon Daemon } type Config struct { diff --git a/models/eth.go b/models/eth.go new file mode 100644 index 0000000..8356280 --- /dev/null +++ b/models/eth.go @@ -0,0 +1,8 @@ +package srunModels + +import "net" + +type Eth struct { + Name string + Addr net.Addr +} diff --git a/util/checker.go b/util/checker.go index 150bbfe..afbf64d 100644 --- a/util/checker.go +++ b/util/checker.go @@ -2,6 +2,7 @@ package util import ( "github.com/Mmx233/tool" + "net" "time" ) @@ -10,11 +11,12 @@ type checker struct{} var Checker checker // NetOk 网络状况检查 -func (checker) NetOk(timeout uint) bool { +func (checker) NetOk(timeout uint, localAddr net.Addr) bool { h, i, e := tool.HTTP.GetReader(&tool.GetRequest{ - Url: "https://www.baidu.com/", - Redirect: false, - Timeout: time.Duration(timeout) * time.Second, + Url: "https://www.baidu.com/", + Redirect: false, + Timeout: time.Duration(timeout) * time.Second, + LocalAddr: localAddr, }) if e != nil { return false diff --git a/util/eth.go b/util/eth.go new file mode 100644 index 0000000..6e9eee3 --- /dev/null +++ b/util/eth.go @@ -0,0 +1,42 @@ +package util + +import ( + "github.com/Mmx233/BitSrunLoginGo/global" + srunModels "github.com/Mmx233/BitSrunLoginGo/models" + "net" + "regexp" + "strings" +) + +func GetInterfaceAddr() ([]srunModels.Eth, error) { + var result []srunModels.Eth + + interfaces, e := net.Interfaces() + if e != nil { + return nil, e + } + reg, e := regexp.Compile(global.Config.Settings.Interfaces) + if e != nil { + Log.Println("interfaces设置异常,无法解析") + return nil, e + } + for _, eth := range interfaces { + if reg.Match([]byte(eth.Name)) { + addrs, e := eth.Addrs() + if e != nil { + Log.Println(eth.Name + " 地址获取失败") + } + for _, ip := range addrs { + if strings.Contains(ip.String(), ".") { + result = append(result, srunModels.Eth{ + Name: eth.Name, + Addr: ip, + }) + break + } + } + } + } + + return result, nil +} diff --git a/v1/login.go b/v1/login.go index 84c448b..bae58b2 100644 --- a/v1/login.go +++ b/v1/login.go @@ -16,7 +16,7 @@ func Login(c *srunTransfer.Login) error { G := util.GenerateLoginInfo(c.LoginInfo.Form, c.LoginInfo.Meta) if c.CheckNet { util.Log.Println("Step0: 检查状态…") - if util.Checker.NetOk(c.Timeout) { + if util.Checker.NetOk(c.Timeout, c.LocalAddr) { util.Log.Println("网络 ok") return nil } @@ -25,8 +25,9 @@ func Login(c *srunTransfer.Login) error { util.Log.Println("Step1: 正在获取客户端ip") { if _, body, e := tool.HTTP.GetString(&tool.GetRequest{ - Url: G.UrlLoginPage, - Redirect: true, + Url: G.UrlLoginPage, + Redirect: true, + LocalAddr: c.LocalAddr, }); e != nil { return e } else if G.Ip, e = util.GetIp(body); e != nil { @@ -43,7 +44,8 @@ func Login(c *srunTransfer.Login) error { "username": G.Form.UserName, "ip": G.Ip, }, - Redirect: true, + Redirect: true, + LocalAddr: c.LocalAddr, }); e != nil { return e } else if G.Token, e = util.GetToken(data); e != nil { @@ -91,7 +93,8 @@ func Login(c *srunTransfer.Login) error { "double_stack": 0, "_": time.Now().UnixNano(), }, - Redirect: true, + Redirect: true, + LocalAddr: c.LocalAddr, }); e != nil { return e } else if G.LoginResult, e = util.GetResult(res); e != nil { diff --git a/v1/transfer/login.go b/v1/transfer/login.go index 3ea3bfc..d137bb9 100644 --- a/v1/transfer/login.go +++ b/v1/transfer/login.go @@ -1,5 +1,7 @@ package srunTransfer +import "net" + type LoginForm struct { Domain string `json:"domain"` UserName string `json:"username"` @@ -30,4 +32,6 @@ type Login struct { Timeout uint //登录参数,不可缺省 LoginInfo LoginInfo + //出口地址 + LocalAddr net.Addr }