github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/worker/runtime/resolvconf_parser.go (about) 1 package runtime 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "regexp" 7 "strings" 8 9 "code.cloudfoundry.org/localip" 10 ) 11 12 // Parse resolve.conf file from the provided path. 13 // implementation is based on guardian's implementation 14 // here: https://github.com/cloudfoundry/guardian/blob/master/kawasaki/dns/resolv_compiler.go 15 func ParseHostResolveConf(path string) ([]string, error) { 16 17 resolvConf, err := ioutil.ReadFile(path) 18 if err != nil { 19 return nil, fmt.Errorf("unable to read host's resolv.conf: %w", err) 20 } 21 22 resolvContents := string(resolvConf) 23 24 loopbackNameserver := regexp.MustCompile(`^\s*nameserver\s+127\.0\.0\.\d+\s*$`) 25 if loopbackNameserver.MatchString(resolvContents) { 26 ip, err := localip.LocalIP() 27 if err != nil { 28 return nil, err 29 } 30 return []string{"nameserver " + ip}, nil 31 } 32 33 var entries []string 34 35 for _, resolvEntry := range strings.Split(strings.TrimSpace(resolvContents), "\n") { 36 if resolvEntry == "" { 37 continue 38 } 39 40 if !strings.HasPrefix(resolvEntry, "nameserver") { 41 entries = append(entries, strings.TrimSpace(resolvEntry)) 42 continue 43 } 44 45 pattern := regexp.MustCompile(`127\.\d{1,3}\.\d{1,3}\.\d{1,3}`) 46 if !pattern.MatchString(strings.TrimSpace(resolvEntry)) { 47 nameserverFields := strings.Fields(resolvEntry) 48 if len(nameserverFields) != 2 { 49 continue 50 } 51 entries = append(entries, strings.Join(nameserverFields, " ")) 52 } 53 } 54 55 return entries, nil 56 }