From 39ee66266a851391ad2efb5b7ae82a4ad0c939f9 Mon Sep 17 00:00:00 2001 From: Ainar Garipov Date: Tue, 15 Jun 2021 20:01:38 +0300 Subject: [PATCH] Pull request: aghnet: do not expect dhcpdc.conf to exist Updates #3257. Squashed commit of the following: commit f3c335932e365dace0720e8986c217cf6f7ae162 Author: Ainar Garipov Date: Tue Jun 15 19:56:23 2021 +0300 aghnet: fix docs, names commit 513ade2e46a9292411c9b9636437f17ee549ea5e Merge: aa58f1dd 9f5a015f Author: Ainar Garipov Date: Tue Jun 15 19:43:24 2021 +0300 Merge branch 'master' into 3257-dhcpdc-conf commit aa58f1ddb8065cafabc835decc5bf73ffb49e742 Author: Ainar Garipov Date: Tue Jun 15 17:18:19 2021 +0300 aghnet: do not expect dhcpdc.conf to exist --- CHANGELOG.md | 2 ++ internal/aghnet/net_linux.go | 27 +++++++++++++++------------ internal/aghnet/net_linux_test.go | 13 ++++++++++--- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1f1904d..2ba5072c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ released by then. ### Fixed +- Errors when setting static IP on Linux ([#3257]). - Treatment of domain names and FQDNs in custom rules with `$dnsrewrite` that use the `PTR` type ([#3256]). - Redundant hostname generating while loading static leases with empty hostname @@ -75,6 +76,7 @@ released by then. [#3194]: https://github.com/AdguardTeam/AdGuardHome/issues/3194 [#3198]: https://github.com/AdguardTeam/AdGuardHome/issues/3198 [#3256]: https://github.com/AdguardTeam/AdGuardHome/issues/3256 +[#3257]: https://github.com/AdguardTeam/AdGuardHome/issues/3257 diff --git a/internal/aghnet/net_linux.go b/internal/aghnet/net_linux.go index b4adced6..63e79148 100644 --- a/internal/aghnet/net_linux.go +++ b/internal/aghnet/net_linux.go @@ -16,7 +16,8 @@ import ( "github.com/google/renameio/maybe" ) -// maxConfigFileSize is the maximum length of interfaces configuration file. +// maxConfigFileSize is the maximum assumed length of the interface +// configuration file. const maxConfigFileSize = 1024 * 1024 func ifaceHasStaticIP(ifaceName string) (has bool, err error) { @@ -130,6 +131,8 @@ func ifacesStaticConfig(r io.Reader, ifaceName string) (has bool, err error) { return false, s.Err() } +// ifaceSetStaticIP configures the system to retain its current IP on the +// interface through dhcpdc.conf. func ifaceSetStaticIP(ifaceName string) (err error) { ipNet := GetSubnet(ifaceName) if ipNet.IP == nil { @@ -137,10 +140,10 @@ func ifaceSetStaticIP(ifaceName string) (err error) { } gatewayIP := GatewayIP(ifaceName) - add := updateStaticIPdhcpcdConf(ifaceName, ipNet.String(), gatewayIP, ipNet.IP) + add := dhcpcdConfIface(ifaceName, ipNet, gatewayIP, ipNet.IP) body, err := os.ReadFile("/etc/dhcpcd.conf") - if err != nil { + if err != nil && !errors.Is(err, os.ErrNotExist) { return err } @@ -153,23 +156,23 @@ func ifaceSetStaticIP(ifaceName string) (err error) { return nil } -// updateStaticIPdhcpcdConf sets static IP address for the interface by writing -// into dhcpd.conf. -func updateStaticIPdhcpcdConf(ifaceName, ip string, gatewayIP, dnsIP net.IP) string { +// dhcpcdConfIface returns configuration lines for the dhcpdc.conf files that +// configure the interface to have a static IP. +func dhcpcdConfIface(ifaceName string, ipNet *net.IPNet, gatewayIP, dnsIP net.IP) (conf string) { var body []byte - add := fmt.Sprintf("\ninterface %s\nstatic ip_address=%s\n", - ifaceName, ip) + add := fmt.Sprintf( + "\n# %[1]s added by AdGuard Home.\ninterface %[1]s\nstatic ip_address=%s\n", + ifaceName, + ipNet) body = append(body, []byte(add)...) if gatewayIP != nil { - add = fmt.Sprintf("static routers=%s\n", - gatewayIP) + add = fmt.Sprintf("static routers=%s\n", gatewayIP) body = append(body, []byte(add)...) } - add = fmt.Sprintf("static domain_name_servers=%s\n\n", - dnsIP) + add = fmt.Sprintf("static domain_name_servers=%s\n\n", dnsIP) body = append(body, []byte(add)...) return string(body) diff --git a/internal/aghnet/net_linux_test.go b/internal/aghnet/net_linux_test.go index 77e7c9c8..1bc5e180 100644 --- a/internal/aghnet/net_linux_test.go +++ b/internal/aghnet/net_linux_test.go @@ -102,22 +102,29 @@ func TestSetStaticIPdhcpcdConf(t *testing.T) { routers net.IP }{{ name: "with_gateway", - dhcpcdConf: nl + `interface wlan0` + nl + + dhcpcdConf: nl + `# wlan0 added by AdGuard Home.` + nl + + `interface wlan0` + nl + `static ip_address=192.168.0.2/24` + nl + `static routers=192.168.0.1` + nl + `static domain_name_servers=192.168.0.2` + nl + nl, routers: net.IP{192, 168, 0, 1}, }, { name: "without_gateway", - dhcpcdConf: nl + `interface wlan0` + nl + + dhcpcdConf: nl + `# wlan0 added by AdGuard Home.` + nl + + `interface wlan0` + nl + `static ip_address=192.168.0.2/24` + nl + `static domain_name_servers=192.168.0.2` + nl + nl, routers: nil, }} + ipNet := &net.IPNet{ + IP: net.IP{192, 168, 0, 2}, + Mask: net.IPMask{255, 255, 255, 0}, + } + for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := updateStaticIPdhcpcdConf("wlan0", "192.168.0.2/24", tc.routers, net.IP{192, 168, 0, 2}) + s := dhcpcdConfIface("wlan0", ipNet, tc.routers, net.IP{192, 168, 0, 2}) assert.Equal(t, tc.dhcpcdConf, s) }) }