diff --git a/api/panel/node.go b/api/panel/node.go index 6089eeb..41e3296 100644 --- a/api/panel/node.go +++ b/api/panel/node.go @@ -1,8 +1,12 @@ package panel import ( + "bytes" "encoding/base64" "fmt" + log "github.com/sirupsen/logrus" + coreConf "github.com/xtls/xray-core/infra/conf" + "os" "reflect" "regexp" "strconv" @@ -130,6 +134,36 @@ func (c *Client) GetNodeInfo() (node *NodeInfo, err error) { node.Rules = append(node.Rules, regexp.MustCompile(v)) } case "dns": + if matchs[0] != "main" { + break + } + dnsPath := os.Getenv("XRAY_DNS_PATH") + if dnsPath == "" { + break + } + dns := []byte(strings.Join(matchs[1:], "")) + currentData, err := os.ReadFile(dnsPath) + if err != nil { + log.WithField("err", err).Panic("Failed to read XRAY_DNS_PATH") + break + } + if !bytes.Equal(currentData, dns) { + coreDnsConfig := &coreConf.DNSConfig{} + if err = json.NewDecoder(bytes.NewReader(dns)).Decode(coreDnsConfig); err != nil { + log.WithField("err", err).Panic("Failed to unmarshal DNS config") + } + _, err := coreDnsConfig.Build() + if err != nil { + log.WithField("err", err).Panic("Failed to understand DNS config, Please check: https://xtls.github.io/config/dns.html for help") + break + } + if err = os.Truncate(dnsPath, 0); err != nil { + log.WithField("err", err).Panic("Failed to clear XRAY DNS PATH file") + } + if err = os.WriteFile(dnsPath, dns, 0644); err != nil { + log.WithField("err", err).Panic("Failed to write DNS to XRAY DNS PATH file") + } + } } } node.ServerName = common.ServerName diff --git a/cmd/server.go b/cmd/server.go index 34ceeae..e8b062d 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -64,8 +64,9 @@ func serverHandle(_ *cobra.Command, _ []string) { log.WithField("err", err).Error("Run nodes failed") return } + dns := os.Getenv("XRAY_DNS_PATH") if watch { - err = c.Watch(config, func() { + err = c.Watch(config, dns, func() { nodes.Close() err = vc.Close() if err != nil { diff --git a/conf/watch.go b/conf/watch.go index eacf0fa..0a2d0d8 100644 --- a/conf/watch.go +++ b/conf/watch.go @@ -8,7 +8,7 @@ import ( "time" ) -func (p *Conf) Watch(filePath string, reload func()) error { +func (p *Conf) Watch(filePath, dnsPath string, reload func()) error { watcher, err := fsnotify.NewWatcher() if err != nil { return fmt.Errorf("new watcher error: %s", err) @@ -28,7 +28,11 @@ func (p *Conf) Watch(filePath string, reload func()) error { pre = time.Now() go func() { time.Sleep(10 * time.Second) - log.Println("config dir changed, reloading...") + if e.Name == dnsPath { + log.Println("DNS file changed, reloading...") + } else { + log.Println("config dir changed, reloading...") + } *p = *New() err := p.LoadFromPath(filePath) if err != nil { @@ -48,5 +52,11 @@ func (p *Conf) Watch(filePath string, reload func()) error { if err != nil { return fmt.Errorf("watch file error: %s", err) } + if dnsPath != "" { + err = watcher.Add(path.Dir(dnsPath)) + if err != nil { + return fmt.Errorf("watch dns file error: %s", err) + } + } return nil } diff --git a/core/xray/xray.go b/core/xray/xray.go index 2520e46..d718094 100644 --- a/core/xray/xray.go +++ b/core/xray/xray.go @@ -1,9 +1,6 @@ package xray import ( - "os" - "sync" - "github.com/Yuzuki616/V2bX/conf" vCore "github.com/Yuzuki616/V2bX/core" "github.com/Yuzuki616/V2bX/core/xray/app/dispatcher" @@ -19,6 +16,8 @@ import ( "github.com/xtls/xray-core/features/routing" statsFeature "github.com/xtls/xray-core/features/stats" coreConf "github.com/xtls/xray-core/infra/conf" + "os" + "sync" ) func init() { @@ -61,6 +60,7 @@ func getCore(c *conf.XrayConfig) *core.Instance { coreLogConfig.ErrorLog = c.LogConfig.ErrorPath // DNS config coreDnsConfig := &coreConf.DNSConfig{} + os.Setenv("XRAY_DNS_PATH", "") if c.DnsConfigPath != "" { if f, err := os.Open(c.DnsConfigPath); err != nil { log.WithField("err", err).Panic("Failed to read DNS config file") @@ -69,6 +69,7 @@ func getCore(c *conf.XrayConfig) *core.Instance { log.WithField("err", err).Panic("Failed to unmarshal DNS config") } } + os.Setenv("XRAY_DNS_PATH", c.DnsConfigPath) } dnsConfig, err := coreDnsConfig.Build() if err != nil {