mirror of
https://github.com/Mahdi-zarei/nekoray.git
synced 2025-12-26 03:11:21 +08:00
fix macOS dns issue
fix error handling fix bash Try fixing mac os dns set
This commit is contained in:
parent
3e97e094fb
commit
8970446508
@ -15,6 +15,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var instance *boxbox.Box
|
var instance *boxbox.Box
|
||||||
|
var needUnsetDNS bool
|
||||||
var systemProxyController settings.SystemProxy
|
var systemProxyController settings.SystemProxy
|
||||||
var systemProxyAddr metadata.Socksaddr
|
var systemProxyAddr metadata.Socksaddr
|
||||||
var instance_cancel context.CancelFunc
|
var instance_cancel context.CancelFunc
|
||||||
|
|||||||
@ -8,9 +8,11 @@ import (
|
|||||||
"github.com/sagernet/sing-box/experimental/clashapi"
|
"github.com/sagernet/sing-box/experimental/clashapi"
|
||||||
"github.com/sagernet/sing/common/metadata"
|
"github.com/sagernet/sing/common/metadata"
|
||||||
"nekobox_core/internal/boxbox"
|
"nekobox_core/internal/boxbox"
|
||||||
|
"nekobox_core/internal/sys"
|
||||||
grpc_server "nekobox_core/server"
|
grpc_server "nekobox_core/server"
|
||||||
"nekobox_core/server/gen"
|
"nekobox_core/server/gen"
|
||||||
"os"
|
"os"
|
||||||
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -48,6 +50,13 @@ func (s *server) Start(ctx context.Context, in *gen.LoadConfigReq) (out *gen.Err
|
|||||||
}
|
}
|
||||||
|
|
||||||
instance, instance_cancel, err = boxmain.Create([]byte(in.CoreConfig))
|
instance, instance_cancel, err = boxmain.Create([]byte(in.CoreConfig))
|
||||||
|
if runtime.GOOS == "darwin" && strings.Contains(in.CoreConfig, "utun") && err == nil {
|
||||||
|
err := sys.SetSystemDNS("192.18.0.2", instance.Router().InterfaceMonitor())
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Failed to set system DNS:", err)
|
||||||
|
}
|
||||||
|
needUnsetDNS = true
|
||||||
|
}
|
||||||
|
|
||||||
if instance != nil {
|
if instance != nil {
|
||||||
// Logger
|
// Logger
|
||||||
@ -78,6 +87,13 @@ func (s *server) Stop(ctx context.Context, in *gen.EmptyReq) (out *gen.ErrorResp
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if needUnsetDNS {
|
||||||
|
needUnsetDNS = false
|
||||||
|
err := sys.SetSystemDNS("Empty", instance.Router().InterfaceMonitor())
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Failed to unset system DNS:", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
instance.CloseWithTimeout(instance_cancel, time.Second*2, log.Println)
|
instance.CloseWithTimeout(instance_cancel, time.Second*2, log.Println)
|
||||||
|
|
||||||
instance = nil
|
instance = nil
|
||||||
|
|||||||
40
core/cmd/nekobox_core/internal/sys/set_dns_darwin.go
Normal file
40
core/cmd/nekobox_core/internal/sys/set_dns_darwin.go
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
package sys
|
||||||
|
|
||||||
|
import (
|
||||||
|
tun "github.com/sagernet/sing-tun"
|
||||||
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
|
"github.com/sagernet/sing/common/shell"
|
||||||
|
"net/netip"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SetSystemDNS(addr string, interfaceMonitor tun.DefaultInterfaceMonitor) error {
|
||||||
|
interfaceName := interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified())
|
||||||
|
interfaceDisplayName, err := getInterfaceDisplayName(interfaceName)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = shell.Exec("networksetup", "-setdnsservers", interfaceDisplayName, addr).Attach().Run()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getInterfaceDisplayName(name string) (string, error) {
|
||||||
|
content, err := shell.Exec("networksetup", "-listallhardwareports").ReadOutput()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
for _, deviceSpan := range strings.Split(string(content), "Ethernet Address") {
|
||||||
|
if strings.Contains(deviceSpan, "Device: "+name) {
|
||||||
|
substr := "Hardware Port: "
|
||||||
|
deviceSpan = deviceSpan[strings.Index(deviceSpan, substr)+len(substr):]
|
||||||
|
deviceSpan = deviceSpan[:strings.Index(deviceSpan, "\n")]
|
||||||
|
return deviceSpan, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "", E.New(name, " not found in networksetup -listallhardwareports")
|
||||||
|
}
|
||||||
10
core/cmd/nekobox_core/internal/sys/set_dns_stub.go
Normal file
10
core/cmd/nekobox_core/internal/sys/set_dns_stub.go
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
package sys
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
tun "github.com/sagernet/sing-tun"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SetSystemDNS(addr string, interfaceMonitor tun.DefaultInterfaceMonitor) error {
|
||||||
|
return errors.New("not implemented for this OS")
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user