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 }