#!/bin/sh
#ident	"@(#)autoconfig	1.17 02/16/99 SMI"
#Copyright (c) 2000 Sun Microsystems, Inc.  All Rights Reserved.
#09/03/1998 gshieh
#
#	Copyright 1993 NCR Corporation - Dayton, Ohio, USA
#
# autoconfig for NetBIOS 
#

NBHOMEETC=/etc/opt/SUNWlznb

FNETBIOSCONF=$NBHOMEETC/netbios.conf
FNETBIOSCONFTMP=$NBHOMEETC/.netbios.conf.tmp$$
FNBCONFIG=$NBHOMEETC/nbconfig
HWCONF=$NBHOMEETC/boards
HWCONFTMP=$NBHOMEETC/.boards.tmp$$

FTEMP=$NBHOMEETC/temp
FTEMP1=$NBHOMEETC/temp1

FTEMP3=$NBHOMEETC/temp3


#important, used to discover hostname
HOSTS=/etc/hosts

AWK=/usr/bin/nawk
CAT=/usr/bin/cat
CP=/usr/bin/cp
CUT=/usr/bin/cut
DIFF=/usr/bin/diff
EGREP=/usr/bin/egrep
EXPR=/usr/bin/expr
FGREP=/usr/bin/fgrep
GETENT=/usr/bin/getent
GREP=/bin/grep
MV=/usr/bin/mv
RM=/usr/bin/rm
SED=/usr/bin/sed
SORT=/usr/bin/sort
TR=/usr/bin/tr
WC=/usr/bin/wc
UNAME=/usr/bin/uname

CKITEM=/usr/bin/ckitem
CKRANGE=/usr/bin/ckrange
CKYORN=/usr/bin/ckyorn

#
# SC 2.2 HA commands
#
HAGET=/opt/SUNWcluster/bin/haget

# Signal handler to delete all temporary files.
cleanup() 
{
  # Remove all temporary files.
  $RM -f $FNETBIOSCONFTMP $HWCONFTMP $FTEMP >/dev/null 2>&1
  exit 1
}

#
# Build the SUN PROTOCOL file
#
bldSUNprotocol()
{
  >$FTEMP1
  >$FNETBIOSCONFTMP
  >$HWCONFTMP
  ADAPTYPS="csma/cd"
  GetSolAdapters #Added by KK
    
  $CAT $FTEMP1 > $FTEMP
  $CAT $FTEMP | $EGREP "$ADAPTYPS" | $GREP up | $SORT > $FTEMP1
  $MV $FTEMP1 $FTEMP

  # Calculate the total #'s  Enet adapters with up state
  # ES961449
  activeAdapters=`$CAT $FTEMP | $WC -l`
  if [ "$activeAdapters" -eq 0 ]; then
    echo "\nNetBIOS reconfig: No active adapters found."
    exit 1
  fi
 
  reconf=y


  $CUT -f1-8 $FTEMP >$HWCONFTMP # keep latest hardware configuration

  if [ $reconf = y ]; then
    firsttime=1
    i=1
    LanaIndex=0
    while [ $i -le $activeAdapters ]; do
      set `$SED -n ${i}p $FTEMP`
      i=`$EXPR $i + 1`
     
      
      if [ "$5" = 'csma/cd' ]; then

	ans=`/usr/bin/ckyorn -Q -d y -p "Do you want to configure NetBIOS Lana $LanaIndex over Network Interface: $1 ? (default=y)"`
	
	case "$ans" in
	  Y|y|YES|Yes|yes) ;;
	  *)
	    echo "\nNetBIOS is not configured for Network Interface $1"
	    continue
	    ;;
	esac
	
	protocol=r
	            
	case $protocol in               
	  *)
	    echo "\nEnter SCOPE_ID for NetBIOS Lana $LanaIndex (or press Enter to skip): \c"
	    RFC2=y;
	    read scopeId2
	    ;;
	esac
	
	if [ -z "$scopeId2" ]; then
	  scopeId2=""
	fi
	if [ "$firsttime" -eq 1 -a -n "$CLSHOST" ]
	then
	    echo '# Machine-Generated Cluster configuration -- do not edit' >>$FNETBIOSCONFTMP
	    firsttime=0
	fi
	if [ -n "$CLSHOST" -a -n "$9" ]
	then
	    board="$9"
	else
	    board="$1"
	fi
	echo "$LanaIndex\t${board} \t$scopeId2" >>$FNETBIOSCONFTMP
	LanaIndex=`$EXPR $LanaIndex + 1`
      fi
    done 
  fi 	# reconf = y (new protocol file built)
  
} # End bldSunprotocol


