xref: /minix3/external/bsd/dhcp/dist/client/scripts/macos (revision 83ee113ee0d94f3844d44065af2311604e9a30ad)
1*83ee113eSDavid van Moolenbroek#!/bin/sh
2*83ee113eSDavid van Moolenbroek#
3*83ee113eSDavid van Moolenbroek# Id: macos,v 1.4 2011/09/20 16:59:54 sar Exp
4*83ee113eSDavid van Moolenbroek#
5*83ee113eSDavid van Moolenbroek# automous run of this script will commit the DNS setting
6*83ee113eSDavid van Moolenbroek#
7*83ee113eSDavid van Moolenbroek
8*83ee113eSDavid van Moolenbroekif [ -x /usr/bin/logger ]; then
9*83ee113eSDavid van Moolenbroek	LOGGER="/usr/bin/logger -s -p user.notice -t dhclient"
10*83ee113eSDavid van Moolenbroekelse
11*83ee113eSDavid van Moolenbroek	LOGGER=echo
12*83ee113eSDavid van Moolenbroekfi
13*83ee113eSDavid van Moolenbroek
14*83ee113eSDavid van Moolenbroekto_commit="yes"
15*83ee113eSDavid van Moolenbroek
16*83ee113eSDavid van Moolenbroekmake_resolv_conf() {
17*83ee113eSDavid van Moolenbroek  to_commit="no"
18*83ee113eSDavid van Moolenbroek  if [ "x${new_dhcp6_name_servers}" != x ]; then
19*83ee113eSDavid van Moolenbroek    ( cat /dev/null > /var/run/resolv.conf.dhclient6 )
20*83ee113eSDavid van Moolenbroek    exit_status=$?
21*83ee113eSDavid van Moolenbroek    if [ $exit_status -ne 0 ]; then
22*83ee113eSDavid van Moolenbroek      $LOGGER "Unable to create /var/run/resolv.conf.dhclient6: Error $exit_status"
23*83ee113eSDavid van Moolenbroek    else
24*83ee113eSDavid van Moolenbroek      if [ "x${new_dhcp6_domain_search}" != x ]; then
25*83ee113eSDavid van Moolenbroek	( echo search ${new_dhcp6_domain_search} >> /var/run/resolv.conf.dhclient6 )
26*83ee113eSDavid van Moolenbroek	exit_status=$?
27*83ee113eSDavid van Moolenbroek      fi
28*83ee113eSDavid van Moolenbroek      for nameserver in ${new_dhcp6_name_servers} ; do
29*83ee113eSDavid van Moolenbroek	if [ $exit_status -ne 0 ]; then
30*83ee113eSDavid van Moolenbroek	  break
31*83ee113eSDavid van Moolenbroek	fi
32*83ee113eSDavid van Moolenbroek	# If the nameserver has a link-local address
33*83ee113eSDavid van Moolenbroek	# add a <zone_id> (interface name) to it.
34*83ee113eSDavid van Moolenbroek	case $nameserver in
35*83ee113eSDavid van Moolenbroek	    fe80:*) zone_id="%$interface";;
36*83ee113eSDavid van Moolenbroek	    FE80:*) zone_id="%$interface";;
37*83ee113eSDavid van Moolenbroek	   *)      zone_id="";;
38*83ee113eSDavid van Moolenbroek	esac
39*83ee113eSDavid van Moolenbroek        ( echo nameserver ${nameserver}$zone_id >> /etc/resolv.conf.dhclient6 )
40*83ee113eSDavid van Moolenbroek	exit_status=$?
41*83ee113eSDavid van Moolenbroek      done
42*83ee113eSDavid van Moolenbroek
43*83ee113eSDavid van Moolenbroek      if [ $exit_status -eq 0 ]; then
44*83ee113eSDavid van Moolenbroek	to_commit="force"
45*83ee113eSDavid van Moolenbroek	commit_resolv_conf
46*83ee113eSDavid van Moolenbroek      fi
47*83ee113eSDavid van Moolenbroek    fi
48*83ee113eSDavid van Moolenbroek  fi
49*83ee113eSDavid van Moolenbroek}
50*83ee113eSDavid van Moolenbroek
51*83ee113eSDavid van Moolenbroek# Try to commit /var/run/resolv.conf.dhclient6 contents to
52*83ee113eSDavid van Moolenbroek# System Configuration framework's Dynamic Store.
53*83ee113eSDavid van Moolenbroek# Note this will be cleared by the next location change
54*83ee113eSDavid van Moolenbroek# or preempted by IPv4.
55*83ee113eSDavid van Moolenbroek#
56*83ee113eSDavid van Moolenbroek# The System Configuration agent "IPMonitor" gets the DNS configuration
57*83ee113eSDavid van Moolenbroek# from the IPv4 or IPv6 primary service in the Dynamic Store
58*83ee113eSDavid van Moolenbroek# (managed by configd).
59*83ee113eSDavid van Moolenbroekcommit_resolv_conf() {
60*83ee113eSDavid van Moolenbroek  if [ -f /var/run/resolv.conf.dhclient6 ]; then
61*83ee113eSDavid van Moolenbroek    if [ -x /usr/sbin/scutil ]; then
62*83ee113eSDavid van Moolenbroek      serviceID=`echo show State:/Network/Global/IPv6 | \
63*83ee113eSDavid van Moolenbroek          /usr/sbin/scutil | \
64*83ee113eSDavid van Moolenbroek          awk '/PrimaryService/ { print $3 }'`
65*83ee113eSDavid van Moolenbroek      echo $serviceID
66*83ee113eSDavid van Moolenbroek      if [ x$serviceID = x ]; then
67*83ee113eSDavid van Moolenbroek        $LOGGER "Can't find the primary IPv6 service"
68*83ee113eSDavid van Moolenbroek      else
69*83ee113eSDavid van Moolenbroek        tmp=`mktemp SC_dhclient6.XXXXXXXXXX`
70*83ee113eSDavid van Moolenbroek        echo list | /usr/sbin/scutil > /tmp/$tmp
71*83ee113eSDavid van Moolenbroek        grep -q State:/Network/Service/$serviceID/DNS /tmp/$tmp
72*83ee113eSDavid van Moolenbroek        grep_status=$?
73*83ee113eSDavid van Moolenbroek        if [ $grep_status -eq 0 ]; then
74*83ee113eSDavid van Moolenbroek          $LOGGER "DNS service already set in primary IPv6 service"
75*83ee113eSDavid van Moolenbroek          rm /tmp/$tmp
76*83ee113eSDavid van Moolenbroek        else
77*83ee113eSDavid van Moolenbroek          res=/var/run/resolv.conf.dhclient6
78*83ee113eSDavid van Moolenbroek          cp /dev/null /tmp/$tmp
79*83ee113eSDavid van Moolenbroek          grep -q '^nameserver' $res
80*83ee113eSDavid van Moolenbroek          grep_status=$?
81*83ee113eSDavid van Moolenbroek          if [ $grep_status -eq 0 ]; then
82*83ee113eSDavid van Moolenbroek            echo d.add ServerAddresses '*' \
83*83ee113eSDavid van Moolenbroek                 `awk 'BEGIN { n="" } \
84*83ee113eSDavid van Moolenbroek                       /^nameserver/ { n=n " " $2 } \
85*83ee113eSDavid van Moolenbroek                       END { print n}' < $res` >> /tmp/$tmp
86*83ee113eSDavid van Moolenbroek          fi
87*83ee113eSDavid van Moolenbroek          grep -q '^search' $res
88*83ee113eSDavid van Moolenbroek          grep_status=$?
89*83ee113eSDavid van Moolenbroek          if [ $grep_status -eq 0 ]; then
90*83ee113eSDavid van Moolenbroek            echo d.add SearchDomains '*' \
91*83ee113eSDavid van Moolenbroek                 `sed 's/^search//' < $res` >> /tmp/$tmp
92*83ee113eSDavid van Moolenbroek          fi
93*83ee113eSDavid van Moolenbroek          echo set State:/Network/Service/$serviceID/DNS >> /tmp/$tmp
94*83ee113eSDavid van Moolenbroek          echo quit >> /tmp/$tmp
95*83ee113eSDavid van Moolenbroek          cat /tmp/$tmp
96*83ee113eSDavid van Moolenbroek          /usr/sbin/scutil < /tmp/$tmp
97*83ee113eSDavid van Moolenbroek          rm /tmp/$tmp
98*83ee113eSDavid van Moolenbroek        fi
99*83ee113eSDavid van Moolenbroek      fi
100*83ee113eSDavid van Moolenbroek    else
101*83ee113eSDavid van Moolenbroek      $LOGGER "Can't find SystemConfiguration tools."
102*83ee113eSDavid van Moolenbroek    fi
103*83ee113eSDavid van Moolenbroek  else
104*83ee113eSDavid van Moolenbroek    if [ $to_commit = force ]; then
105*83ee113eSDavid van Moolenbroek      $LOGGER "Can't find /var/run/resolv.conf.dhclient6"
106*83ee113eSDavid van Moolenbroek    fi
107*83ee113eSDavid van Moolenbroek  fi
108*83ee113eSDavid van Moolenbroek  to_commit="done"
109*83ee113eSDavid van Moolenbroek}
110*83ee113eSDavid van Moolenbroek
111*83ee113eSDavid van Moolenbroek# Must be used on exit.   Invokes the local dhcp client exit hooks, if any.
112*83ee113eSDavid van Moolenbroekexit_with_hooks() {
113*83ee113eSDavid van Moolenbroek  exit_status=$1
114*83ee113eSDavid van Moolenbroek  if [ -f /etc/dhclient-exit-hooks ]; then
115*83ee113eSDavid van Moolenbroek    . /etc/dhclient-exit-hooks
116*83ee113eSDavid van Moolenbroek  fi
117*83ee113eSDavid van Moolenbroek# probably should do something with exit status of the local script
118*83ee113eSDavid van Moolenbroek  exit $exit_status
119*83ee113eSDavid van Moolenbroek}
120*83ee113eSDavid van Moolenbroek
121*83ee113eSDavid van Moolenbroek# Invoke the local dhcp client enter hooks, if they exist.
122*83ee113eSDavid van Moolenbroekif [ -f /etc/dhclient-enter-hooks ]; then
123*83ee113eSDavid van Moolenbroek  exit_status=0
124*83ee113eSDavid van Moolenbroek  . /etc/dhclient-enter-hooks
125*83ee113eSDavid van Moolenbroek  # allow the local script to abort processing of this state
126*83ee113eSDavid van Moolenbroek  # local script must set exit_status variable to nonzero.
127*83ee113eSDavid van Moolenbroek  if [ $exit_status -ne 0 ]; then
128*83ee113eSDavid van Moolenbroek    exit $exit_status
129*83ee113eSDavid van Moolenbroek  fi
130*83ee113eSDavid van Moolenbroekfi
131*83ee113eSDavid van Moolenbroek
132*83ee113eSDavid van Moolenbroekif [ x$reason = xMEDIUM ]; then
133*83ee113eSDavid van Moolenbroek  eval "ifconfig $interface $medium"
134*83ee113eSDavid van Moolenbroek  eval "ifconfig $interface inet -alias 0.0.0.0 $medium" >/dev/null 2>&1
135*83ee113eSDavid van Moolenbroek  sleep 1
136*83ee113eSDavid van Moolenbroek  exit_with_hooks 0
137*83ee113eSDavid van Moolenbroekfi
138*83ee113eSDavid van Moolenbroek
139*83ee113eSDavid van Moolenbroek###
140*83ee113eSDavid van Moolenbroek### DHCPv6 Handlers
141*83ee113eSDavid van Moolenbroek###
142*83ee113eSDavid van Moolenbroek
143*83ee113eSDavid van Moolenbroekif [ x$reason = xPREINIT6 ]; then
144*83ee113eSDavid van Moolenbroek  # Ensure interface is up.
145*83ee113eSDavid van Moolenbroek  ifconfig ${interface} up
146*83ee113eSDavid van Moolenbroek
147*83ee113eSDavid van Moolenbroek  # XXX: Remove any stale addresses from aborted clients.
148*83ee113eSDavid van Moolenbroek
149*83ee113eSDavid van Moolenbroek  exit_with_hooks 0
150*83ee113eSDavid van Moolenbroekfi
151*83ee113eSDavid van Moolenbroek
152*83ee113eSDavid van Moolenbroekif [ x${old_ip6_prefix} != x ] || [ x${new_ip6_prefix} != x ]; then
153*83ee113eSDavid van Moolenbroek    echo Prefix $reason old=${old_ip6_prefix} new=${new_ip6_prefix}
154*83ee113eSDavid van Moolenbroek
155*83ee113eSDavid van Moolenbroek    exit_with_hooks 0
156*83ee113eSDavid van Moolenbroekfi
157*83ee113eSDavid van Moolenbroek
158*83ee113eSDavid van Moolenbroekif [ x$reason = xBOUND6 ]; then
159*83ee113eSDavid van Moolenbroek  if [ x${new_ip6_address} = x ] || [ x${new_ip6_prefixlen} = x ]; then
160*83ee113eSDavid van Moolenbroek    exit_with_hooks 2;
161*83ee113eSDavid van Moolenbroek  fi
162*83ee113eSDavid van Moolenbroek
163*83ee113eSDavid van Moolenbroek  ifconfig ${interface} inet6 ${new_ip6_address}/${new_ip6_prefixlen} alias
164*83ee113eSDavid van Moolenbroek
165*83ee113eSDavid van Moolenbroek  # Check for nameserver options.
166*83ee113eSDavid van Moolenbroek  make_resolv_conf
167*83ee113eSDavid van Moolenbroek
168*83ee113eSDavid van Moolenbroek  exit_with_hooks 0
169*83ee113eSDavid van Moolenbroekfi
170*83ee113eSDavid van Moolenbroek
171*83ee113eSDavid van Moolenbroekif [ x$reason = xRENEW6 ] || [ x$reason = xREBIND6 ]; then
172*83ee113eSDavid van Moolenbroek  # Make sure nothing has moved around on us.
173*83ee113eSDavid van Moolenbroek
174*83ee113eSDavid van Moolenbroek  # Nameservers/domains/etc.
175*83ee113eSDavid van Moolenbroek  if [ "x${new_dhcp6_name_servers}" != "x${old_dhcp6_name_servers}" ] ||
176*83ee113eSDavid van Moolenbroek     [ "x${new_dhcp6_domain_search}" != "x${old_dhcp6_domain_search}" ]; then
177*83ee113eSDavid van Moolenbroek    make_resolv_conf
178*83ee113eSDavid van Moolenbroek  fi
179*83ee113eSDavid van Moolenbroek
180*83ee113eSDavid van Moolenbroek  exit_with_hooks 0
181*83ee113eSDavid van Moolenbroekfi
182*83ee113eSDavid van Moolenbroek
183*83ee113eSDavid van Moolenbroekif [ x$reason = xDEPREF6 ]; then
184*83ee113eSDavid van Moolenbroek  if [ x${new_ip6_address} = x ]; then
185*83ee113eSDavid van Moolenbroek    exit_with_hooks 2;
186*83ee113eSDavid van Moolenbroek  fi
187*83ee113eSDavid van Moolenbroek
188*83ee113eSDavid van Moolenbroek  ifconfig ${interface} inet6 ${new_ip6_address} deprecated
189*83ee113eSDavid van Moolenbroek
190*83ee113eSDavid van Moolenbroek  exit_with_hooks 0
191*83ee113eSDavid van Moolenbroekfi
192*83ee113eSDavid van Moolenbroek
193*83ee113eSDavid van Moolenbroekif [ x$reason = xEXPIRE6 -o x$reason = xRELEASE6 -o x$reason = xSTOP6 ]; then
194*83ee113eSDavid van Moolenbroek  if [ x${old_ip6_address} = x ] || [ x${old_ip6_prefixlen} = x ]; then
195*83ee113eSDavid van Moolenbroek    exit_with_hooks 2;
196*83ee113eSDavid van Moolenbroek  fi
197*83ee113eSDavid van Moolenbroek
198*83ee113eSDavid van Moolenbroek  ifconfig ${interface} inet6 ${old_ip6_address}/${old_ip6_prefixlen} -alias
199*83ee113eSDavid van Moolenbroek
200*83ee113eSDavid van Moolenbroek  exit_with_hooks 0
201*83ee113eSDavid van Moolenbroekfi
202*83ee113eSDavid van Moolenbroek
203*83ee113eSDavid van Moolenbroekif [ $to_commit = yes ]; then
204*83ee113eSDavid van Moolenbroek  commit_resolv_conf
205*83ee113eSDavid van Moolenbroekfi
206*83ee113eSDavid van Moolenbroek
207*83ee113eSDavid van Moolenbroekexit_with_hooks 0
208