| OLD | NEW |
| (Empty) |
| 1 # Generate /etc/resolv.conf | |
| 2 # Support resolvconf(8) if available | |
| 3 # We can merge other dhcpcd resolv.conf files into one like resolvconf, | |
| 4 # but resolvconf is preferred as other applications like VPN clients | |
| 5 # can readily hook into it. | |
| 6 # Also, resolvconf can configure local nameservers such as bind | |
| 7 # or dnsmasq. This is important as the libc resolver isn't that powerful. | |
| 8 | |
| 9 resolv_conf_dir="$state_dir/resolv.conf" | |
| 10 | |
| 11 build_resolv_conf() | |
| 12 { | |
| 13 local cf="$state_dir/resolv.conf.$interface" | |
| 14 local interfaces= header= search= srvs= servers= x= | |
| 15 | |
| 16 # Build a list of interfaces | |
| 17 interfaces=$(list_interfaces "$resolv_conf_dir") | |
| 18 | |
| 19 # Build the resolv.conf | |
| 20 if [ -n "$interfaces" ]; then | |
| 21 # Build the header | |
| 22 for x in ${interfaces}; do | |
| 23 header="$header${header:+, }$x" | |
| 24 done | |
| 25 | |
| 26 # Build the search list | |
| 27 domain=$(cd "$resolv_conf_dir"; \ | |
| 28 key_get_value "domain " ${interfaces}) | |
| 29 search=$(cd "$resolv_conf_dir"; \ | |
| 30 key_get_value "search " ${interfaces}) | |
| 31 set -- ${domain} | |
| 32 unset domain | |
| 33 if [ -n "$2" ]; then | |
| 34 search="$search $@" | |
| 35 elif [ -n "$1" ]; then | |
| 36 domain="domain $1\n" | |
| 37 fi | |
| 38 [ -n "$search" ] && search="search $(uniqify $search)\n" | |
| 39 | |
| 40 # Build the nameserver list | |
| 41 srvs=$(cd "$resolv_conf_dir"; \ | |
| 42 key_get_value "nameserver " ${interfaces}) | |
| 43 for x in $(uniqify ${srvs}); do | |
| 44 servers="${servers}nameserver $x\n" | |
| 45 done | |
| 46 fi | |
| 47 header="$signature_base${header:+ $from }$header" | |
| 48 | |
| 49 # Assemble resolv.conf using our head and tail files | |
| 50 [ -f "$cf" ] && rm -f "$cf" | |
| 51 [ -d "$resolv_conf_dir" ] || mkdir -p "$resolv_conf_dir" | |
| 52 echo "$header" > "$cf" | |
| 53 if [ -f /etc/resolv.conf.head ]; then | |
| 54 cat /etc/resolv.conf.head >> "$cf" | |
| 55 else | |
| 56 echo "# /etc/resolv.conf.head can replace this line" >> "$cf" | |
| 57 fi | |
| 58 printf "$domain$search$servers" >> "$cf" | |
| 59 if [ -f /etc/resolv.conf.tail ]; then | |
| 60 cat /etc/resolv.conf.tail >> "$cf" | |
| 61 else | |
| 62 echo "# /etc/resolv.conf.tail can replace this line" >> "$cf" | |
| 63 fi | |
| 64 cat "$cf" > /etc/resolv.conf | |
| 65 chmod 644 /etc/resolv.conf | |
| 66 rm -f "$cf" | |
| 67 } | |
| 68 | |
| 69 add_resolv_conf() | |
| 70 { | |
| 71 local x= conf="$signature\n" | |
| 72 | |
| 73 # If we don't have any configuration, remove it | |
| 74 if [ -z "$new_domain_name_servers" -a \ | |
| 75 -z "$new_domain_name" -a \ | |
| 76 -z "$new_domain_search" ]; then | |
| 77 remove_resolv_conf | |
| 78 return $? | |
| 79 fi | |
| 80 | |
| 81 if [ -n "$new_domain_name" ]; then | |
| 82 set -- $new_domain_name | |
| 83 new_domain_name="$1" | |
| 84 conf="${conf}domain $new_domain_name\n" | |
| 85 # Support RFC violating search in domain | |
| 86 if [ -z "$new_domain_search" -a -n "$2" ]; then | |
| 87 new_domain_search="$@" | |
| 88 fi | |
| 89 fi | |
| 90 if [ -n "$new_domain_search" ]; then | |
| 91 conf="${conf}search $new_domain_search\n" | |
| 92 fi | |
| 93 for x in ${new_domain_name_servers}; do | |
| 94 conf="${conf}nameserver $x\n" | |
| 95 done | |
| 96 if type resolvconf >/dev/null 2>&1; then | |
| 97 [ -n "$metric" ] && export IF_METRIC="$metric" | |
| 98 printf "$conf" | resolvconf -a "$interface" | |
| 99 return $? | |
| 100 fi | |
| 101 | |
| 102 if [ -e "$resolv_conf_dir/$interface" ]; then | |
| 103 rm -f "$resolv_conf_dir/$interface" | |
| 104 fi | |
| 105 [ -d "$resolv_conf_dir" ] || mkdir -p "$resolv_conf_dir" | |
| 106 printf "$conf" > "$resolv_conf_dir/$interface" | |
| 107 build_resolv_conf | |
| 108 } | |
| 109 | |
| 110 remove_resolv_conf() | |
| 111 { | |
| 112 if type resolvconf >/dev/null 2>&1; then | |
| 113 resolvconf -d "$interface" -f | |
| 114 else | |
| 115 if [ -e "$resolv_conf_dir/$interface" ]; then | |
| 116 rm -f "$resolv_conf_dir/$interface" | |
| 117 fi | |
| 118 build_resolv_conf | |
| 119 fi | |
| 120 } | |
| 121 | |
| 122 case "$reason" in | |
| 123 BOUND|INFORM|REBIND|REBOOT|RENEW|TIMEOUT|STATIC) add_resolv_conf;; | |
| 124 PREINIT|EXPIRE|FAIL|IPV4LL|NAK|NOCARRIER|RELEASE|STOP) remove_resolv_conf;; | |
| 125 esac | |
| OLD | NEW |