From b0b0f2d6a78df3d5c1bd79bdd2da65a2cd0966ca Mon Sep 17 00:00:00 2001 From: Mmx233 Date: Thu, 1 Jun 2023 10:02:53 +0800 Subject: [PATCH] =?UTF-8?q?improve:=20=E4=B8=BA=20linux=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=8F=AF=E9=9D=A0=E7=9A=84=E7=BD=91=E5=8D=A1=E7=BB=91?= =?UTF-8?q?=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/bitsrun/main.go | 2 +- internal/controllers/guardian.go | 2 +- internal/controllers/login.go | 11 ++------ internal/global/flags.go | 3 --- internal/global/models/config.go | 1 - tools/http.go | 29 +++++--------------- tools/http_default.go | 29 ++++++++++++++++++++ tools/http_linux.go | 45 ++++++++++++++++++++++++++++++++ 8 files changed, 84 insertions(+), 38 deletions(-) create mode 100644 tools/http_default.go create mode 100644 tools/http_linux.go diff --git a/cmd/bitsrun/main.go b/cmd/bitsrun/main.go index a68da9f..ff610ec 100644 --- a/cmd/bitsrun/main.go +++ b/cmd/bitsrun/main.go @@ -31,7 +31,7 @@ func main() { interfaces, _ := tools.GetInterfaceAddr() for _, eth := range interfaces { log.Infoln("使用网卡: ", eth.Name) - if err = controllers.Login(eth.Addr, false); err != nil { + if err = controllers.Login(ð, false); err != nil { log.Errorf("网卡 %s 登录出错: %v", eth.Name, err) } } diff --git a/internal/controllers/guardian.go b/internal/controllers/guardian.go index 551e218..5616157 100644 --- a/internal/controllers/guardian.go +++ b/internal/controllers/guardian.go @@ -38,7 +38,7 @@ func Guardian() { if e == nil { for _, eth := range interfaces { log.Debugf("使用 %s 网口登录 ", eth.Name) - e = Login(eth.Addr, true) + e = Login(ð, true) if e != nil { log.Errorln("网口 ", eth.Name+" 登录出错: ", e) } diff --git a/internal/controllers/login.go b/internal/controllers/login.go index 654a9eb..ead0eae 100644 --- a/internal/controllers/login.go +++ b/internal/controllers/login.go @@ -6,15 +6,14 @@ import ( "github.com/Mmx233/BitSrunLoginGo/pkg/srun" "github.com/Mmx233/BitSrunLoginGo/tools" log "github.com/sirupsen/logrus" - "net" "net/http" ) // Login 登录逻辑 -func Login(localAddr net.Addr, debugOutput bool) error { +func Login(eth *tools.Eth, debugOutput bool) error { // 登录状态检查 - httpClient := tools.HttpPackSelect(localAddr).Client + httpClient := tools.HttpPackSelect(eth).Client conf := &srun.Conf{ Https: global.Config.Settings.Basic.Https, LoginInfo: srun.LoginInfo{ @@ -38,12 +37,6 @@ func Login(localAddr net.Addr, debugOutput bool) error { return e } - if localAddr != nil && global.Config.Settings.Basic.UseDhcpIP { - ip = localAddr.(*net.TCPAddr).IP.String() - } else if global.Flags.ClientIP != "" { - ip = global.Flags.ClientIP - } - log.Debugln("认证客户端 ip: ", ip) // 登录执行 diff --git a/internal/global/flags.go b/internal/global/flags.go index 3700336..9880692 100644 --- a/internal/global/flags.go +++ b/internal/global/flags.go @@ -11,13 +11,10 @@ var Flags struct { RunningDaemon bool //强制daemon Daemon bool - //指定 client ip - ClientIP string } func initFlags() { flag.StringVar(&Flags.Path, "config", "Config.yaml", "config path") - flag.StringVar(&Flags.ClientIP, "ip", "", "client ip for login") flag.BoolVar(&Flags.RunningDaemon, "running-daemon", false, "") flag.BoolVar(&Flags.Daemon, "daemon", false, "") flag.Parse() diff --git a/internal/global/models/config.go b/internal/global/models/config.go index 1ea908a..55ec02a 100644 --- a/internal/global/models/config.go +++ b/internal/global/models/config.go @@ -19,7 +19,6 @@ type Basic struct { SkipCertVerify bool `json:"skip_cert_verify" yaml:"skip_cert_verify" mapstructure:"skip_cert_verify"` Timeout uint `json:"timeout" yaml:"timeout" mapstructure:"timeout"` Interfaces string `json:"interfaces" yaml:"interfaces" mapstructure:"interfaces"` - UseDhcpIP bool `json:"use_dhcp_ip" yaml:"use_dhcp_ip" mapstructure:"use_dhcp_ip"` } type Log struct { diff --git a/tools/http.go b/tools/http.go index 6d3843d..b8bdb51 100644 --- a/tools/http.go +++ b/tools/http.go @@ -2,8 +2,6 @@ package tools import ( "github.com/Mmx233/BitSrunLoginGo/internal/global" - "github.com/Mmx233/tool" - "net" "net/http" ) @@ -13,40 +11,25 @@ type Http struct { var HttpPack *Http -var httpTools map[net.Addr]*Http +var httpTools map[string]*Http func init() { if global.Config.Settings.Basic.Interfaces == "" { HttpPack = genHttpPack(nil) } else { - httpTools = make(map[net.Addr]*Http, 0) + httpTools = make(map[string]*Http, 0) } } -func HttpPackSelect(addr net.Addr) *Http { +func HttpPackSelect(eth *Eth) *Http { if HttpPack != nil { return HttpPack } - if addrHttp, ok := httpTools[addr]; ok { + if addrHttp, ok := httpTools[eth.Name]; ok { return addrHttp } else { - addrHttp = genHttpPack(addr) - httpTools[addr] = addrHttp + addrHttp = genHttpPack(eth) + httpTools[eth.Name] = addrHttp return addrHttp } } - -func genHttpPack(addr net.Addr) *Http { - tr := tool.GenHttpTransport(&tool.HttpTransportOptions{ - Timeout: global.Timeout, - LocalAddr: addr, - SkipSslCertVerify: global.Config.Settings.Basic.SkipCertVerify, - }) - tr.Proxy = http.ProxyFromEnvironment - return &Http{ - Client: tool.GenHttpClient(&tool.HttpClientOptions{ - Transport: tr, - Timeout: global.Timeout, - }), - } -} diff --git a/tools/http_default.go b/tools/http_default.go new file mode 100644 index 0000000..d497aa3 --- /dev/null +++ b/tools/http_default.go @@ -0,0 +1,29 @@ +//go:build !linux + +package tools + +import ( + "github.com/Mmx233/BitSrunLoginGo/internal/global" + "github.com/Mmx233/tool" + "net" + "net/http" +) + +func genHttpPack(eth *Eth) *Http { + var addr net.Addr + if eth != nil { + addr = eth.Addr + } + tr := tool.GenHttpTransport(&tool.HttpTransportOptions{ + Timeout: global.Timeout, + LocalAddr: addr, + SkipSslCertVerify: global.Config.Settings.Basic.SkipCertVerify, + }) + tr.Proxy = http.ProxyFromEnvironment + return &Http{ + Client: tool.GenHttpClient(&tool.HttpClientOptions{ + Transport: tr, + Timeout: global.Timeout, + }), + } +} diff --git a/tools/http_linux.go b/tools/http_linux.go new file mode 100644 index 0000000..a79412f --- /dev/null +++ b/tools/http_linux.go @@ -0,0 +1,45 @@ +package tools + +import ( + "github.com/Mmx233/BitSrunLoginGo/internal/global" + "github.com/Mmx233/tool" + "net" + "net/http" + "syscall" +) + +func genHttpPack(eth *Eth) *Http { + dialer := net.Dialer{ + Timeout: global.Timeout, + } + if eth != nil { + dialer.LocalAddr = eth.Addr + ethName := eth.Name + dialer.Control = func(network string, address string, c syscall.RawConn) error { + var operr error + fn := func(fd uintptr) { + operr = syscall.SetsockoptString(int(fd), syscall.SOL_SOCKET, syscall.SO_BINDTODEVICE, ethName) + } + if err := c.Control(fn); err != nil { + return err + } + if operr != nil { + return operr + } + return nil + } + } + + tr := &http.Transport{ + DialContext: dialer.DialContext, + TLSHandshakeTimeout: global.Timeout, + IdleConnTimeout: global.Timeout, + } + tr.Proxy = http.ProxyFromEnvironment + return &Http{ + Client: tool.GenHttpClient(&tool.HttpClientOptions{ + Transport: tr, + Timeout: global.Timeout, + }), + } +}