# This routine will validate the PPA number in protocol file
# MR ES971604
#
# Build the NBCONFIG file
#
bldNbconfig()
{
  if [ ! -f $FNETBIOSCONF ]; then
    exit 1
  fi
  $RM -f $FNBCONFIG

  lanaIndex=0
  rfcAdapt=0
  
  echo "TRANSPORT=0" >> $FNBCONFIG
  dcots=tcp
  dclts=udp
  while read line; do
    case "$line" in
    \#*)
	continue;;
    esac
    set $line    
    ppa=$1
    soladapterid=$2
    scopeId=$3
    dupent=`$GREP "$soladapterid " $FNETBIOSCONF | $WC -l` #MR ES971604
    if [ $dupent -gt 1 ]; then
      echo "ERROR: Duplicate adapter ID $soladapterid in netbios.conf file\n"
      echo "1" > $NBHOMEETC/error
      continue
    fi    
    
    if [ -z "$soladapterid" ]; then
      echo "ERROR: Invalid empty adapter ID in netbios.conf file"
      echo "1" >$NBHOMEETC/error
      continue
    fi

    badent=`$GREP "$soladapterid " $HWCONF`
    if [ -z "$badent" ]; then
      echo "ERROR: Invalid adapter ID $soladapterid in netbios.conf file"
      echo "1" >$NBHOMEETC/error
      continue
    fi

    enConfig=`$IFCONFIG $soladapterid`
    if [ -z "$enConfig" ]; then
      echo "ERROR: Invalid adapter ID $soladapterid in netbios.conf file"
      echo "1" >$NBHOMEETC/error
      continue
    fi
    
    set $enConfig
    inetAddr=$6
    subnet=$8
    echo $enConfig > $FTEMP3
    bcast=`$AWK '{ print $10}' $FTEMP3`
    $RM $FTEMP3
    # redirect the set output to /dev/null karthik 07/24/95
    set `$EGREP "^$inetAddr[ ]|^$inetAddr[	]" $HOSTS` > /dev/null
    hostName=$2
    rfcAdapt=`$EXPR $rfcAdapt + 1`
        
    # Build the Driver names
    if [ "$dcots" != tcp -o "$dclts" != udp ]; then
      echo "ERROR: Invalid tcp and udp name for RFC1001 in protocol file"
      echo "1" > $NBHOMEETC/error          #MR ES971604
      break
    fi
    for i in 0 1 2 3; do
      echo "DRIVER$i=$dclts"	>>$FNBCONFIG
    done
    for i in 4 5 6 7 8 9 10 11 12; do
      echo "DRIVER$i=$dcots" 	>>$FNBCONFIG
    done
# create the INADDR_ANY Streams for 1st RFC Lana
    if [ $rfcAdapt -eq 1 ]; then
      for i in 13 14; do
	echo "DRIVER$i=$dclts"	>>$FNBCONFIG
      done
    fi

    # Build the Module name
    echo "MODULE$lanaIndex=nb"		>>$FNBCONFIG
    
    # Build the Links information
    for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14; do      
      # only build INADDR_ANY links for 1st RFC Lana
      if [ $rfcAdapt -ne 1 -a "$i" -ge 13 ]; then
	break 
      fi
      echo "LINKS$lanaIndex=$i"	>>$FNBCONFIG
      echo "nb_ppa=$ppa"		>>$FNBCONFIG
      echo "nb_index=$lanaIndex"	>>$FNBCONFIG
      echo "nb_timeout=2"		>>$FNBCONFIG
      echo "nb_count=3"		>>$FNBCONFIG
      
      echo "nb_retry=2"		>>$FNBCONFIG
      if [ "$i" -lt 4 -o "$i" -ge 13 ]; then
	echo "nb_service=2"	>>$FNBCONFIG
      else
	echo "nb_service=8002"	>>$FNBCONFIG
	if [ "$i" -eq 4 ]; then
	  echo "nb_max_conind=6"	>>$FNBCONFIG
	else
	  echo "nb_max_conind=0"	>>$FNBCONFIG
	fi
      fi
      if [ "$i" -lt 13 ]; then
	echo "rfc_ip_address=$inetAddr" 	>>$FNBCONFIG
      else
	echo "rfc_ip_address=0" 	>>$FNBCONFIG
      fi
      
      
      echo "LINKX" 	>>$FNBCONFIG
    done
    
    # Build the Lana information
    echo "LANA=$lanaIndex" 	>>$FNBCONFIG
    echo "nb_name=0"            >>$FNBCONFIG
    echo "nb_d_gram=1" 	>>$FNBCONFIG
    echo "nb_name_bcast=2" >>$FNBCONFIG
    echo "nb_d_gram_bcast=3" >>$FNBCONFIG
    echo "nb_cots=4" 	>>$FNBCONFIG
    if [ $rfcAdapt -eq 1 ]; then
      echo	"nb_name_inaddr=13" >>$FNBCONFIG
      echo	"nb_d_gram_inaddr=14" >>$FNBCONFIG
    fi
    echo "nb_retry=2" 	>>$FNBCONFIG
    
    echo "nb_timeout=2" 	>>$FNBCONFIG
    echo "nb_count=3" 		>>$FNBCONFIG
    echo "nb_max_datagram=512" >>$FNBCONFIG

    echo "nb_adapter=2" 	>>$FNBCONFIG
    
    
    
      if [ $scopeId ]; then
	echo "rfc_scope_id=.$scopeId" >>$FNBCONFIG
      fi
      echo "rfc_bcast_cnt=5" 	>>$FNBCONFIG
      echo "rfc_node_name=$hostName" >>$FNBCONFIG
      echo "rfc_bcast_addr=$bcast" 	>>$FNBCONFIG
      echo "rfc_subnet_msk=$subnet" >>$FNBCONFIG
    
    echo "LANAX" >>$FNBCONFIG
    
    # Calculate the new Lana index
    lanaIndex=`$EXPR $lanaIndex + 1` 
  done <$FNETBIOSCONF
  
  if [ -s $NBHOMEETC/error ]; then
    $RM -f $NBHOMEETC/error
    echo "\nNetBIOS warning: there are errors in the netbios.conf file"
  fi

}	# End bldNbconfig


