Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0bccaedc3c | ||
|
|
be15ce5054 | ||
|
|
2d0326982b | ||
|
|
98c1dd17a0 | ||
|
|
bdba2365de | ||
|
|
ce0da5b557 | ||
|
|
3853201412 | ||
|
|
7003ef40a3 | ||
|
|
59ec92228c | ||
|
|
0eeb2da323 | ||
|
|
977b0fac02 | ||
|
|
51964801ff | ||
|
|
e08c052fc9 | ||
|
|
53927d8bbd | ||
|
|
968b9bc217 | ||
|
|
69dc87aa6d | ||
|
|
4193df375f |
2
.github/workflows/linux.yml
vendored
2
.github/workflows/linux.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
|||||||
EOF
|
EOF
|
||||||
echo "HOME=$HOME" >> "$GITHUB_ENV"
|
echo "HOME=$HOME" >> "$GITHUB_ENV"
|
||||||
- name: Publish release
|
- name: Publish release
|
||||||
uses: goreleaser/goreleaser-action@v5
|
uses: goreleaser/goreleaser-action@v6
|
||||||
with:
|
with:
|
||||||
distribution: goreleaser-pro
|
distribution: goreleaser-pro
|
||||||
version: latest
|
version: latest
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ nfpms:
|
|||||||
file_name_template: '{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ with .Arm }}v{{ . }}{{ end }}{{ with .Mips }}_{{ . }}{{ end }}{{ if not (eq .Amd64 "v1") }}{{ .Amd64 }}{{ end }}'
|
file_name_template: '{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ with .Arm }}v{{ . }}{{ end }}{{ with .Mips }}_{{ . }}{{ end }}{{ if not (eq .Amd64 "v1") }}{{ .Amd64 }}{{ end }}'
|
||||||
builds:
|
builds:
|
||||||
- main
|
- main
|
||||||
vendor: sagernet
|
|
||||||
homepage: https://sing-box.sagernet.org/
|
homepage: https://sing-box.sagernet.org/
|
||||||
maintainer: nekohasekai <contact-git@sekai.icu>
|
maintainer: nekohasekai <contact-git@sekai.icu>
|
||||||
description: The universal proxy platform.
|
description: The universal proxy platform.
|
||||||
|
|||||||
@@ -113,7 +113,6 @@ nfpms:
|
|||||||
file_name_template: '{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ with .Arm }}v{{ . }}{{ end }}{{ with .Mips }}_{{ . }}{{ end }}{{ if not (eq .Amd64 "v1") }}{{ .Amd64 }}{{ end }}'
|
file_name_template: '{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ with .Arm }}v{{ . }}{{ end }}{{ with .Mips }}_{{ . }}{{ end }}{{ if not (eq .Amd64 "v1") }}{{ .Amd64 }}{{ end }}'
|
||||||
builds:
|
builds:
|
||||||
- main
|
- main
|
||||||
vendor: sagernet
|
|
||||||
homepage: https://sing-box.sagernet.org/
|
homepage: https://sing-box.sagernet.org/
|
||||||
maintainer: nekohasekai <contact-git@sekai.icu>
|
maintainer: nekohasekai <contact-git@sekai.icu>
|
||||||
description: The universal proxy platform.
|
description: The universal proxy platform.
|
||||||
|
|||||||
@@ -93,7 +93,6 @@ type DNSRule interface {
|
|||||||
|
|
||||||
type RuleSet interface {
|
type RuleSet interface {
|
||||||
StartContext(ctx context.Context, startContext RuleSetStartContext) error
|
StartContext(ctx context.Context, startContext RuleSetStartContext) error
|
||||||
PostStart() error
|
|
||||||
Metadata() RuleSetMetadata
|
Metadata() RuleSetMetadata
|
||||||
Close() error
|
Close() error
|
||||||
HeadlessRule
|
HeadlessRule
|
||||||
|
|||||||
Submodule clients/android updated: e20fa632f6...8622e6a5bc
@@ -16,30 +16,40 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type LinuxSystemProxy struct {
|
type LinuxSystemProxy struct {
|
||||||
hasGSettings bool
|
hasGSettings bool
|
||||||
hasKWriteConfig5 bool
|
kWriteConfigCmd string
|
||||||
sudoUser string
|
sudoUser string
|
||||||
serverAddr M.Socksaddr
|
serverAddr M.Socksaddr
|
||||||
supportSOCKS bool
|
supportSOCKS bool
|
||||||
isEnabled bool
|
isEnabled bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSystemProxy(ctx context.Context, serverAddr M.Socksaddr, supportSOCKS bool) (*LinuxSystemProxy, error) {
|
func NewSystemProxy(ctx context.Context, serverAddr M.Socksaddr, supportSOCKS bool) (*LinuxSystemProxy, error) {
|
||||||
hasGSettings := common.Error(exec.LookPath("gsettings")) == nil
|
hasGSettings := common.Error(exec.LookPath("gsettings")) == nil
|
||||||
hasKWriteConfig5 := common.Error(exec.LookPath("kwriteconfig5")) == nil
|
kWriteConfigCmds := []string{
|
||||||
|
"kwriteconfig5",
|
||||||
|
"kwriteconfig6",
|
||||||
|
}
|
||||||
|
var kWriteConfigCmd string
|
||||||
|
for _, cmd := range kWriteConfigCmds {
|
||||||
|
if common.Error(exec.LookPath(cmd)) == nil {
|
||||||
|
kWriteConfigCmd = cmd
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
var sudoUser string
|
var sudoUser string
|
||||||
if os.Getuid() == 0 {
|
if os.Getuid() == 0 {
|
||||||
sudoUser = os.Getenv("SUDO_USER")
|
sudoUser = os.Getenv("SUDO_USER")
|
||||||
}
|
}
|
||||||
if !hasGSettings && !hasKWriteConfig5 {
|
if !hasGSettings && kWriteConfigCmd == "" {
|
||||||
return nil, E.New("unsupported desktop environment")
|
return nil, E.New("unsupported desktop environment")
|
||||||
}
|
}
|
||||||
return &LinuxSystemProxy{
|
return &LinuxSystemProxy{
|
||||||
hasGSettings: hasGSettings,
|
hasGSettings: hasGSettings,
|
||||||
hasKWriteConfig5: hasKWriteConfig5,
|
kWriteConfigCmd: kWriteConfigCmd,
|
||||||
sudoUser: sudoUser,
|
sudoUser: sudoUser,
|
||||||
serverAddr: serverAddr,
|
serverAddr: serverAddr,
|
||||||
supportSOCKS: supportSOCKS,
|
supportSOCKS: supportSOCKS,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,8 +80,8 @@ func (p *LinuxSystemProxy) Enable() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p.hasKWriteConfig5 {
|
if p.kWriteConfigCmd != "" {
|
||||||
err := p.runAsUser("kwriteconfig5", "--file", "kioslaverc", "--group", "Proxy Settings", "--key", "ProxyType", "1")
|
err := p.runAsUser(p.kWriteConfigCmd, "--file", "kioslaverc", "--group", "Proxy Settings", "--key", "ProxyType", "1")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -83,7 +93,7 @@ func (p *LinuxSystemProxy) Enable() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = p.runAsUser("kwriteconfig5", "--file", "kioslaverc", "--group", "Proxy Settings", "--key", "Authmode", "0")
|
err = p.runAsUser(p.kWriteConfigCmd, "--file", "kioslaverc", "--group", "Proxy Settings", "--key", "Authmode", "0")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -103,8 +113,8 @@ func (p *LinuxSystemProxy) Disable() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p.hasKWriteConfig5 {
|
if p.kWriteConfigCmd != "" {
|
||||||
err := p.runAsUser("kwriteconfig5", "--file", "kioslaverc", "--group", "Proxy Settings", "--key", "ProxyType", "0")
|
err := p.runAsUser(p.kWriteConfigCmd, "--file", "kioslaverc", "--group", "Proxy Settings", "--key", "ProxyType", "0")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -150,7 +160,7 @@ func (p *LinuxSystemProxy) setKDEProxy(proxyTypes ...string) error {
|
|||||||
proxyUrl = "http://" + p.serverAddr.String()
|
proxyUrl = "http://" + p.serverAddr.String()
|
||||||
}
|
}
|
||||||
err := p.runAsUser(
|
err := p.runAsUser(
|
||||||
"kwriteconfig5",
|
p.kWriteConfigCmd,
|
||||||
"--file",
|
"--file",
|
||||||
"kioslaverc",
|
"kioslaverc",
|
||||||
"--group",
|
"--group",
|
||||||
|
|||||||
@@ -2,6 +2,14 @@
|
|||||||
icon: material/alert-decagram
|
icon: material/alert-decagram
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### 1.9.2
|
||||||
|
|
||||||
|
* Fixes and improvements
|
||||||
|
|
||||||
|
### 1.9.1
|
||||||
|
|
||||||
|
* Fixes and improvements
|
||||||
|
|
||||||
### 1.9.0
|
### 1.9.0
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|||||||
@@ -16,25 +16,18 @@ func (s *BoxService) Pause() {
|
|||||||
if s.pauseTimer != nil {
|
if s.pauseTimer != nil {
|
||||||
s.pauseTimer.Stop()
|
s.pauseTimer.Stop()
|
||||||
}
|
}
|
||||||
s.pauseTimer = time.AfterFunc(time.Minute, s.pause)
|
s.pauseTimer = time.AfterFunc(3*time.Second, s.ResetNetwork)
|
||||||
}
|
|
||||||
|
|
||||||
func (s *BoxService) pause() {
|
|
||||||
s.pauseAccess.Lock()
|
|
||||||
defer s.pauseAccess.Unlock()
|
|
||||||
s.pauseManager.DevicePause()
|
|
||||||
_ = s.instance.Router().ResetNetwork()
|
|
||||||
s.pauseTimer = nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *BoxService) Wake() {
|
func (s *BoxService) Wake() {
|
||||||
_ = s.instance.Router().ResetNetwork()
|
|
||||||
s.pauseAccess.Lock()
|
s.pauseAccess.Lock()
|
||||||
defer s.pauseAccess.Unlock()
|
defer s.pauseAccess.Unlock()
|
||||||
if s.pauseTimer != nil {
|
if s.pauseTimer != nil {
|
||||||
s.pauseTimer.Stop()
|
s.pauseTimer.Stop()
|
||||||
s.pauseTimer = nil
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
s.pauseManager.DeviceWake()
|
s.pauseTimer = time.AfterFunc(3*time.Minute, s.ResetNetwork)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *BoxService) ResetNetwork() {
|
||||||
|
_ = s.instance.Router().ResetNetwork()
|
||||||
}
|
}
|
||||||
|
|||||||
8
go.mod
8
go.mod
@@ -26,14 +26,14 @@ require (
|
|||||||
github.com/sagernet/gvisor v0.0.0-20240428053021-e691de28565f
|
github.com/sagernet/gvisor v0.0.0-20240428053021-e691de28565f
|
||||||
github.com/sagernet/quic-go v0.43.1-beta.1
|
github.com/sagernet/quic-go v0.43.1-beta.1
|
||||||
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691
|
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691
|
||||||
github.com/sagernet/sing v0.4.0-beta.20
|
github.com/sagernet/sing v0.4.1
|
||||||
github.com/sagernet/sing-dns v0.2.0-beta.18
|
github.com/sagernet/sing-dns v0.2.0
|
||||||
github.com/sagernet/sing-mux v0.2.0
|
github.com/sagernet/sing-mux v0.2.0
|
||||||
github.com/sagernet/sing-quic v0.2.0-beta.5
|
github.com/sagernet/sing-quic v0.2.0-beta.5
|
||||||
github.com/sagernet/sing-shadowsocks v0.2.6
|
github.com/sagernet/sing-shadowsocks v0.2.6
|
||||||
github.com/sagernet/sing-shadowsocks2 v0.2.0
|
github.com/sagernet/sing-shadowsocks2 v0.2.0
|
||||||
github.com/sagernet/sing-shadowtls v0.1.4
|
github.com/sagernet/sing-shadowtls v0.1.4
|
||||||
github.com/sagernet/sing-tun v0.3.0-beta.6
|
github.com/sagernet/sing-tun v0.3.2
|
||||||
github.com/sagernet/sing-vmess v0.1.8
|
github.com/sagernet/sing-vmess v0.1.8
|
||||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7
|
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7
|
||||||
github.com/sagernet/tfo-go v0.0.0-20231209031829-7b5343ac1dc6
|
github.com/sagernet/tfo-go v0.0.0-20231209031829-7b5343ac1dc6
|
||||||
@@ -46,7 +46,7 @@ require (
|
|||||||
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba
|
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba
|
||||||
golang.org/x/crypto v0.23.0
|
golang.org/x/crypto v0.23.0
|
||||||
golang.org/x/net v0.25.0
|
golang.org/x/net v0.25.0
|
||||||
golang.org/x/sys v0.20.0
|
golang.org/x/sys v0.21.0
|
||||||
golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6
|
golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6
|
||||||
google.golang.org/grpc v1.63.2
|
google.golang.org/grpc v1.63.2
|
||||||
google.golang.org/protobuf v1.33.0
|
google.golang.org/protobuf v1.33.0
|
||||||
|
|||||||
16
go.sum
16
go.sum
@@ -106,10 +106,10 @@ github.com/sagernet/quic-go v0.43.1-beta.1/go.mod h1:BkrQYeop7Jx3hN3TW8/76CXcdhY
|
|||||||
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 h1:5Th31OC6yj8byLGkEnIYp6grlXfo1QYUfiYFGjewIdc=
|
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 h1:5Th31OC6yj8byLGkEnIYp6grlXfo1QYUfiYFGjewIdc=
|
||||||
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4WkQ1PwNnrVMM6KyuFR20pU8jYBD+A4EhJovEXU=
|
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4WkQ1PwNnrVMM6KyuFR20pU8jYBD+A4EhJovEXU=
|
||||||
github.com/sagernet/sing v0.2.18/go.mod h1:OL6k2F0vHmEzXz2KW19qQzu172FDgSbUSODylighuVo=
|
github.com/sagernet/sing v0.2.18/go.mod h1:OL6k2F0vHmEzXz2KW19qQzu172FDgSbUSODylighuVo=
|
||||||
github.com/sagernet/sing v0.4.0-beta.20 h1:8rEepj4LMcR0Wd389fJIziv/jr3MBtX5qXBHsfxJ+dY=
|
github.com/sagernet/sing v0.4.1 h1:zVlpE+7k7AFoC2pv6ReqLf0PIHjihL/jsBl5k05PQFk=
|
||||||
github.com/sagernet/sing v0.4.0-beta.20/go.mod h1:PFQKbElc2Pke7faBLv8oEba5ehtKO21Ho+TkYemTI3Y=
|
github.com/sagernet/sing v0.4.1/go.mod h1:ieZHA/+Y9YZfXs2I3WtuwgyCZ6GPsIR7HdKb1SdEnls=
|
||||||
github.com/sagernet/sing-dns v0.2.0-beta.18 h1:6vzXZThRdA7YUzBOpSbUT48XRumtl/KIpIHFSOP0za8=
|
github.com/sagernet/sing-dns v0.2.0 h1:dka3weRX6+CrYO3v+hrTy2z68rCOCZXNBiNXpLZ6JNs=
|
||||||
github.com/sagernet/sing-dns v0.2.0-beta.18/go.mod h1:k/dmFcQpg6+m08gC1yQBy+13+QkuLqpKr4bIreq4U24=
|
github.com/sagernet/sing-dns v0.2.0/go.mod h1:BJpJv6XLnrUbSyIntOT6DG9FW0f4fETmPAHvNjOprLg=
|
||||||
github.com/sagernet/sing-mux v0.2.0 h1:4C+vd8HztJCWNYfufvgL49xaOoOHXty2+EAjnzN3IYo=
|
github.com/sagernet/sing-mux v0.2.0 h1:4C+vd8HztJCWNYfufvgL49xaOoOHXty2+EAjnzN3IYo=
|
||||||
github.com/sagernet/sing-mux v0.2.0/go.mod h1:khzr9AOPocLa+g53dBplwNDz4gdsyx/YM3swtAhlkHQ=
|
github.com/sagernet/sing-mux v0.2.0/go.mod h1:khzr9AOPocLa+g53dBplwNDz4gdsyx/YM3swtAhlkHQ=
|
||||||
github.com/sagernet/sing-quic v0.2.0-beta.5 h1:ceKFLd1iS5AtM+pScKmcDp5k7R6WgYIe8vl6nB0aVsE=
|
github.com/sagernet/sing-quic v0.2.0-beta.5 h1:ceKFLd1iS5AtM+pScKmcDp5k7R6WgYIe8vl6nB0aVsE=
|
||||||
@@ -120,8 +120,8 @@ github.com/sagernet/sing-shadowsocks2 v0.2.0 h1:wpZNs6wKnR7mh1wV9OHwOyUr21VkS3wK
|
|||||||
github.com/sagernet/sing-shadowsocks2 v0.2.0/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ=
|
github.com/sagernet/sing-shadowsocks2 v0.2.0/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ=
|
||||||
github.com/sagernet/sing-shadowtls v0.1.4 h1:aTgBSJEgnumzFenPvc+kbD9/W0PywzWevnVpEx6Tw3k=
|
github.com/sagernet/sing-shadowtls v0.1.4 h1:aTgBSJEgnumzFenPvc+kbD9/W0PywzWevnVpEx6Tw3k=
|
||||||
github.com/sagernet/sing-shadowtls v0.1.4/go.mod h1:F8NBgsY5YN2beQavdgdm1DPlhaKQlaL6lpDdcBglGK4=
|
github.com/sagernet/sing-shadowtls v0.1.4/go.mod h1:F8NBgsY5YN2beQavdgdm1DPlhaKQlaL6lpDdcBglGK4=
|
||||||
github.com/sagernet/sing-tun v0.3.0-beta.6 h1:L11kMrM7UfUW0pzQiU66Fffh4o86KZc1SFGbkYi8Ma8=
|
github.com/sagernet/sing-tun v0.3.2 h1:z0bLUT/YXH9RrJS9DsIpB0Bb9afl2hVJOmHd0zA3HJY=
|
||||||
github.com/sagernet/sing-tun v0.3.0-beta.6/go.mod h1:DxLIyhjWU/HwGYoX0vNGg2c5QgTQIakphU1MuERR5tQ=
|
github.com/sagernet/sing-tun v0.3.2/go.mod h1:DxLIyhjWU/HwGYoX0vNGg2c5QgTQIakphU1MuERR5tQ=
|
||||||
github.com/sagernet/sing-vmess v0.1.8 h1:XVWad1RpTy9b5tPxdm5MCU8cGfrTGdR8qCq6HV2aCNc=
|
github.com/sagernet/sing-vmess v0.1.8 h1:XVWad1RpTy9b5tPxdm5MCU8cGfrTGdR8qCq6HV2aCNc=
|
||||||
github.com/sagernet/sing-vmess v0.1.8/go.mod h1:vhx32UNzTDUkNwOyIjcZQohre1CaytquC5mPplId8uA=
|
github.com/sagernet/sing-vmess v0.1.8/go.mod h1:vhx32UNzTDUkNwOyIjcZQohre1CaytquC5mPplId8uA=
|
||||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ=
|
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ=
|
||||||
@@ -184,8 +184,8 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|||||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
|
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
|
||||||
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
|
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import (
|
|||||||
"github.com/sagernet/sing-box/transport/wireguard"
|
"github.com/sagernet/sing-box/transport/wireguard"
|
||||||
"github.com/sagernet/sing-dns"
|
"github.com/sagernet/sing-dns"
|
||||||
"github.com/sagernet/sing-tun"
|
"github.com/sagernet/sing-tun"
|
||||||
|
"github.com/sagernet/sing/common"
|
||||||
E "github.com/sagernet/sing/common/exceptions"
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
M "github.com/sagernet/sing/common/metadata"
|
M "github.com/sagernet/sing/common/metadata"
|
||||||
N "github.com/sagernet/sing/common/network"
|
N "github.com/sagernet/sing/common/network"
|
||||||
@@ -111,6 +112,25 @@ func NewWireGuard(ctx context.Context, router adapter.Router, logger log.Context
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (w *WireGuard) Start() error {
|
func (w *WireGuard) Start() error {
|
||||||
|
if common.Any(w.peers, func(peer wireguard.PeerConfig) bool {
|
||||||
|
return !peer.Endpoint.IsValid()
|
||||||
|
}) {
|
||||||
|
// wait for all outbounds to be started and continue in PortStart
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return w.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WireGuard) PostStart() error {
|
||||||
|
if common.All(w.peers, func(peer wireguard.PeerConfig) bool {
|
||||||
|
return peer.Endpoint.IsValid()
|
||||||
|
}) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return w.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WireGuard) start() error {
|
||||||
err := wireguard.ResolvePeers(w.ctx, w.router, w.peers)
|
err := wireguard.ResolvePeers(w.ctx, w.router, w.peers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
215
route/router.go
215
route/router.go
@@ -221,7 +221,7 @@ func NewRouter(
|
|||||||
if serverAddress == "" {
|
if serverAddress == "" {
|
||||||
serverAddress = server.Address
|
serverAddress = server.Address
|
||||||
}
|
}
|
||||||
_, notIpAddress := netip.ParseAddr(serverAddress)
|
notIpAddress := !M.ParseSocksaddr(serverAddress).Addr.IsValid()
|
||||||
if server.AddressResolver != "" {
|
if server.AddressResolver != "" {
|
||||||
if !transportTagMap[server.AddressResolver] {
|
if !transportTagMap[server.AddressResolver] {
|
||||||
return nil, E.New("parse dns server[", tag, "]: address resolver not found: ", server.AddressResolver)
|
return nil, E.New("parse dns server[", tag, "]: address resolver not found: ", server.AddressResolver)
|
||||||
@@ -231,7 +231,7 @@ func NewRouter(
|
|||||||
} else {
|
} else {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
} else if notIpAddress != nil && strings.Contains(server.Address, ".") {
|
} else if notIpAddress && strings.Contains(server.Address, ".") {
|
||||||
return nil, E.New("parse dns server[", tag, "]: missing address_resolver")
|
return nil, E.New("parse dns server[", tag, "]: missing address_resolver")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -352,14 +352,6 @@ func NewRouter(
|
|||||||
router.interfaceMonitor = interfaceMonitor
|
router.interfaceMonitor = interfaceMonitor
|
||||||
}
|
}
|
||||||
|
|
||||||
if runtime.GOOS == "windows" {
|
|
||||||
powerListener, err := winpowrprof.NewEventListener(router.notifyWindowsPowerEvent)
|
|
||||||
if err != nil {
|
|
||||||
return nil, E.Cause(err, "initialize power listener")
|
|
||||||
}
|
|
||||||
router.powerListener = powerListener
|
|
||||||
}
|
|
||||||
|
|
||||||
if ntpOptions.Enabled {
|
if ntpOptions.Enabled {
|
||||||
ntpDialer, err := dialer.New(router, ntpOptions.DialerOptions)
|
ntpDialer, err := dialer.New(router, ntpOptions.DialerOptions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -402,20 +394,17 @@ func (r *Router) Initialize(inbounds []adapter.Inbound, outbounds []adapter.Outb
|
|||||||
defaultOutboundForPacketConnection = detour
|
defaultOutboundForPacketConnection = detour
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var index, packetIndex int
|
|
||||||
if defaultOutboundForConnection == nil {
|
if defaultOutboundForConnection == nil {
|
||||||
for i, detour := range outbounds {
|
for _, detour := range outbounds {
|
||||||
if common.Contains(detour.Network(), N.NetworkTCP) {
|
if common.Contains(detour.Network(), N.NetworkTCP) {
|
||||||
index = i
|
|
||||||
defaultOutboundForConnection = detour
|
defaultOutboundForConnection = detour
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if defaultOutboundForPacketConnection == nil {
|
if defaultOutboundForPacketConnection == nil {
|
||||||
for i, detour := range outbounds {
|
for _, detour := range outbounds {
|
||||||
if common.Contains(detour.Network(), N.NetworkUDP) {
|
if common.Contains(detour.Network(), N.NetworkUDP) {
|
||||||
packetIndex = i
|
|
||||||
defaultOutboundForPacketConnection = detour
|
defaultOutboundForPacketConnection = detour
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -432,22 +421,6 @@ func (r *Router) Initialize(inbounds []adapter.Inbound, outbounds []adapter.Outb
|
|||||||
outbounds = append(outbounds, detour)
|
outbounds = append(outbounds, detour)
|
||||||
outboundByTag[detour.Tag()] = detour
|
outboundByTag[detour.Tag()] = detour
|
||||||
}
|
}
|
||||||
if defaultOutboundForConnection != defaultOutboundForPacketConnection {
|
|
||||||
var description string
|
|
||||||
if defaultOutboundForConnection.Tag() != "" {
|
|
||||||
description = defaultOutboundForConnection.Tag()
|
|
||||||
} else {
|
|
||||||
description = F.ToString(index)
|
|
||||||
}
|
|
||||||
var packetDescription string
|
|
||||||
if defaultOutboundForPacketConnection.Tag() != "" {
|
|
||||||
packetDescription = defaultOutboundForPacketConnection.Tag()
|
|
||||||
} else {
|
|
||||||
packetDescription = F.ToString(packetIndex)
|
|
||||||
}
|
|
||||||
r.logger.Info("using ", defaultOutboundForConnection.Type(), "[", description, "] as default outbound for connection")
|
|
||||||
r.logger.Info("using ", defaultOutboundForPacketConnection.Type(), "[", packetDescription, "] as default outbound for packet connection")
|
|
||||||
}
|
|
||||||
r.inboundByTag = inboundByTag
|
r.inboundByTag = inboundByTag
|
||||||
r.outbounds = outbounds
|
r.outbounds = outbounds
|
||||||
r.defaultOutboundForConnection = defaultOutboundForConnection
|
r.defaultOutboundForConnection = defaultOutboundForConnection
|
||||||
@@ -536,75 +509,12 @@ func (r *Router) Start() error {
|
|||||||
r.geositeReader = nil
|
r.geositeReader = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(r.ruleSets) > 0 {
|
if runtime.GOOS == "windows" {
|
||||||
monitor.Start("initialize rule-set")
|
powerListener, err := winpowrprof.NewEventListener(r.notifyWindowsPowerEvent)
|
||||||
ruleSetStartContext := NewRuleSetStartContext()
|
if err == nil {
|
||||||
var ruleSetStartGroup task.Group
|
r.powerListener = powerListener
|
||||||
for i, ruleSet := range r.ruleSets {
|
|
||||||
ruleSetInPlace := ruleSet
|
|
||||||
ruleSetStartGroup.Append0(func(ctx context.Context) error {
|
|
||||||
err := ruleSetInPlace.StartContext(ctx, ruleSetStartContext)
|
|
||||||
if err != nil {
|
|
||||||
return E.Cause(err, "initialize rule-set[", i, "]")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
}
|
|
||||||
ruleSetStartGroup.Concurrency(5)
|
|
||||||
ruleSetStartGroup.FastFail()
|
|
||||||
err := ruleSetStartGroup.Run(r.ctx)
|
|
||||||
monitor.Finish()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
ruleSetStartContext.Close()
|
|
||||||
}
|
|
||||||
var (
|
|
||||||
needProcessFromRuleSet bool
|
|
||||||
needWIFIStateFromRuleSet bool
|
|
||||||
)
|
|
||||||
for _, ruleSet := range r.ruleSets {
|
|
||||||
metadata := ruleSet.Metadata()
|
|
||||||
if metadata.ContainsProcessRule {
|
|
||||||
needProcessFromRuleSet = true
|
|
||||||
}
|
|
||||||
if metadata.ContainsWIFIRule {
|
|
||||||
needWIFIStateFromRuleSet = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if needProcessFromRuleSet || r.needFindProcess || r.needPackageManager {
|
|
||||||
if C.IsAndroid && r.platformInterface == nil {
|
|
||||||
monitor.Start("initialize package manager")
|
|
||||||
packageManager, err := tun.NewPackageManager(r)
|
|
||||||
monitor.Finish()
|
|
||||||
if err != nil {
|
|
||||||
return E.Cause(err, "create package manager")
|
|
||||||
}
|
|
||||||
monitor.Start("start package manager")
|
|
||||||
err = packageManager.Start()
|
|
||||||
monitor.Finish()
|
|
||||||
if err != nil {
|
|
||||||
return E.Cause(err, "start package manager")
|
|
||||||
}
|
|
||||||
r.packageManager = packageManager
|
|
||||||
}
|
|
||||||
|
|
||||||
if r.platformInterface != nil {
|
|
||||||
r.processSearcher = r.platformInterface
|
|
||||||
} else {
|
} else {
|
||||||
monitor.Start("initialize process searcher")
|
r.logger.Warn("initialize power listener: ", err)
|
||||||
searcher, err := process.NewSearcher(process.Config{
|
|
||||||
Logger: r.logger,
|
|
||||||
PackageManager: r.packageManager,
|
|
||||||
})
|
|
||||||
monitor.Finish()
|
|
||||||
if err != nil {
|
|
||||||
if err != os.ErrInvalid {
|
|
||||||
r.logger.Warn(E.Cause(err, "create process searcher"))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
r.processSearcher = searcher
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -617,25 +527,6 @@ func (r *Router) Start() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (needWIFIStateFromRuleSet || r.needWIFIState) && r.platformInterface != nil {
|
|
||||||
monitor.Start("initialize WIFI state")
|
|
||||||
r.needWIFIState = true
|
|
||||||
r.interfaceMonitor.RegisterCallback(func(_ int) {
|
|
||||||
r.updateWIFIState()
|
|
||||||
})
|
|
||||||
r.updateWIFIState()
|
|
||||||
monitor.Finish()
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, rule := range r.rules {
|
|
||||||
monitor.Start("initialize rule[", i, "]")
|
|
||||||
err := rule.Start()
|
|
||||||
monitor.Finish()
|
|
||||||
if err != nil {
|
|
||||||
return E.Cause(err, "initialize rule[", i, "]")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
monitor.Start("initialize DNS client")
|
monitor.Start("initialize DNS client")
|
||||||
r.dnsClient.Start()
|
r.dnsClient.Start()
|
||||||
monitor.Finish()
|
monitor.Finish()
|
||||||
@@ -744,12 +635,93 @@ func (r *Router) Close() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *Router) PostStart() error {
|
func (r *Router) PostStart() error {
|
||||||
|
monitor := taskmonitor.New(r.logger, C.StopTimeout)
|
||||||
if len(r.ruleSets) > 0 {
|
if len(r.ruleSets) > 0 {
|
||||||
|
monitor.Start("initialize rule-set")
|
||||||
|
ruleSetStartContext := NewRuleSetStartContext()
|
||||||
|
var ruleSetStartGroup task.Group
|
||||||
for i, ruleSet := range r.ruleSets {
|
for i, ruleSet := range r.ruleSets {
|
||||||
err := ruleSet.PostStart()
|
ruleSetInPlace := ruleSet
|
||||||
|
ruleSetStartGroup.Append0(func(ctx context.Context) error {
|
||||||
|
err := ruleSetInPlace.StartContext(ctx, ruleSetStartContext)
|
||||||
|
if err != nil {
|
||||||
|
return E.Cause(err, "initialize rule-set[", i, "]")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
ruleSetStartGroup.Concurrency(5)
|
||||||
|
ruleSetStartGroup.FastFail()
|
||||||
|
err := ruleSetStartGroup.Run(r.ctx)
|
||||||
|
monitor.Finish()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
ruleSetStartContext.Close()
|
||||||
|
}
|
||||||
|
var (
|
||||||
|
needProcessFromRuleSet bool
|
||||||
|
needWIFIStateFromRuleSet bool
|
||||||
|
)
|
||||||
|
for _, ruleSet := range r.ruleSets {
|
||||||
|
metadata := ruleSet.Metadata()
|
||||||
|
if metadata.ContainsProcessRule {
|
||||||
|
needProcessFromRuleSet = true
|
||||||
|
}
|
||||||
|
if metadata.ContainsWIFIRule {
|
||||||
|
needWIFIStateFromRuleSet = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if needProcessFromRuleSet || r.needFindProcess || r.needPackageManager {
|
||||||
|
if C.IsAndroid && r.platformInterface == nil {
|
||||||
|
monitor.Start("initialize package manager")
|
||||||
|
packageManager, err := tun.NewPackageManager(r)
|
||||||
|
monitor.Finish()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return E.Cause(err, "post start rule-set[", i, "]")
|
return E.Cause(err, "create package manager")
|
||||||
}
|
}
|
||||||
|
monitor.Start("start package manager")
|
||||||
|
err = packageManager.Start()
|
||||||
|
monitor.Finish()
|
||||||
|
if err != nil {
|
||||||
|
return E.Cause(err, "start package manager")
|
||||||
|
}
|
||||||
|
r.packageManager = packageManager
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.platformInterface != nil {
|
||||||
|
r.processSearcher = r.platformInterface
|
||||||
|
} else {
|
||||||
|
monitor.Start("initialize process searcher")
|
||||||
|
searcher, err := process.NewSearcher(process.Config{
|
||||||
|
Logger: r.logger,
|
||||||
|
PackageManager: r.packageManager,
|
||||||
|
})
|
||||||
|
monitor.Finish()
|
||||||
|
if err != nil {
|
||||||
|
if err != os.ErrInvalid {
|
||||||
|
r.logger.Warn(E.Cause(err, "create process searcher"))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
r.processSearcher = searcher
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (needWIFIStateFromRuleSet || r.needWIFIState) && r.platformInterface != nil {
|
||||||
|
monitor.Start("initialize WIFI state")
|
||||||
|
r.needWIFIState = true
|
||||||
|
r.interfaceMonitor.RegisterCallback(func(_ int) {
|
||||||
|
r.updateWIFIState()
|
||||||
|
})
|
||||||
|
r.updateWIFIState()
|
||||||
|
monitor.Finish()
|
||||||
|
}
|
||||||
|
for i, rule := range r.rules {
|
||||||
|
monitor.Start("initialize rule[", i, "]")
|
||||||
|
err := rule.Start()
|
||||||
|
monitor.Finish()
|
||||||
|
if err != nil {
|
||||||
|
return E.Cause(err, "initialize rule[", i, "]")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
r.started = true
|
r.started = true
|
||||||
@@ -1121,6 +1093,9 @@ func (r *Router) AutoDetectInterfaceFunc() control.Func {
|
|||||||
if r.platformInterface != nil && r.platformInterface.UsePlatformAutoDetectInterfaceControl() {
|
if r.platformInterface != nil && r.platformInterface.UsePlatformAutoDetectInterfaceControl() {
|
||||||
return r.platformInterface.AutoDetectInterfaceControl()
|
return r.platformInterface.AutoDetectInterfaceControl()
|
||||||
} else {
|
} else {
|
||||||
|
if r.interfaceMonitor == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
return control.BindToInterfaceFunc(r.InterfaceFinder(), func(network string, address string) (interfaceName string, interfaceIndex int, err error) {
|
return control.BindToInterfaceFunc(r.InterfaceFinder(), func(network string, address string) (interfaceName string, interfaceIndex int, err error) {
|
||||||
remoteAddr := M.ParseSocksaddr(address).Addr
|
remoteAddr := M.ParseSocksaddr(address).Addr
|
||||||
if C.IsLinux {
|
if C.IsLinux {
|
||||||
|
|||||||
@@ -78,10 +78,6 @@ func (s *LocalRuleSet) StartContext(ctx context.Context, startContext adapter.Ru
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *LocalRuleSet) PostStart() error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LocalRuleSet) Metadata() adapter.RuleSetMetadata {
|
func (s *LocalRuleSet) Metadata() adapter.RuleSetMetadata {
|
||||||
return s.metadata
|
return s.metadata
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -112,16 +112,6 @@ func (s *RemoteRuleSet) StartContext(ctx context.Context, startContext adapter.R
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *RemoteRuleSet) PostStart() error {
|
|
||||||
if s.lastUpdated.IsZero() {
|
|
||||||
err := s.fetchOnce(s.ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
s.logger.Error("fetch rule-set ", s.options.Tag, ": ", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *RemoteRuleSet) Metadata() adapter.RuleSetMetadata {
|
func (s *RemoteRuleSet) Metadata() adapter.RuleSetMetadata {
|
||||||
return s.metadata
|
return s.metadata
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ import (
|
|||||||
E "github.com/sagernet/sing/common/exceptions"
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
M "github.com/sagernet/sing/common/metadata"
|
M "github.com/sagernet/sing/common/metadata"
|
||||||
N "github.com/sagernet/sing/common/network"
|
N "github.com/sagernet/sing/common/network"
|
||||||
|
"github.com/sagernet/sing/service"
|
||||||
|
"github.com/sagernet/sing/service/pause"
|
||||||
"github.com/sagernet/wireguard-go/conn"
|
"github.com/sagernet/wireguard-go/conn"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -19,6 +21,9 @@ var _ conn.Bind = (*ClientBind)(nil)
|
|||||||
|
|
||||||
type ClientBind struct {
|
type ClientBind struct {
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
|
pauseManager pause.Manager
|
||||||
|
bindCtx context.Context
|
||||||
|
bindDone context.CancelFunc
|
||||||
errorHandler E.Handler
|
errorHandler E.Handler
|
||||||
dialer N.Dialer
|
dialer N.Dialer
|
||||||
reservedForEndpoint map[netip.AddrPort][3]uint8
|
reservedForEndpoint map[netip.AddrPort][3]uint8
|
||||||
@@ -33,6 +38,7 @@ type ClientBind struct {
|
|||||||
func NewClientBind(ctx context.Context, errorHandler E.Handler, dialer N.Dialer, isConnect bool, connectAddr netip.AddrPort, reserved [3]uint8) *ClientBind {
|
func NewClientBind(ctx context.Context, errorHandler E.Handler, dialer N.Dialer, isConnect bool, connectAddr netip.AddrPort, reserved [3]uint8) *ClientBind {
|
||||||
return &ClientBind{
|
return &ClientBind{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
|
pauseManager: service.FromContext[pause.Manager](ctx),
|
||||||
errorHandler: errorHandler,
|
errorHandler: errorHandler,
|
||||||
dialer: dialer,
|
dialer: dialer,
|
||||||
reservedForEndpoint: make(map[netip.AddrPort][3]uint8),
|
reservedForEndpoint: make(map[netip.AddrPort][3]uint8),
|
||||||
@@ -55,6 +61,11 @@ func (c *ClientBind) connect() (*wireConn, error) {
|
|||||||
}
|
}
|
||||||
c.connAccess.Lock()
|
c.connAccess.Lock()
|
||||||
defer c.connAccess.Unlock()
|
defer c.connAccess.Unlock()
|
||||||
|
select {
|
||||||
|
case <-c.done:
|
||||||
|
return nil, net.ErrClosed
|
||||||
|
default:
|
||||||
|
}
|
||||||
serverConn = c.conn
|
serverConn = c.conn
|
||||||
if serverConn != nil {
|
if serverConn != nil {
|
||||||
select {
|
select {
|
||||||
@@ -65,7 +76,7 @@ func (c *ClientBind) connect() (*wireConn, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if c.isConnect {
|
if c.isConnect {
|
||||||
udpConn, err := c.dialer.DialContext(c.ctx, N.NetworkUDP, M.SocksaddrFromNetIP(c.connectAddr))
|
udpConn, err := c.dialer.DialContext(c.bindCtx, N.NetworkUDP, M.SocksaddrFromNetIP(c.connectAddr))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -74,7 +85,7 @@ func (c *ClientBind) connect() (*wireConn, error) {
|
|||||||
done: make(chan struct{}),
|
done: make(chan struct{}),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
udpConn, err := c.dialer.ListenPacket(c.ctx, M.Socksaddr{Addr: netip.IPv4Unspecified()})
|
udpConn, err := c.dialer.ListenPacket(c.bindCtx, M.Socksaddr{Addr: netip.IPv4Unspecified()})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -92,6 +103,7 @@ func (c *ClientBind) Open(port uint16) (fns []conn.ReceiveFunc, actualPort uint1
|
|||||||
c.done = make(chan struct{})
|
c.done = make(chan struct{})
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
|
c.bindCtx, c.bindDone = context.WithCancel(c.ctx)
|
||||||
return []conn.ReceiveFunc{c.receive}, 0, nil
|
return []conn.ReceiveFunc{c.receive}, 0, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,6 +117,7 @@ func (c *ClientBind) receive(packets [][]byte, sizes []int, eps []conn.Endpoint)
|
|||||||
}
|
}
|
||||||
c.errorHandler.NewError(context.Background(), E.Cause(err, "connect to server"))
|
c.errorHandler.NewError(context.Background(), E.Cause(err, "connect to server"))
|
||||||
err = nil
|
err = nil
|
||||||
|
c.pauseManager.WaitActive()
|
||||||
time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -130,12 +143,17 @@ func (c *ClientBind) receive(packets [][]byte, sizes []int, eps []conn.Endpoint)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *ClientBind) Close() error {
|
func (c *ClientBind) Close() error {
|
||||||
common.Close(common.PtrOrNil(c.conn))
|
|
||||||
select {
|
select {
|
||||||
case <-c.done:
|
case <-c.done:
|
||||||
default:
|
default:
|
||||||
close(c.done)
|
close(c.done)
|
||||||
}
|
}
|
||||||
|
if c.bindDone != nil {
|
||||||
|
c.bindDone()
|
||||||
|
}
|
||||||
|
c.connAccess.Lock()
|
||||||
|
defer c.connAccess.Unlock()
|
||||||
|
common.Close(common.PtrOrNil(c.conn))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,6 +164,8 @@ func (c *ClientBind) SetMark(mark uint32) error {
|
|||||||
func (c *ClientBind) Send(bufs [][]byte, ep conn.Endpoint) error {
|
func (c *ClientBind) Send(bufs [][]byte, ep conn.Endpoint) error {
|
||||||
udpConn, err := c.connect()
|
udpConn, err := c.connect()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
c.pauseManager.WaitActive()
|
||||||
|
time.Sleep(time.Second)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
destination := netip.AddrPort(ep.(Endpoint))
|
destination := netip.AddrPort(ep.(Endpoint))
|
||||||
|
|||||||
Reference in New Issue
Block a user