From f2e7496ac36a71150f8a35ef21c2839066459554 Mon Sep 17 00:00:00 2001 From: Thijs Terlouw Date: Wed, 21 Aug 2013 15:23:12 +0200 Subject: [PATCH 1/2] proper resolv.conf parsing Upstream-commit: 62e84785b6ffec04a39cf611d7eaff21f2532195 Component: engine --- components/engine/utils/utils.go | 22 +++++++++++++++++++--- components/engine/utils/utils_test.go | 10 ++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/components/engine/utils/utils.go b/components/engine/utils/utils.go index 6a5beb8e48..a8ed1deebc 100644 --- a/components/engine/utils/utils.go +++ b/components/engine/utils/utils.go @@ -772,21 +772,37 @@ func GetResolvConf() ([]byte, error) { // CheckLocalDns looks into the /etc/resolv.conf, // it returns true if there is a local nameserver or if there is no nameserver. func CheckLocalDns(resolvConf []byte) bool { - if !bytes.Contains(resolvConf, []byte("nameserver")) { + var parsedResolvConf = ParseResolvConf(resolvConf) + if !bytes.Contains(parsedResolvConf, []byte("nameserver")) { return true } - for _, ip := range [][]byte{ []byte("127.0.0.1"), []byte("127.0.1.1"), } { - if bytes.Contains(resolvConf, ip) { + if bytes.Contains(parsedResolvConf, ip) { return true } } return false } +// ParseResolvConf parses the resolv.conf file into lines and strips away comments. +func ParseResolvConf(resolvConf []byte) []byte { + lines := bytes.Split(resolvConf, []byte("\n")) + var noCommentsResolvConf []byte + for _, currentLine := range lines { + var cleanLine = bytes.TrimLeft(currentLine, " \t") + var commentIndex = bytes.Index(cleanLine, []byte("#")) + if ( commentIndex == -1 ) { + noCommentsResolvConf = append(noCommentsResolvConf, cleanLine...) + } else { + noCommentsResolvConf = append(noCommentsResolvConf, cleanLine[:commentIndex]...) + } + } + return noCommentsResolvConf +} + func ParseHost(host string, port int, addr string) string { if strings.HasPrefix(addr, "unix://") { return addr diff --git a/components/engine/utils/utils_test.go b/components/engine/utils/utils_test.go index 1030b2902a..cdf9c87073 100644 --- a/components/engine/utils/utils_test.go +++ b/components/engine/utils/utils_test.go @@ -323,6 +323,16 @@ func TestCheckLocalDns(t *testing.T) { nameserver 10.0.2.3 search dotcloud.net`: false, `# Dynamic +#nameserver 127.0.0.1 +nameserver 10.0.2.3 +search dotcloud.net`: false, + `# Dynamic +nameserver 10.0.2.3 #not used 127.0.1.1 +search dotcloud.net`: false, + `# Dynamic +#nameserver 10.0.2.3 +#search dotcloud.net`: true, + `# Dynamic nameserver 127.0.0.1 search dotcloud.net`: true, `# Dynamic From 6fad2c6e0b192c20acf34eb23ed168d1442f611e Mon Sep 17 00:00:00 2001 From: Thijs Terlouw Date: Wed, 21 Aug 2013 15:48:39 +0200 Subject: [PATCH 2/2] Keep linebreaks and generalize code Upstream-commit: c349b4d56c338bc43c81667bb927518b923998cb Component: engine --- components/engine/utils/utils.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/components/engine/utils/utils.go b/components/engine/utils/utils.go index a8ed1deebc..1fd4c77a7e 100644 --- a/components/engine/utils/utils.go +++ b/components/engine/utils/utils.go @@ -772,7 +772,7 @@ func GetResolvConf() ([]byte, error) { // CheckLocalDns looks into the /etc/resolv.conf, // it returns true if there is a local nameserver or if there is no nameserver. func CheckLocalDns(resolvConf []byte) bool { - var parsedResolvConf = ParseResolvConf(resolvConf) + var parsedResolvConf = StripComments(resolvConf, []byte("#")) if !bytes.Contains(parsedResolvConf, []byte("nameserver")) { return true } @@ -787,20 +787,20 @@ func CheckLocalDns(resolvConf []byte) bool { return false } -// ParseResolvConf parses the resolv.conf file into lines and strips away comments. -func ParseResolvConf(resolvConf []byte) []byte { - lines := bytes.Split(resolvConf, []byte("\n")) - var noCommentsResolvConf []byte +// StripComments parses input into lines and strips away comments. +func StripComments(input []byte, commentMarker []byte) []byte { + lines := bytes.Split(input, []byte("\n")) + var output []byte for _, currentLine := range lines { - var cleanLine = bytes.TrimLeft(currentLine, " \t") - var commentIndex = bytes.Index(cleanLine, []byte("#")) + var commentIndex = bytes.Index(currentLine, commentMarker) if ( commentIndex == -1 ) { - noCommentsResolvConf = append(noCommentsResolvConf, cleanLine...) + output = append(output, currentLine...) } else { - noCommentsResolvConf = append(noCommentsResolvConf, cleanLine[:commentIndex]...) + output = append(output, currentLine[:commentIndex]...) } + output = append(output, []byte("\n")...) } - return noCommentsResolvConf + return output } func ParseHost(host string, port int, addr string) string {