matchfn()
{
    if echo $1 | grep -v "BROADCAST" >/dev/null 2>&1 ||
       echo $1 | grep -v "inet" >/dev/null 2>&1 ||
       echo $1 | grep "LOOPBACK" >/dev/null 2>&1 ||
       echo $1 | grep "PRIVATE" >/dev/null 2>&1
    then
	return 1
    fi

    return 0
}

GetSolAdapters()
{
  IFOUT=/tmp/ifout
  ILDINFO=/tmp/ildinfo
  PPA_FILE=/tmp/ppa_file
  > $PPA_FILE
  
  >$ILDINFO
  ( $IFCONFIG -au inet ; echo 'DONE' ) | while IFS='' read line; do
    if [ `expr "$line" : '^[ 	]'` -ne 1 -o "$line" = 'DONE' ]
    then
	if [ -n "$entry" ]
	then
	    if matchfn "$entry"
	    then
		echo "$entry" >>$ILDINFO
	    fi
	fi
	if [ "$line" = 'DONE' ]
	then
	    break
	fi
	entry="$line"
    else
	entry="$entry$line"
    fi
  done
  
  if [ -n "$entry" ]
  then
    if matchfn "$entry"
    then
      echo "$entry" >>$ILDINFO
    fi
  fi

  if [ -n "$CLSHOST" ]
  then
    HOSTNAMES="`$HAGET -f names_on_subnets -h "$CLSHOST"`"
    if [ -z "$HOSTNAMES" ]
    then
      echo "$CLSHOST is not a logical host supported on this cluster" >&2
      exit 2
    fi
    $GETENT hosts $HOSTNAMES | $CUT -f1 | $SED -e 's/^/inet /' -e 's/$/[ 	]/' >>$FTEMP3
  else
    echo '^[^:]*:[ ]' >$FTEMP3
  fi
    $EGREP -f $FTEMP3 $ILDINFO 2>/dev/null | nawk ' BEGIN{i=1;} {
    m = match( $1, ":$" );
    tkid = substr($1, 0, m-1);
    for (n=0; $(n) != "inet"; n++);
    print tkid ,"\t", i-1, "\tup\t-\tcsma\/cd\t-\t-\t-\t", $(n+1);
    i++; }'  >> $FTEMP1
    $CAT $FTEMP1 >> $PPA_FILE
    $RM -f $ILDINFO $FTEMP3
}


#********************************************************************
#                 Start of RECONFIG script                       
#********************************************************************

USAGE="Usage: $0 [ -c logical_host ]"

# Define signal handler
trap cleanup 1 2 3 15

NBHOMEETC=/etc/opt/SUNWlznb
CLSHOST=''

umask 022

while getopts c: c
do
    case $c in
    c )
	CLSHOST="$OPTARG";;
    \? )
	echo $USAGE
	exit 1
    esac
done
shift `expr $OPTIND - 1`


IFCONFIG=/usr/sbin/ifconfig

bldSUNprotocol 
#copy the temporary files on to original configuration files.
$CP $FNETBIOSCONFTMP $FNETBIOSCONF
$CP $HWCONFTMP $HWCONF

$RM -f $FNETBIOSCONFTMP $HWCONFTMP $FTEMP >/dev/null 2>&1

exit 0
