From 43ff2f648c3b5de58d246da5f9f804f43d46e762 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Thu, 12 Oct 2023 21:56:27 +0700 Subject: [PATCH] internal/router/dnsmasq: disable cache So multiple upstreams config could work properly. --- internal/router/dnsmasq/dnsmasq.go | 56 +++++++++++++++++++++++++- internal/router/edgeos/edgeos.go | 24 ++++++++--- internal/router/firewalla/firewalla.go | 10 +++++ internal/router/openwrt/openwrt.go | 26 +----------- internal/router/ubios/ubios.go | 17 ++++++-- 5 files changed, 97 insertions(+), 36 deletions(-) diff --git a/internal/router/dnsmasq/dnsmasq.go b/internal/router/dnsmasq/dnsmasq.go index 54ba8fd..52cf1a6 100644 --- a/internal/router/dnsmasq/dnsmasq.go +++ b/internal/router/dnsmasq/dnsmasq.go @@ -1,9 +1,12 @@ package dnsmasq import ( + "bytes" "errors" + "fmt" "html/template" "net" + "os" "path/filepath" "strings" @@ -19,6 +22,7 @@ server={{ .IP }}#{{ .Port }} add-mac add-subnet=32,128 {{- end}} +cache-size=0 ` const MerlinPostConfPath = "/jffs/scripts/dnsmasq.postconf" @@ -47,6 +51,8 @@ if [ -n "$pid" ] && [ -f "/proc/${pid}/cmdline" ]; then {{- end}} pc_delete "dnssec" "$config_file" # disable DNSSEC pc_delete "trust-anchor=" "$config_file" # disable DNSSEC + pc_delete "cache-size=" "$config_file" + pc_append "cache-size=0" "$config_file" # disable cache # For John fork pc_delete "resolv-file" "$config_file" # no WAN DNS settings @@ -117,9 +123,28 @@ func firewallaUpstreams(port int) []Upstream { return upstreams } +// firewallaDnsmasqConfFiles returns dnsmasq config files of all firewalla interfaces. +func firewallaDnsmasqConfFiles() ([]string, error) { + return filepath.Glob("/home/pi/firerouter/etc/dnsmasq.dns.*.conf") +} + +// firewallUpdateConf updates all firewall config files using given function. +func firewallUpdateConf(update func(conf string) error) error { + confFiles, err := firewallaDnsmasqConfFiles() + if err != nil { + return err + } + for _, conf := range confFiles { + if err := update(conf); err != nil { + return fmt.Errorf("%s: %w", conf, err) + } + } + return nil +} + // FirewallaSelfInterfaces returns list of interfaces that will be configured with default dnsmasq setup on Firewalla. func FirewallaSelfInterfaces() []*net.Interface { - matches, err := filepath.Glob("/home/pi/firerouter/etc/dnsmasq.dns.*.conf") + matches, err := firewallaDnsmasqConfFiles() if err != nil { return nil } @@ -133,3 +158,32 @@ func FirewallaSelfInterfaces() []*net.Interface { } return ifaces } + +// FirewallaDisableCache comments out "cache-size" line in all firewalla dnsmasq config files. +func FirewallaDisableCache() error { + return firewallUpdateConf(DisableCache) +} + +// FirewallaEnableCache un-comments out "cache-size" line in all firewalla dnsmasq config files. +func FirewallaEnableCache() error { + return firewallUpdateConf(EnableCache) +} + +// DisableCache comments out "cache-size" line in dnsmasq config file. +func DisableCache(conf string) error { + return replaceFileContent(conf, "\ncache-size=", "\n#cache-size=") +} + +// EnableCache un-comments "cache-size" line in dnsmasq config file. +func EnableCache(conf string) error { + return replaceFileContent(conf, "\n#cache-size=", "\ncache-size=") +} + +func replaceFileContent(filename, old, new string) error { + content, err := os.ReadFile(filename) + if err != nil { + return err + } + content = bytes.ReplaceAll(content, []byte(old), []byte(new)) + return os.WriteFile(filename, content, 0644) +} diff --git a/internal/router/edgeos/edgeos.go b/internal/router/edgeos/edgeos.go index f50f610..0552882 100644 --- a/internal/router/edgeos/edgeos.go +++ b/internal/router/edgeos/edgeos.go @@ -15,11 +15,12 @@ import ( ) const ( - Name = "edgeos" - edgeOSDNSMasqConfigPath = "/etc/dnsmasq.d/dnsmasq-zzz-ctrld.conf" - usgDNSMasqConfigPath = "/etc/dnsmasq.conf" - usgDNSMasqBackupConfigPath = "/etc/dnsmasq.conf.bak" - toggleContentFilteringLink = "https://community.ui.com/questions/UDM-Pro-disable-enable-DNS-filtering/e2cc4060-e56a-4139-b200-62d7f773ff8f" + Name = "edgeos" + edgeOSDNSMasqDefaultConfigPath = "/etc/dnsmasq.conf" + edgeOSDNSMasqConfigPath = "/etc/dnsmasq.d/dnsmasq-zzz-ctrld.conf" + usgDNSMasqConfigPath = "/etc/dnsmasq.conf" + usgDNSMasqBackupConfigPath = "/etc/dnsmasq.conf.bak" + toggleContentFilteringLink = "https://community.ui.com/questions/UDM-Pro-disable-enable-DNS-filtering/e2cc4060-e56a-4139-b200-62d7f773ff8f" ) var ErrContentFilteringEnabled = fmt.Errorf(`the "Content Filtering" feature" is enabled, which is conflicted with ctrld.\n @@ -95,7 +96,7 @@ func (e *EdgeOS) setupUSG() error { return fmt.Errorf("setupUSG: backup current config: %w", err) } - // Removing all configured upstreams. + // Removing all configured upstreams and cache config. var sb strings.Builder scanner := bufio.NewScanner(bytes.NewReader(buf)) for scanner.Scan() { @@ -106,6 +107,9 @@ func (e *EdgeOS) setupUSG() error { if strings.HasPrefix(line, "all-servers") { continue } + if strings.HasPrefix(line, "cache-size") { + continue + } sb.WriteString(line) } @@ -127,6 +131,10 @@ func (e *EdgeOS) setupUSG() error { } func (e *EdgeOS) setupUDM() error { + // Disable dnsmasq cache. + if err := dnsmasq.DisableCache(edgeOSDNSMasqDefaultConfigPath); err != nil { + return err + } data, err := dnsmasq.ConfTmpl(dnsmasq.ConfigContentTmpl, e.cfg) if err != nil { return err @@ -153,6 +161,10 @@ func (e *EdgeOS) cleanupUSG() error { } func (e *EdgeOS) cleanupUDM() error { + // Enable dnsmasq cache. + if err := dnsmasq.EnableCache(edgeOSDNSMasqDefaultConfigPath); err != nil { + return err + } // Remove the custom dnsmasq config if err := os.Remove(edgeOSDNSMasqConfigPath); err != nil { return fmt.Errorf("cleanupUDM: os.Remove: %w", err) diff --git a/internal/router/firewalla/firewalla.go b/internal/router/firewalla/firewalla.go index cdf6586..66cd15e 100644 --- a/internal/router/firewalla/firewalla.go +++ b/internal/router/firewalla/firewalla.go @@ -65,6 +65,11 @@ func (f *Firewalla) Setup() error { return fmt.Errorf("writing ctrld config: %w", err) } + // Disable dnsmasq cache. + if err := dnsmasq.FirewallaDisableCache(); err != nil { + return err + } + // Restart dnsmasq service. if err := restartDNSMasq(); err != nil { return fmt.Errorf("restartDNSMasq: %w", err) @@ -82,6 +87,11 @@ func (f *Firewalla) Cleanup() error { return fmt.Errorf("removing ctrld config: %w", err) } + // Enable dnsmasq cache. + if err := dnsmasq.FirewallaEnableCache(); err != nil { + return err + } + // Restart dnsmasq service. if err := restartDNSMasq(); err != nil { return fmt.Errorf("restartDNSMasq: %w", err) diff --git a/internal/router/openwrt/openwrt.go b/internal/router/openwrt/openwrt.go index 83ea884..d3bc511 100644 --- a/internal/router/openwrt/openwrt.go +++ b/internal/router/openwrt/openwrt.go @@ -1,18 +1,14 @@ package openwrt import ( - "bytes" - "errors" "fmt" "os" "os/exec" - "strings" - - "github.com/Control-D-Inc/ctrld/internal/router/dnsmasq" "github.com/kardianos/service" "github.com/Control-D-Inc/ctrld" + "github.com/Control-D-Inc/ctrld/internal/router/dnsmasq" ) const ( @@ -20,8 +16,6 @@ const ( openwrtDNSMasqConfigPath = "/tmp/dnsmasq.d/ctrld.conf" ) -var errUCIEntryNotFound = errors.New("uci: Entry not found") - type Openwrt struct { cfg *ctrld.Config } @@ -59,10 +53,6 @@ func (o *Openwrt) Setup() error { if err := os.WriteFile(openwrtDNSMasqConfigPath, []byte(data), 0600); err != nil { return err } - // Commit. - if _, err := uci("commit"); err != nil { - return err - } // Restart dnsmasq service. if err := restartDNSMasq(); err != nil { return err @@ -91,17 +81,3 @@ func restartDNSMasq() error { } return nil } - -func uci(args ...string) (string, error) { - cmd := exec.Command("uci", args...) - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - if err := cmd.Run(); err != nil { - if strings.HasPrefix(stderr.String(), errUCIEntryNotFound.Error()) { - return "", errUCIEntryNotFound - } - return "", fmt.Errorf("%s:%w", stderr.String(), err) - } - return strings.TrimSpace(stdout.String()), nil -} diff --git a/internal/router/ubios/ubios.go b/internal/router/ubios/ubios.go index b0762db..32c7576 100644 --- a/internal/router/ubios/ubios.go +++ b/internal/router/ubios/ubios.go @@ -5,16 +5,17 @@ import ( "os" "strconv" - "github.com/Control-D-Inc/ctrld/internal/router/dnsmasq" + "github.com/kardianos/service" "github.com/Control-D-Inc/ctrld" + "github.com/Control-D-Inc/ctrld/internal/router/dnsmasq" "github.com/Control-D-Inc/ctrld/internal/router/edgeos" - "github.com/kardianos/service" ) const ( - Name = "ubios" - ubiosDNSMasqConfigPath = "/run/dnsmasq.conf.d/zzzctrld.conf" + Name = "ubios" + ubiosDNSMasqConfigPath = "/run/dnsmasq.conf.d/zzzctrld.conf" + ubiosDNSMasqDnsConfigPath = "/run/dnsmasq.conf.d/dns.conf" ) type Ubios struct { @@ -57,6 +58,10 @@ func (u *Ubios) Setup() error { if err := os.WriteFile(ubiosDNSMasqConfigPath, []byte(data), 0600); err != nil { return err } + // Disable dnsmasq cache. + if err := dnsmasq.DisableCache(ubiosDNSMasqDnsConfigPath); err != nil { + return err + } // Restart dnsmasq service. if err := restartDNSMasq(); err != nil { return err @@ -72,6 +77,10 @@ func (u *Ubios) Cleanup() error { if err := os.Remove(ubiosDNSMasqConfigPath); err != nil { return err } + // Enable dnsmasq cache. + if err := dnsmasq.EnableCache(ubiosDNSMasqDnsConfigPath); err != nil { + return err + } // Restart dnsmasq service. if err := restartDNSMasq(); err != nil { return err