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  }