1*587392a5SHajimu UMEMOTO#!/bin/sh 2*587392a5SHajimu UMEMOTO# Copyright (c) 2007-2009 Roy Marples 3*587392a5SHajimu UMEMOTO# All rights reserved 4*587392a5SHajimu UMEMOTO 5*587392a5SHajimu UMEMOTO# Redistribution and use in source and binary forms, with or without 6*587392a5SHajimu UMEMOTO# modification, are permitted provided that the following conditions 7*587392a5SHajimu UMEMOTO# are met: 8*587392a5SHajimu UMEMOTO# * Redistributions of source code must retain the above copyright 9*587392a5SHajimu UMEMOTO# notice, this list of conditions and the following disclaimer. 10*587392a5SHajimu UMEMOTO# * Redistributions in binary form must reproduce the above 11*587392a5SHajimu UMEMOTO# copyright notice, this list of conditions and the following 12*587392a5SHajimu UMEMOTO# disclaimer in the documentation and/or other materials provided 13*587392a5SHajimu UMEMOTO# with the distribution. 14*587392a5SHajimu UMEMOTO# 15*587392a5SHajimu UMEMOTO# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16*587392a5SHajimu UMEMOTO# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17*587392a5SHajimu UMEMOTO# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18*587392a5SHajimu UMEMOTO# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19*587392a5SHajimu UMEMOTO# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20*587392a5SHajimu UMEMOTO# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21*587392a5SHajimu UMEMOTO# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22*587392a5SHajimu UMEMOTO# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23*587392a5SHajimu UMEMOTO# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24*587392a5SHajimu UMEMOTO# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25*587392a5SHajimu UMEMOTO# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*587392a5SHajimu UMEMOTO 27*587392a5SHajimu UMEMOTORESOLVCONF="$0" 28*587392a5SHajimu UMEMOTOSYSCONFDIR=@SYSCONFDIR@ 29*587392a5SHajimu UMEMOTOLIBEXECDIR=@LIBEXECDIR@ 30*587392a5SHajimu UMEMOTOVARDIR=@VARDIR@ 31*587392a5SHajimu UMEMOTO# Support original resolvconf configuration layout 32*587392a5SHajimu UMEMOTO# as well as the openresolv config file 33*587392a5SHajimu UMEMOTOif [ -f "$SYSCONFDIR"/resolvconf.conf ]; then 34*587392a5SHajimu UMEMOTO . "$SYSCONFDIR"/resolvconf.conf 35*587392a5SHajimu UMEMOTO [ -n "$state_dir" ] && VARDIR="$state_dir" 36*587392a5SHajimu UMEMOTOelif [ -d "$SYSCONFDIR/resolvconf" ]; then 37*587392a5SHajimu UMEMOTO SYSCONFDIR="$SYSCONFDIR/resolvconf" 38*587392a5SHajimu UMEMOTO if [ -f "$SYSCONFDIR"/interface-order ]; then 39*587392a5SHajimu UMEMOTO interface_order="$(cat "$SYSCONFDIR"/interface-order)" 40*587392a5SHajimu UMEMOTO fi 41*587392a5SHajimu UMEMOTOfi 42*587392a5SHajimu UMEMOTOIFACEDIR="$VARDIR/interfaces" 43*587392a5SHajimu UMEMOTOMETRICDIR="$VARDIR/metrics" 44*587392a5SHajimu UMEMOTOPRIVATEDIR="$VARDIR/private" 45*587392a5SHajimu UMEMOTO 46*587392a5SHajimu UMEMOTO: ${dynamic_order:=tap[0-9]* tun[0-9]* vpn vpn[0-9]* ppp[0-9]* ippp[0-9]*} 47*587392a5SHajimu UMEMOTO: ${interface_order:=lo lo[0-9]*} 48*587392a5SHajimu UMEMOTO 49*587392a5SHajimu UMEMOTOerror_exit() 50*587392a5SHajimu UMEMOTO{ 51*587392a5SHajimu UMEMOTO echo "$*" >&2 52*587392a5SHajimu UMEMOTO exit 1 53*587392a5SHajimu UMEMOTO} 54*587392a5SHajimu UMEMOTO 55*587392a5SHajimu UMEMOTOusage() 56*587392a5SHajimu UMEMOTO{ 57*587392a5SHajimu UMEMOTO cat <<-EOF 58*587392a5SHajimu UMEMOTO Usage: ${RESOLVCONF##*/} [options] 59*587392a5SHajimu UMEMOTO 60*587392a5SHajimu UMEMOTO Inform the system about any DNS updates. 61*587392a5SHajimu UMEMOTO 62*587392a5SHajimu UMEMOTO Options: 63*587392a5SHajimu UMEMOTO -a \$INTERFACE Add DNS information to the specified interface 64*587392a5SHajimu UMEMOTO (DNS supplied via stdin in resolv.conf format) 65*587392a5SHajimu UMEMOTO -m metric Give the added DNS information a metric 66*587392a5SHajimu UMEMOTO -p Mark the interface as private 67*587392a5SHajimu UMEMOTO -d \$INTERFACE Delete DNS information from the specified interface 68*587392a5SHajimu UMEMOTO -f Ignore non existant interfaces 69*587392a5SHajimu UMEMOTO -I Init the state dir 70*587392a5SHajimu UMEMOTO -u Run updates from our current DNS information 71*587392a5SHajimu UMEMOTO -l [\$PATTERN] Show DNS information, optionally from interfaces 72*587392a5SHajimu UMEMOTO that match the specified pattern 73*587392a5SHajimu UMEMOTO -i [\$PATTERN] Show interfaces that have supplied DNS information 74*587392a5SHajimu UMEMOTO optionally from interfaces that match the specified 75*587392a5SHajimu UMEMOTO pattern 76*587392a5SHajimu UMEMOTO -v [\$PATTERN] echo NEWDOMAIN, NEWSEARCH and NEWNS variables to 77*587392a5SHajimu UMEMOTO the console 78*587392a5SHajimu UMEMOTO -h Show this help cruft 79*587392a5SHajimu UMEMOTO EOF 80*587392a5SHajimu UMEMOTO [ -z "$1" ] && exit 0 81*587392a5SHajimu UMEMOTO echo 82*587392a5SHajimu UMEMOTO error_exit "$*" 83*587392a5SHajimu UMEMOTO} 84*587392a5SHajimu UMEMOTO 85*587392a5SHajimu UMEMOTOecho_resolv() 86*587392a5SHajimu UMEMOTO{ 87*587392a5SHajimu UMEMOTO local line= 88*587392a5SHajimu UMEMOTO [ -n "$1" -a -e "$IFACEDIR/$1" ] || return 1 89*587392a5SHajimu UMEMOTO echo "# resolv.conf from $1" 90*587392a5SHajimu UMEMOTO # Our variable maker works of the fact each resolv.conf per interface 91*587392a5SHajimu UMEMOTO # is separated by blank lines. 92*587392a5SHajimu UMEMOTO # So we remove them when echoing them. 93*587392a5SHajimu UMEMOTO while read line; do 94*587392a5SHajimu UMEMOTO [ -n "$line" ] && echo "$line" 95*587392a5SHajimu UMEMOTO done < "$IFACEDIR/$1" 96*587392a5SHajimu UMEMOTO echo 97*587392a5SHajimu UMEMOTO} 98*587392a5SHajimu UMEMOTO 99*587392a5SHajimu UMEMOTO# Parse resolv.conf's and make variables 100*587392a5SHajimu UMEMOTO# for domain name servers, search name servers and global nameservers 101*587392a5SHajimu UMEMOTOparse_resolv() 102*587392a5SHajimu UMEMOTO{ 103*587392a5SHajimu UMEMOTO local line= ns= ds= search= d= n= newns= 104*587392a5SHajimu UMEMOTO local new=true iface= private=false p= 105*587392a5SHajimu UMEMOTO 106*587392a5SHajimu UMEMOTO echo "DOMAINS=" 107*587392a5SHajimu UMEMOTO echo "SEARCH=\"$search_domains\"" 108*587392a5SHajimu UMEMOTO # let our subscribers know about global nameservers 109*587392a5SHajimu UMEMOTO for n in $name_servers; do 110*587392a5SHajimu UMEMOTO case "$n" in 111*587392a5SHajimu UMEMOTO 127.*|0.0.0.0|255.255.255.255|::1) :;; 112*587392a5SHajimu UMEMOTO *) newns="$newns${newns:+ }$n";; 113*587392a5SHajimu UMEMOTO esac 114*587392a5SHajimu UMEMOTO done 115*587392a5SHajimu UMEMOTO echo "NAMESERVERS=\"$newns\"" 116*587392a5SHajimu UMEMOTO echo "LOCALNAMESERVERS=" 117*587392a5SHajimu UMEMOTO newns= 118*587392a5SHajimu UMEMOTO 119*587392a5SHajimu UMEMOTO while read line; do 120*587392a5SHajimu UMEMOTO case "$line" in 121*587392a5SHajimu UMEMOTO "# resolv.conf from "*) 122*587392a5SHajimu UMEMOTO if ${new}; then 123*587392a5SHajimu UMEMOTO iface="${line#\# resolv.conf from *}" 124*587392a5SHajimu UMEMOTO new=false 125*587392a5SHajimu UMEMOTO if [ -e "$PRIVATEDIR/$iface" ]; then 126*587392a5SHajimu UMEMOTO private=true 127*587392a5SHajimu UMEMOTO else 128*587392a5SHajimu UMEMOTO # Allow expansion 129*587392a5SHajimu UMEMOTO cd "$IFACEDIR" 130*587392a5SHajimu UMEMOTO private=false 131*587392a5SHajimu UMEMOTO for p in $private_interfaces; do 132*587392a5SHajimu UMEMOTO if [ "$p" = "$iface" ]; then 133*587392a5SHajimu UMEMOTO private=true 134*587392a5SHajimu UMEMOTO break 135*587392a5SHajimu UMEMOTO fi 136*587392a5SHajimu UMEMOTO done 137*587392a5SHajimu UMEMOTO fi 138*587392a5SHajimu UMEMOTO fi 139*587392a5SHajimu UMEMOTO ;; 140*587392a5SHajimu UMEMOTO "nameserver "*) 141*587392a5SHajimu UMEMOTO case "${line#* }" in 142*587392a5SHajimu UMEMOTO 127.*|0.0.0.0|255.255.255.255|::1) 143*587392a5SHajimu UMEMOTO echo "LOCALNAMESERVERS=\"\$LOCALNAMESERVERS ${line#* }\"" 144*587392a5SHajimu UMEMOTO continue 145*587392a5SHajimu UMEMOTO ;; 146*587392a5SHajimu UMEMOTO esac 147*587392a5SHajimu UMEMOTO ns="$ns${line#* } " 148*587392a5SHajimu UMEMOTO ;; 149*587392a5SHajimu UMEMOTO "domain "*|"search "*) 150*587392a5SHajimu UMEMOTO search="${line#* }" 151*587392a5SHajimu UMEMOTO ;; 152*587392a5SHajimu UMEMOTO *) 153*587392a5SHajimu UMEMOTO [ -n "$line" ] && continue 154*587392a5SHajimu UMEMOTO if [ -n "$ns" -a -n "$search" ]; then 155*587392a5SHajimu UMEMOTO newns= 156*587392a5SHajimu UMEMOTO for n in $ns; do 157*587392a5SHajimu UMEMOTO newns="$newns${newns:+,}$n" 158*587392a5SHajimu UMEMOTO done 159*587392a5SHajimu UMEMOTO ds= 160*587392a5SHajimu UMEMOTO for d in $search; do 161*587392a5SHajimu UMEMOTO ds="$ds${ds:+ }$d:$newns" 162*587392a5SHajimu UMEMOTO done 163*587392a5SHajimu UMEMOTO echo "DOMAINS=\"\$DOMAINS $ds\"" 164*587392a5SHajimu UMEMOTO fi 165*587392a5SHajimu UMEMOTO echo "SEARCH=\"\$SEARCH $search\"" 166*587392a5SHajimu UMEMOTO if ! $private; then 167*587392a5SHajimu UMEMOTO echo "NAMESERVERS=\"\$NAMESERVERS $ns\"" 168*587392a5SHajimu UMEMOTO fi 169*587392a5SHajimu UMEMOTO ns= 170*587392a5SHajimu UMEMOTO search= 171*587392a5SHajimu UMEMOTO new=true 172*587392a5SHajimu UMEMOTO ;; 173*587392a5SHajimu UMEMOTO esac 174*587392a5SHajimu UMEMOTO done 175*587392a5SHajimu UMEMOTO} 176*587392a5SHajimu UMEMOTO 177*587392a5SHajimu UMEMOTOuniqify() 178*587392a5SHajimu UMEMOTO{ 179*587392a5SHajimu UMEMOTO local result= 180*587392a5SHajimu UMEMOTO while [ -n "$1" ]; do 181*587392a5SHajimu UMEMOTO case " $result " in 182*587392a5SHajimu UMEMOTO *" $1 "*);; 183*587392a5SHajimu UMEMOTO *) result="$result $1";; 184*587392a5SHajimu UMEMOTO esac 185*587392a5SHajimu UMEMOTO shift 186*587392a5SHajimu UMEMOTO done 187*587392a5SHajimu UMEMOTO echo "${result# *}" 188*587392a5SHajimu UMEMOTO} 189*587392a5SHajimu UMEMOTO 190*587392a5SHajimu UMEMOTOlist_resolv() 191*587392a5SHajimu UMEMOTO{ 192*587392a5SHajimu UMEMOTO [ -d "$IFACEDIR" ] || return 0 193*587392a5SHajimu UMEMOTO 194*587392a5SHajimu UMEMOTO local report=false list= retval=0 cmd="$1" 195*587392a5SHajimu UMEMOTO shift 196*587392a5SHajimu UMEMOTO 197*587392a5SHajimu UMEMOTO # If we have an interface ordering list, then use that. 198*587392a5SHajimu UMEMOTO # It works by just using pathname expansion in the interface directory. 199*587392a5SHajimu UMEMOTO if [ -n "$1" ]; then 200*587392a5SHajimu UMEMOTO list="$@" 201*587392a5SHajimu UMEMOTO $force || report=true 202*587392a5SHajimu UMEMOTO else 203*587392a5SHajimu UMEMOTO cd "$IFACEDIR" 204*587392a5SHajimu UMEMOTO for i in $interface_order; do 205*587392a5SHajimu UMEMOTO [ -e "$i" ] && list="$list $i" 206*587392a5SHajimu UMEMOTO done 207*587392a5SHajimu UMEMOTO for i in $dynamic_order; do 208*587392a5SHajimu UMEMOTO if [ -e "$i" -a ! -e "$METRICDIR/"*" $i" ]; then 209*587392a5SHajimu UMEMOTO list="$list $i" 210*587392a5SHajimu UMEMOTO fi 211*587392a5SHajimu UMEMOTO done 212*587392a5SHajimu UMEMOTO if [ -d "$METRICDIR" ]; then 213*587392a5SHajimu UMEMOTO cd "$METRICDIR" 214*587392a5SHajimu UMEMOTO for i in *; do 215*587392a5SHajimu UMEMOTO list="$list ${i#* }" 216*587392a5SHajimu UMEMOTO done 217*587392a5SHajimu UMEMOTO fi 218*587392a5SHajimu UMEMOTO list="$list *" 219*587392a5SHajimu UMEMOTO fi 220*587392a5SHajimu UMEMOTO 221*587392a5SHajimu UMEMOTO cd "$IFACEDIR" 222*587392a5SHajimu UMEMOTO for i in $(uniqify $list); do 223*587392a5SHajimu UMEMOTO # Only list interfaces which we really have 224*587392a5SHajimu UMEMOTO if ! [ -e "$i" ]; then 225*587392a5SHajimu UMEMOTO if $report; then 226*587392a5SHajimu UMEMOTO echo "No resolv.conf for interface $i" >&2 227*587392a5SHajimu UMEMOTO retval=$(($retval + 1)) 228*587392a5SHajimu UMEMOTO fi 229*587392a5SHajimu UMEMOTO continue 230*587392a5SHajimu UMEMOTO fi 231*587392a5SHajimu UMEMOTO 232*587392a5SHajimu UMEMOTO if [ "$cmd" = i -o "$cmd" = "-i" ]; then 233*587392a5SHajimu UMEMOTO printf "$i " 234*587392a5SHajimu UMEMOTO else 235*587392a5SHajimu UMEMOTO echo_resolv "$i" 236*587392a5SHajimu UMEMOTO fi 237*587392a5SHajimu UMEMOTO done 238*587392a5SHajimu UMEMOTO [ "$cmd" = i -o "$cmd" = "-i" ] && echo 239*587392a5SHajimu UMEMOTO return $retval 240*587392a5SHajimu UMEMOTO} 241*587392a5SHajimu UMEMOTO 242*587392a5SHajimu UMEMOTOmake_vars() 243*587392a5SHajimu UMEMOTO{ 244*587392a5SHajimu UMEMOTO eval "$(list_resolv -l "$@" | parse_resolv)" 245*587392a5SHajimu UMEMOTO 246*587392a5SHajimu UMEMOTO # Ensure that we only list each domain once 247*587392a5SHajimu UMEMOTO newdomains= 248*587392a5SHajimu UMEMOTO for d in $DOMAINS; do 249*587392a5SHajimu UMEMOTO dn="${d%%:*}" 250*587392a5SHajimu UMEMOTO case " $newdomains" in 251*587392a5SHajimu UMEMOTO *" ${dn}:"*) continue;; 252*587392a5SHajimu UMEMOTO esac 253*587392a5SHajimu UMEMOTO newdomains="$newdomains${newdomains:+ }$dn:" 254*587392a5SHajimu UMEMOTO newns= 255*587392a5SHajimu UMEMOTO for nd in $DOMAINS; do 256*587392a5SHajimu UMEMOTO if [ "$dn" = "${nd%%:*}" ]; then 257*587392a5SHajimu UMEMOTO ns="${nd#*:}" 258*587392a5SHajimu UMEMOTO while [ -n "$ns" ]; do 259*587392a5SHajimu UMEMOTO case ",$newns," in 260*587392a5SHajimu UMEMOTO *,${ns%%,*},*) ;; 261*587392a5SHajimu UMEMOTO *) newns="$newns${newns:+,}${ns%%,*}";; 262*587392a5SHajimu UMEMOTO esac 263*587392a5SHajimu UMEMOTO [ "$ns" = "${ns#*,}" ] && break 264*587392a5SHajimu UMEMOTO ns="${ns#*,}" 265*587392a5SHajimu UMEMOTO done 266*587392a5SHajimu UMEMOTO fi 267*587392a5SHajimu UMEMOTO done 268*587392a5SHajimu UMEMOTO newdomains="$newdomains$newns" 269*587392a5SHajimu UMEMOTO done 270*587392a5SHajimu UMEMOTO echo "DOMAINS='$newdomains'" 271*587392a5SHajimu UMEMOTO echo "SEARCH='$(uniqify $SEARCH)'" 272*587392a5SHajimu UMEMOTO echo "NAMESERVERS='$(uniqify $NAMESERVERS)'" 273*587392a5SHajimu UMEMOTO echo "LOCALNAMESERVERS='$(uniqify $LOCALNAMESERVERS)'" 274*587392a5SHajimu UMEMOTO} 275*587392a5SHajimu UMEMOTO 276*587392a5SHajimu UMEMOTOforce=false 277*587392a5SHajimu UMEMOTOwhile getopts a:d:fhIilm:puv OPT; do 278*587392a5SHajimu UMEMOTO case "$OPT" in 279*587392a5SHajimu UMEMOTO f) force=true;; 280*587392a5SHajimu UMEMOTO h) usage;; 281*587392a5SHajimu UMEMOTO m) IF_METRIC="$OPTARG";; 282*587392a5SHajimu UMEMOTO p) IF_PRIVATE=1;; 283*587392a5SHajimu UMEMOTO '?') ;; 284*587392a5SHajimu UMEMOTO *) cmd="$OPT"; iface="$OPTARG";; 285*587392a5SHajimu UMEMOTO esac 286*587392a5SHajimu UMEMOTOdone 287*587392a5SHajimu UMEMOTOshift $(($OPTIND - 1)) 288*587392a5SHajimu UMEMOTOargs="$iface${iface:+ }$@" 289*587392a5SHajimu UMEMOTO 290*587392a5SHajimu UMEMOTO# -I inits the state dir 291*587392a5SHajimu UMEMOTOif [ "$cmd" = I ]; then 292*587392a5SHajimu UMEMOTO if [ -d "$VARDIR" ]; then 293*587392a5SHajimu UMEMOTO rm -rf "$VARDIR"/* 294*587392a5SHajimu UMEMOTO fi 295*587392a5SHajimu UMEMOTO exit $? 296*587392a5SHajimu UMEMOTOfi 297*587392a5SHajimu UMEMOTO 298*587392a5SHajimu UMEMOTO# -l lists our resolv files, optionally for a specific interface 299*587392a5SHajimu UMEMOTOif [ "$cmd" = l -o "$cmd" = i ]; then 300*587392a5SHajimu UMEMOTO list_resolv "$cmd" "$args" 301*587392a5SHajimu UMEMOTO exit $? 302*587392a5SHajimu UMEMOTOfi 303*587392a5SHajimu UMEMOTO 304*587392a5SHajimu UMEMOTO# Not normally needed, but subscribers should be able to run independently 305*587392a5SHajimu UMEMOTOif [ "$cmd" = v ]; then 306*587392a5SHajimu UMEMOTO make_vars "$iface" 307*587392a5SHajimu UMEMOTO exit $? 308*587392a5SHajimu UMEMOTOfi 309*587392a5SHajimu UMEMOTO 310*587392a5SHajimu UMEMOTO# Test that we have valid options 311*587392a5SHajimu UMEMOTOif [ "$cmd" = a -o "$cmd" = d ]; then 312*587392a5SHajimu UMEMOTO if [ -z "$iface" ]; then 313*587392a5SHajimu UMEMOTO usage "Interface not specified" 314*587392a5SHajimu UMEMOTO fi 315*587392a5SHajimu UMEMOTOelif [ "$cmd" != u ]; then 316*587392a5SHajimu UMEMOTO [ -n "$cmd" -a "$cmd" != h ] && usage "Unknown option $cmd" 317*587392a5SHajimu UMEMOTO usage 318*587392a5SHajimu UMEMOTOfi 319*587392a5SHajimu UMEMOTOif [ "$cmd" = a ]; then 320*587392a5SHajimu UMEMOTO for x in '/' \\ ' ' '*'; do 321*587392a5SHajimu UMEMOTO case "$iface" in 322*587392a5SHajimu UMEMOTO *[$x]*) error_exit "$x not allowed in interface name";; 323*587392a5SHajimu UMEMOTO esac 324*587392a5SHajimu UMEMOTO done 325*587392a5SHajimu UMEMOTO for x in '.' '-' '~'; do 326*587392a5SHajimu UMEMOTO case "$iface" in 327*587392a5SHajimu UMEMOTO [$x]*) error_exit \ 328*587392a5SHajimu UMEMOTO "$x not allowed at start of interface name";; 329*587392a5SHajimu UMEMOTO esac 330*587392a5SHajimu UMEMOTO done 331*587392a5SHajimu UMEMOTO [ "$cmd" = a -a -t 0 ] && error_exit "No file given via stdin" 332*587392a5SHajimu UMEMOTOfi 333*587392a5SHajimu UMEMOTO 334*587392a5SHajimu UMEMOTOif [ ! -d "$IFACEDIR" ]; then 335*587392a5SHajimu UMEMOTO if [ ! -d "$VARDIR" ]; then 336*587392a5SHajimu UMEMOTO if [ -L "$VARDIR" ]; then 337*587392a5SHajimu UMEMOTO dir="$(readlink "$VARDIR")" 338*587392a5SHajimu UMEMOTO # link maybe relative 339*587392a5SHajimu UMEMOTO cd "${VARDIR%/*}" 340*587392a5SHajimu UMEMOTO if ! mkdir -m 0755 -p "$dir"; then 341*587392a5SHajimu UMEMOTO error_exit "Failed to create needed" \ 342*587392a5SHajimu UMEMOTO "directory $dir" 343*587392a5SHajimu UMEMOTO fi 344*587392a5SHajimu UMEMOTO else 345*587392a5SHajimu UMEMOTO if ! mkdir -m 0755 -p "$VARDIR"; then 346*587392a5SHajimu UMEMOTO error_exit "Failed to create needed" \ 347*587392a5SHajimu UMEMOTO "directory $VARDIR" 348*587392a5SHajimu UMEMOTO fi 349*587392a5SHajimu UMEMOTO fi 350*587392a5SHajimu UMEMOTO fi 351*587392a5SHajimu UMEMOTO mkdir -m 0755 -p "$IFACEDIR" || \ 352*587392a5SHajimu UMEMOTO error_exit "Failed to create needed directory $IFACEDIR" 353*587392a5SHajimu UMEMOTOelse 354*587392a5SHajimu UMEMOTO # Delete any existing information about the interface 355*587392a5SHajimu UMEMOTO if [ "$cmd" = d ]; then 356*587392a5SHajimu UMEMOTO cd "$IFACEDIR" 357*587392a5SHajimu UMEMOTO for i in $args; do 358*587392a5SHajimu UMEMOTO if [ "$cmd" = d -a ! -e "$i" ]; then 359*587392a5SHajimu UMEMOTO $force && continue 360*587392a5SHajimu UMEMOTO error_exit "No resolv.conf for" \ 361*587392a5SHajimu UMEMOTO "interface $i" 362*587392a5SHajimu UMEMOTO fi 363*587392a5SHajimu UMEMOTO rm -f "$i" "$METRICDIR/"*" $i" \ 364*587392a5SHajimu UMEMOTO "$PRIVATEDIR/$i" || exit $? 365*587392a5SHajimu UMEMOTO done 366*587392a5SHajimu UMEMOTO fi 367*587392a5SHajimu UMEMOTOfi 368*587392a5SHajimu UMEMOTO 369*587392a5SHajimu UMEMOTOif [ "$cmd" = a ]; then 370*587392a5SHajimu UMEMOTO # Read resolv.conf from stdin 371*587392a5SHajimu UMEMOTO resolv="$(cat)\n" 372*587392a5SHajimu UMEMOTO # If what we are given matches what we have, then do nothing 373*587392a5SHajimu UMEMOTO if [ -e "$IFACEDIR/$iface" ]; then 374*587392a5SHajimu UMEMOTO if [ "$(printf "$resolv")" = \ 375*587392a5SHajimu UMEMOTO "$(cat "$IFACEDIR/$iface")" ] 376*587392a5SHajimu UMEMOTO then 377*587392a5SHajimu UMEMOTO exit 0 378*587392a5SHajimu UMEMOTO fi 379*587392a5SHajimu UMEMOTO rm "$IFACEDIR/$iface" 380*587392a5SHajimu UMEMOTO fi 381*587392a5SHajimu UMEMOTO printf "$resolv" >"$IFACEDIR/$iface" || exit $? 382*587392a5SHajimu UMEMOTO [ ! -d "$METRICDIR" ] && mkdir "$METRICDIR" 383*587392a5SHajimu UMEMOTO rm -f "$METRICDIR/"*" $iface" 384*587392a5SHajimu UMEMOTO if [ -n "$IF_METRIC" ]; then 385*587392a5SHajimu UMEMOTO # Pad metric to 6 characters, so 5 is less than 10 386*587392a5SHajimu UMEMOTO while [ ${#IF_METRIC} -le 6 ]; do 387*587392a5SHajimu UMEMOTO IF_METRIC="0$IF_METRIC" 388*587392a5SHajimu UMEMOTO done 389*587392a5SHajimu UMEMOTO echo " " >"$METRICDIR/$IF_METRIC $iface" 390*587392a5SHajimu UMEMOTO fi 391*587392a5SHajimu UMEMOTO case "$IF_PRIVATE" in 392*587392a5SHajimu UMEMOTO [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) 393*587392a5SHajimu UMEMOTO if [ ! -d "$PRIVATEDIR" ]; then 394*587392a5SHajimu UMEMOTO [ -e "$PRIVATEDIR" ] && rm "$PRIVATEDIR" 395*587392a5SHajimu UMEMOTO mkdir "$PRIVATEDIR" 396*587392a5SHajimu UMEMOTO fi 397*587392a5SHajimu UMEMOTO [ -d "$PRIVATEDIR" ] && echo " " >"$PRIVATEDIR/$iface" 398*587392a5SHajimu UMEMOTO ;; 399*587392a5SHajimu UMEMOTO *) 400*587392a5SHajimu UMEMOTO if [ -e "$PRIVATEDIR/$iface" ]; then 401*587392a5SHajimu UMEMOTO rm -f "$PRIVATEDIR/$iface" 402*587392a5SHajimu UMEMOTO fi 403*587392a5SHajimu UMEMOTO ;; 404*587392a5SHajimu UMEMOTO esac 405*587392a5SHajimu UMEMOTOfi 406*587392a5SHajimu UMEMOTO 407*587392a5SHajimu UMEMOTOeval "$(make_vars)" 408*587392a5SHajimu UMEMOTOexport RESOLVCONF DOMAINS SEARCH NAMESERVERS LOCALNAMESERVERS 409*587392a5SHajimu UMEMOTO: ${list_resolv:=list_resolv -l} 410*587392a5SHajimu UMEMOTOretval=0 411*587392a5SHajimu UMEMOTOfor script in "$LIBEXECDIR"/*; do 412*587392a5SHajimu UMEMOTO if [ -f "$script" ]; then 413*587392a5SHajimu UMEMOTO if [ -x "$script" ]; then 414*587392a5SHajimu UMEMOTO "$script" "$cmd" "$iface" 415*587392a5SHajimu UMEMOTO else 416*587392a5SHajimu UMEMOTO (. "$script" "$cmd" "$iface") 417*587392a5SHajimu UMEMOTO fi 418*587392a5SHajimu UMEMOTO retval=$(($retval + $?)) 419*587392a5SHajimu UMEMOTO fi 420*587392a5SHajimu UMEMOTOdone 421*587392a5SHajimu UMEMOTOexit $retval 422