#!/bin/sh # # Andrei.Ryjov@yahoo.com Fri Dec 7 19:28:22 MET 2001 # # Jumpstart's auto-revarp does not work for secondary interfaces, # when these interfaces are down by rcS runtime # # Up and revarp whatever has already got the carrier # [ -z "$SI_CONFIG_DIR" ] && SI_CONFIG_DIR=/tmp/install_config [ -z "$SID" ] && SID=$SI_CONFIG_DIR [ XVarsAreSet = XYes ] || . $SID/Scripts/Misc/!Includes/Subroutines [ XSubrIsRead = XYes ] || SetJVars JMASKS=$SI_CONFIG_DIR/etc/netmasks NDD=/usr/sbin/ndd IFLIST="" # MYADDR, PRIMARY_IFC, PRIMARY_NET are set by SetVars sh include # and inherited from parent ($SI_CONFIG_DIR/Scripts/Begin/Std, usually) [ x$PRIMARY_IFC = x ] && FindNetInfo [ x$PRIMARY_IFC = x ] && StartShell ====== FindNetInfo ===== # # Yes, we duplicate some rcS's functionality here # for j in `ifconfig -a | egrep ': flags=.* mtu .*' | grep -v '^lo0:' | cut -d: -f1` ; do # # We presume that whatever is a digit, is part of a number (device instance) # and everything else is a driver name. But we double-check it, of course # DRV=`echo $j | sed 's/[0-9]*//g'` NUM=`echo $j | sed "s/$DRV//g"` [ -h /dev/$DRV -a -c /dev/$DRV ] || { echo " WARNING: Could not find a device driver for interface $DRV instance $NUM " continue } OLD_IP=`ifconfig ${DRV}${NUM} | grep inet | awk '{print $2}'` OLD_MC=`ifconfig ${DRV}${NUM} | grep ether | awk '{print $2}'` [ x$OLD_IP = x$MYADDR ] && { # # Correct the mask on primary interface (!) # First, make sure ROOT_SERVER is mounted through PRIMARY_IFC # As this happens in a very beginning of Jumpstart # (no much use of /cdrom yet), ROOT_SERVER must be the Ipkts leader # ROOT_SERVER=`mount | awk '/^\/ on / {print $3}' | cut -d: -f1` MOST_USED_IFC=`netstat -in | awk '!/dres/&&!/^lo0/ {print $5" "$1}' | sort -n | tail -1 | awk '{print $2}'` [ "$MOST_USED_IFC" != "$PRIMARY_IFC" ] && { echo " WARNING: $MOST_USED_IFC Ipkts is higher than on $PRIMARY_IFC Shall not risk to change the netmask on either " continue } HMASK=`get_netmask $ROOT_SERVER` [ -z "$HMASK" ] && { echo " WARNING: Failed to get netmask from $ROOT_SERVER Skipping $PRIMARY_IFC netmask control " } OLD_HMASK=`ifconfig $PRIMARY_IFC | grep netmask | awk '{print $4}'` [ "$HMASK" = "$OLD_HMASK" ] && { echo " NOTICE: $PRIMARY_IFC mask was correct - no change " continue } echo " NOTICE: Changing the mask of $PRIMARY_IFC $OLD_HMASK ==> $HMASK " ifconfig $PRIMARY_IFC netmask 0x$HMASK broadcast + continue } [ "$OLD_IP" != 0.0.0.0 ] && continue echo Checking carrier on network interface ${DRV}${NUM} "... \c" # # ndd link_status only works from second time, and # only if interface is up # $NDD -set /dev/$DRV instance $NUM || continue sleep 2 ; ifconfig ${DRV}${NUM} down sleep 2 ; ifconfig ${DRV}${NUM} unplumb sleep 2 ; ifconfig ${DRV}${NUM} plumb sleep 2 ; ifconfig ${DRV}${NUM} -trailers up sleep 4 ; echo LINK_STATUS=`$NDD -get /dev/$DRV link_status` echo $LINK_STATUS | egrep -s '^[01]$' || continue echo RevARPing network interface ${DRV}${NUM} "... \c" [ $LINK_STATUS -eq 1 ] && { # # Try to rewarp 3 times, for lasy switches # for i in 1 2 ; do echo sleep 3 ifconfig ${DRV}${NUM} auto-revarp NEW_IP=`ifconfig ${DRV}${NUM} | grep inet | awk '{print $2}'` [ "$NEW_IP" != 0.0.0.0 ] && break echo Re-Trying ${DRV}${NUM} "... \c" sleep 2 ; ifconfig ${DRV}${NUM} down sleep 2 ; ifconfig ${DRV}${NUM} unplumb sleep 2 ; ifconfig ${DRV}${NUM} plumb sleep 2 ; ifconfig ${DRV}${NUM} -trailers up done } NEW_IP=`ifconfig ${DRV}${NUM} | grep inet | awk '{print $2}'` [ "$NEW_IP" != "$OLD_IP" ] && { /sbin/ifconfig ${DRV}${NUM} inet $NEW_IP netmask + broadcast + HMASK=`ifconfig ${DRV}${NUM} | grep netmask | awk '{print $4}'` Net=`netstat -in | awk "/^${DRV}${NUM}/"'{print $3}'` cat $JMASKS | egrep "^$Net" | while read net mask stuff ; do [ ! -z "$mask" ] && ifconfig ${DRV}${NUM} inet $NEW_IP netmask $mask broadcast + done HMASK=`ifconfig ${DRV}${NUM} | grep netmask | awk '{print $4}'` BCAST=`ifconfig ${DRV}${NUM} | grep broadcast | awk '{print $6}'` echo inet $NEW_IP netmask $HMASK broadcast $BCAST inet $NEW_IP netmask $HMASK broadcast $BCAST } done # echo Check Link Status - Just ping, OK ; Start_Shell $0