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