Merge pull request #95 from stitchrs/dev_dns

feat: remote dns config
This commit is contained in:
Yuzuki 2023-07-20 20:04:05 +08:00 committed by GitHub
commit 65a613522f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 52 additions and 6 deletions

View File

@ -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

View File

@ -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 {

View File

@ -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
}

View File

@ -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 {