github.com/Cloud-Foundations/Dominator@v0.3.4/lib/net/util/getResolverConfiguration.go (about)

     1  package util
     2  
     3  import (
     4  	"bufio"
     5  	"errors"
     6  	"net"
     7  	"os"
     8  	"strings"
     9  )
    10  
    11  const etcResolvConf = "/etc/resolv.conf"
    12  
    13  func getResolverConfiguration() (*ResolverConfiguration, error) {
    14  	file, err := os.Open(etcResolvConf)
    15  	if err != nil {
    16  		return nil, err
    17  	}
    18  	defer file.Close()
    19  	scanner := bufio.NewScanner(file)
    20  	resolverConfiguration := &ResolverConfiguration{}
    21  	for scanner.Scan() {
    22  		splitLine := strings.Split(scanner.Text(), ";")
    23  		if len(splitLine) < 1 {
    24  			continue
    25  		}
    26  		if splitLine[0] == "" {
    27  			continue
    28  		}
    29  		fields := strings.Fields(splitLine[0])
    30  		switch fields[0] {
    31  		case "domain":
    32  			resolverConfiguration.Domain = fields[1]
    33  		case "nameserver":
    34  			if len(fields) < 2 {
    35  				return nil, errors.New("missing nameserver: " + splitLine[0])
    36  			}
    37  			for _, nameserver := range fields[1:] {
    38  				if addr := net.ParseIP(nameserver); addr == nil {
    39  					return nil, errors.New("bad address: " + splitLine[0])
    40  				} else {
    41  					resolverConfiguration.Nameservers = append(
    42  						resolverConfiguration.Nameservers, shrinkIP(addr))
    43  				}
    44  			}
    45  		case "search":
    46  			resolverConfiguration.SearchDomains = append(
    47  				resolverConfiguration.SearchDomains, fields[1:]...)
    48  		}
    49  	}
    50  	if err := scanner.Err(); err != nil {
    51  		return nil, err
    52  	}
    53  	return resolverConfiguration, nil
    54  }
    55  
    56  func shrinkIP(netIP net.IP) net.IP {
    57  	switch len(netIP) {
    58  	case 4:
    59  		return netIP
    60  	case 16:
    61  		if ip4 := netIP.To4(); ip4 == nil {
    62  			return netIP
    63  		} else {
    64  			return ip4
    65  		}
    66  	default:
    67  		return netIP
    68  	}
    69  }